CentOS 上 vsftpd 的自动化管理工具与方案
一、工具与方案总览
二、Shell 脚本一键化示例
#!/usr/bin/env bash
set -e
# 0) 参数
FTP_USER=${1:-ftpuser}
FTP_PASS=${2:-ChangeMeNow!}
FTP_DIR=${3:-/home/$FTP_USER}
# 1) 安装
yum install -y vsftpd
# 2) 基础安全配置
cat >/etc/vsftpd/vsftpd.conf <<'EOF'
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
chroot_local_user=YES
allow_writeable_chroot=YES
EOF
# 3) 创建系统用户(禁止登录 shell)
useradd -m -d "$FTP_DIR" -s /sbin/nologin "$FTP_USER"
echo "$FTP_USER:$FTP_PASS" | chpasswd
echo "$FTP_USER" >/etc/vsftpd/user_list
chown -R "$FTP_USER:$FTP_USER" "$FTP_DIR"
chmod 755 "$FTP_DIR"
# 4) 防火墙放行 FTP
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
# 5) 启动与自启
systemctl enable --now vsftpd
echo "vsftpd 已安装并启动,用户:$FTP_USER"
三、Ansible 批量自动化示例
---
- name: Deploy and manage vsftpd on CentOS
hosts: ftp_servers
become: yes
vars_files:
- vars/main.yml
tasks:
- name: Install vsftpd
yum:
name: vsftpd
state: present
- name: Render config
template:
src: templates/vsftpd.conf.j2
dest: /etc/vsftpd/vsftpd.conf
notify: restart vsftpd
- name: Create FTP user
user:
name: "{{ ftp_user }}"
home: "{{ ftp_home }}"
shell: /sbin/nologin
create_home: yes
state: present
- name: Set directory ownership
file:
path: "{{ ftp_home }}"
owner: "{{ ftp_user }}"
group: "{{ ftp_user }}"
mode: '0755'
- name: Add user to allow list
lineinfile:
path: /etc/vsftpd/user_list
line: "{{ ftp_user }}"
create: yes
- name: Open FTP in firewalld
firewalld:
service: ftp
permanent: yes
state: enabled
immediate: yes
- name: Ensure service enabled and started
service:
name: vsftpd
state: started
enabled: yes
handlers:
- name: restart vsftpd
service:
name: vsftpd
state: restarted
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
chroot_local_user=YES
allow_writeable_chroot=YES
{% if ftp_tls_enabled | default(false) %}
ssl_enable=YES
ssl_cert_file={{ ftp_tls_cert }}
ssl_key_file={{ ftp_tls_key }}
{% endif %}
ftp_user: ftpuser
ftp_home: /home/ftpuser
ftp_tls_enabled: true
ftp_tls_cert: /etc/pki/tls/certs/vsftpd.crt
ftp_tls_key: /etc/pki/tls/private/vsftpd.key
四、自动化例行任务与安全加固
# 备份脚本 /usr/local/bin/ftp_backup.sh
WEB_DIR="/home/www"
DB_USER="dbuser"
DB_PASS="dbpass"
FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASS="ftppass"
BACKUP_DIR="/backup/ftp_$(date +%F)"
mkdir -p "$BACKUP_DIR"
tar czf "$BACKUP_DIR/web_$(date +%Y%m%d).tar.gz" -C "$WEB_DIR" .
mysqldump -u"$DB_USER" -p"$DB_PASS" dbname > "$BACKUP_DIR/sql_$(date +%Y%m%d).sql"
ftp -n "$FTP_HOST" <<EOF
open $FTP_HOST
user $FTP_USER $FTP_PASS
binary
mkdir $(date +%F)
cd $(date +%F)
mput $BACKUP_DIR/*.tar.gz
mput $BACKUP_DIR/*.sql
bye
EOF
# 清理本地 7 天前
find /backup -type f -mtime +7 -delete