Very Secure FTP Daemon
install
sudo apt install vsftpd
sudo apt install db5.3-util yum install compat-db47
config
- 用户
- 本地用户
- 虚拟用户(需映射到一个本地用户/宿主)
- 匿名用户
- 连接模式
- 主动模式:客户端动态端口,服务器主动连接
- 被动模式:服务器动态端口,客户端主动连接
virtual users
1.创建虚拟用户名
添加虚拟用户名和密码,一行用户名,一行密码
mkdir -p /etc/vsftpd
vi /etc/vsftpd/virtusers
1 2 3 4
| ftp1 Mn30Bf68 ftp2 pz8sR2W6
|
使用db_load命令生成虚拟用户口令认证文件
1 2
| db5.3_load -T -t hash -f virtusers virtusers.db db_load -T -t hash -f virtusers virtusers.db
|
2.编辑PAM认证文件
/etc/pam.d/vsftpd
顶部插入规则。注释掉原有的规则
1 2
| auth required pam_userdb.so db=/etc/vsftpd/virtusers account required pam_userdb.so db=/etc/vsftpd/virtusers
|
3.建立本地映射用户并设置宿主目录权限
useradd -d /home/vftpuser -s /sbin/nologin vftpuser
sudo mkdir -p /home/vftpuser/data
sudo chown vftpuser /home/vftpuser/data
sudo chmod 755 /home/vftpuser #调整权限以允许浏览目录,目录归属于root
–sudo chmod 555 /home/vftpuser/data #chroot_local_user为真时要求虚拟根目录不能写权限
4.配置项
vi /etc/vsftpd.conf (ubuntu)
vi /etc/vsftpd/vsftpd.conf (centos)
https://linux.die.net/man/5/vsftpd.conf
vsftpd/vsftpd.conf.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| listen=YES #listen_port=2121 #ftp_data_port=2020 anonymous_enable=NO local_enable=YES #禁止本地用户登录 #虚拟用户需启用 write_enable=YES local_umask=022 chroot_local_user=YES # 限制用户离开指定的根目录 # vsftpd 版本 2.3.5 开始,如果用户的家目录是可写的,vsftpd 会拒绝运行,需启用 allow_writeable_chroot=YES # 允许chroot管理用户写操作,若为NO则用户根目录不能有写权限,需创建子目录 local_root=/home/ftp
# 默认Vsftpd.conf中不包含这些设定项目,需要自己手动添加配置 guest_enable=YES guest_username=vftpuser #设定虚拟用户配置 文件名必须和虚拟用户名相同 user_config_dir=/etc/vsftpd/vconf
|
5.设置虚拟用户个性配置
mkdir -p /etc/vsftpd/vconf
cd /etc/vsftpd/vconf
当virtual_use_local_privs=YES时,虚拟用户和本地用户有相同的权限;
当virtual_use_local_privs=NO时,虚拟用户和匿名用户有相同的权限,默认是NO。
vi ftp1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # 用户 test 配置目录 local_root=/home/vftpuser/data/ftp1
#0 本地用户同权 写权限(上传、下载、删除、重命名) write_enable=YES virtual_use_local_privs=YES
#1 只下载用户 virtual_use_local_privs=NO anon_upload_enable=NO
#2 只上传用户 virtual_use_local_privs=NO anon_world_readable_only=YES #限制下载other可读文件 anon_upload_enable=YES #上传
#3其他权限 anon_mkdir_write_enable=YES #创建文件夹 anon_other_write_enable=YES #删除和重命名文件
|
touch /home/vftpuser/vconf/ftp2 #空文件,用户只读
https://www.cnblogs.com/ssrs-wanghao/articles/13751408.html
6.重启服务
service vsftpd restart
systemctl enable vsftpd
systemctl restart vsftpd.service
systemctl start vsftpd.service
systemctl status vsftpd.service
7.连接
ftp ftp1@192.168.137.111
8.日志
/var/log/xferlog
自动清理历史文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #!/bin/bash set -euo pipefail
FTP_ROOT_DIR="/data/sftp" KEEP_DAYS=7 DELETE_EMPTY_DIRS=0
LOG_FILE="/var/log/ftp_cleanup_d" LOG_KEEP_DAYS=30
echo -e "\n===== $(date +'%Y-%m-%d %H:%M:%S') 开始执行FTP清理任务 =====" >> ${LOG_FILE}
echo "$(date +'%Y-%m-%d %H:%M:%S') 开始清理 ${LOG_KEEP_DAYS} 天前的日志..." >> ${LOG_FILE} TEMP_LOG=$(mktemp) grep "^$(date -d "-${LOG_KEEP_DAYS} days" +'%Y-%m-%d')" -A 99999 "${LOG_FILE}" > "${TEMP_LOG}" 2>/dev/null || true if [ -s "${TEMP_LOG}" ]; then mv "${TEMP_LOG}" "${LOG_FILE}" echo "$(date +'%Y-%m-%d %H:%M:%S') 日志清理完成:保留最近${LOG_KEEP_DAYS}天的内容" >> ${LOG_FILE} else rm -f "${TEMP_LOG}" echo "$(date +'%Y-%m-%d %H:%M:%S') 日志清理完成:无${LOG_KEEP_DAYS}天前的旧日志,无需清理" >> ${LOG_FILE} fi
if [ ! -d "${FTP_ROOT_DIR}" ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') 错误:FTP目录 ${FTP_ROOT_DIR} 不存在!" >> ${LOG_FILE} exit 1 fi
echo "$(date +'%Y-%m-%d %H:%M:%S') 开始清理 ${KEEP_DAYS} 天前的文件..." >> ${LOG_FILE} find "${FTP_ROOT_DIR}" -type f -mtime +${KEEP_DAYS} -print0 | while IFS= read -r -d '' file; do echo "$(date +'%Y-%m-%d %H:%M:%S') 清理文件:${file}" >> ${LOG_FILE} rm -f "${file}" || echo "$(date +'%Y-%m-%d %H:%M:%S') 警告:清理文件 ${file} 失败!" >> ${LOG_FILE} done
if [ ${DELETE_EMPTY_DIRS} -eq 1 ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') 开始清理空文件夹..." >> ${LOG_FILE} find "${FTP_ROOT_DIR}" -type d -empty -print0 | while IFS= read -r -d '' dir; do echo "$(date +'%Y-%m-%d %H:%M:%S') 删除空文件夹:${dir}" >> ${LOG_FILE} rmdir "${dir}" || echo "$(date +'%Y-%m-%d %H:%M:%S') 警告:删除空文件夹 ${dir} 失败!" >> ${LOG_FILE} done fi
echo "$(date +'%Y-%m-%d %H:%M:%S') 清理任务执行完成!" >> ${LOG_FILE}
|