vsftpd 是常用的ftp软件, 用在服务端,通常安装在 类UNIX系统中,最大的特点就是安全。接触这个软件时间不短了,一直对vsftpd的虚拟用户管理不是很理解,这才花点时间,配置了一遍。现在整理如下。
具体的配置可以查看 vsftpd虚拟用的配置
vsftpd 的安装
整个安装过程比较简单,软件很小。安装也很快
yum -y install vsftpd
vsftpd 虚拟用的配置
所谓虚拟用户,就是不是真正的用户。这里说的真正的用户是系统用户,或者叫做本地用户。比如root , 使用 useradd 创建的用户。虚拟用户要是能访问或者修改文件,必须对应一个系统用户。真正对文件的操作,都是有这个系统用户来完成。
本次的配置,就是多个虚拟用户对应了同一个系统用户 vftpuser, 所以配置的时候有两个地方比较重要。
# 虚拟用户对应的系统用户是 vftpuser
guest_username=vftpuser
虚拟用的和宿主用户有同样的权限
virtual_use_local_privs=YES
除去虚拟用户和系统用户的处理问题上,还有个重要的问题,就是虚拟用户的认证问题。 这里通过 pam 方式,可以通过 db_load 创建虚拟用户文件,然后在 vsftpd 配置文件通过 pam 验证。下面给出相关的配置
# file /etc/vsftpd.conf 使用 pam 验证
pam_service_name=vsftpd
# 文件 /etc/vsftpd/vftpuser,就是通过 db_load 生成的虚拟用文件,包含用户和密码
cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser
最后一个文件就是vsftpd的使用文件,包括一些权限的设置。 通过一个脚本文件来详细 说明一下。
#!/bin/bash
# ftp 服务器搭建
# 安装ftp
yum -y install vsftpd
# 创建主用户 vftpuser
FTPUSER=/home/vftpuser
useradd -d FTPUSER -s /usr/sbin/nologin vftpuser
chmod 500FTPUSER
### 创建测试用户的宿主目录
mkdir -p /home/vftpuser/shelljiaoben/webroot
chmod 500 /home/vftpuser/shelljiaoben
chown -R vftpuser:vftpuser /home/vftpuser
# 禁止匿名用户登陆,匿名用户的用户名 anonymous
# 修改配置文件
sed -i '/^anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
sed -i '/^write_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
sed -i '/^#chroot_local_user/achroot_local_user=YES' /etc/vsftpd/vsftpd.conf
sed -i '/^#chroot_list_enable/achroot_list_enable=NO' /etc/vsftpd/vsftpd.conf
sed -i '/chroot_list_file/s/#//' /etc/vsftpd/vsftpd.conf
sed -i '/pam_service_name/d' /etc/vsftpd/vsftpd.conf
sed -i '/userlist_enable/d' /etc/vsftpd/vsftpd.conf
sed -i 'auserlist_enable=NO' /etc/vsftpd/vsftpd.conf
sed -i 'a#userlist_deny=NO' /etc/vsftpd/vsftpd.conf
sed -i 'auser_config_dir=/etc/vsftpd/vsftpd_user_conf' /etc/vsftpd/vsftpd.conf
sed -i 'a# 启用虚拟用户' /etc/vsftpd/vsftpd.conf
sed -i 'aguest_enable=YES' /etc/vsftpd/vsftpd.conf
sed -i 'apam_service_name=vsftpd' /etc/vsftpd/vsftpd.conf
sed -i 'aguest_username=vftpuser' /etc/vsftpd/vsftpd.conf
sed -i 'a# 虚拟用的和宿主用户有同样的权限' /etc/vsftpd/vsftpd.conf
sed -i 'avirtual_use_local_privs=YES' /etc/vsftpd/vsftpd.conf
sed -i 'a# -doc begin -' /etc/vsftpd/vsftpd.conf
sed -i 'a# 当userlist_enable = NO, ftpusers 文件中的用户禁止访问 ftp 服务器' /etc/vsftpd/vsftpd.conf
sed -i 'a# 当userlist_enable = YES , userlist_deny = NO, 仅仅允许 user_list中的用户访问' /etc/vsftpd/vsftpd.conf
sed -i 'a# 当userlist_enable = YES, userlist_deny = YES , ftpuser, user_list 都不能访问ftp 服务器' /etc/vsftpd/vsftpd.conf
sed -i 'a# chroot_local_user = YES && chroot_local_user = YES 出去文件chroot_list 都限制' /etc/vsftpd/vsftpd.conf
sed -i 'a# chroot_local_user = YES && chroot_local_user = NO 全部被限制' /etc/vsftpd/vsftpd.conf
sed -i 'a# chroot_local_user = NO && chroot_local_user = YES 仅仅限制 chroot_list' /etc/vsftpd/vsftpd.conf
sed -i 'a# chroot_local_user = NO && chroot_local_user = NO 全部不限制' /etc/vsftpd/vsftpd.conf
sed -i 'a# -- doc end --' /etc/vsftpd/vsftpd.conf
# 创建虚拟用户文本文件
cat >> /etc/vsftpd/vftpuser.txt <<EOT
shelljiaoben
123456
EOT
# 生成数据库文件
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
# 修改pam配置文件
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak.`date "+%Y-%m-%d"`
cat >> /etc/pam.d/vsftpd <<EOT
#auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
#account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser
EOT
# 填写虚拟用户的权限
mkdir -p /etc/vsftpd/vsftpd_user_conf
cat >> /etc/vsftpd/vsftpd_user_conf/shelljiaoben <<EOT
#虚拟用户的根目录,需要预先建立并赋予相应权限
local_root=/home/vftpuser/shelljiaoben
#开放虚拟用户的写权限
write_enable=YES
#开放虚拟用户的下载权限
anon_world_readable_only=YES
#开放虚拟用户的上传权限
anon_upload_enable=YES
#开放虚拟用户创建目录的权限
anon_mkdir_write_enable=YES
#禁止虚拟用户删除、重命名目录和文件
anon_other_write_enable=NO
EOT
service vsftpd start
创建用户的脚本
#!/bin/bash
#
# 脚本需要两个参数
#
# 第一个是 用户名,
# 第二个参数是用户的密码,用户的密码是可选的
#
#set -x
# 检查 mkpasswd 命令是否存在
type mkpasswd &> /dev/null || yum -y install expect
# 保证有且仅有只有一个参数
if [ # -eq 0 ]; then
echo "必须加上用户名字, 用户第一个必须是字母和数字组成,第一个字符不能是数字,长度不能超过20个字符";
exit -2;
fi
# U 用户名
U=1
# P password
P=2
# 用户必须有数字和字幕组成,第一个必须是字幕
echoU | grep -E "^[a-zA-Z][a-zA-Z0-9]{1,19}" &> /dev/null
if [ 0 -ne ? ]; then
echo "用户第一必须是字母,长度不能超过20";
exit -1;
fi
P='' # 禁止用户自定义密码,随机生成更安全
# 密码 如果创建的时候, 没有指定密码,就生成一个密码
if [ -z "P" ]; then
# 密码的长度是 12, 保证至少两个数字,两个小写字母,两个大写字母, 两个特殊符号
P=`mkpasswd -l 12 -d 2 -c 2 -C 2 -s 2`
fi
# 添加 用户名和密码
echo U >> /etc/vsftpd/vftpuser.txt
echoP >> /etc/vsftpd/vftpuser.txt
# 生成数据文件
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
# 生成用户的工作目录
BASEDIR=`cat /etc/passwd | grep vftpuser | awk -F ":" '{print (NF-1)}'`
mkdir -pBASEDIR/U/webroot
mkdir -pBASEDIR/U/backup
mkdir -pBASEDIR/U/myfolder
chown -R vftpuser:vftpuserBASEDIR/U
chmod 500BASEDIR/U
cat >>BASEDIR/U/info.txt << EOT
创建的日期是: `date "+%Y-%m-%d %H:%M:%S"`
用户名:U
密 码: P
EOT
# 创建信息,虚拟用户不可读
chmod 600BASEDIR/U/info.txt
# 默认的用户权限
cat >> /etc/vsftpd/vsftpd_user_conf/U <<EOT
#虚拟用户的根目录,需要预先建立并赋予相应权限
local_root=/home/vftpuser/U
#开放虚拟用户的写权限
write_enable=YES
#开放虚拟用户的下载权限
anon_world_readable_only=YES
#开放虚拟用户的上传权限
anon_upload_enable=YES
#开放虚拟用户创建目录的权限
anon_mkdir_write_enable=YES
#禁止虚拟用户删除、重命名目录和文件
anon_other_write_enable=NO
EOT
## 显示用的创建的信息
IP=`ifconfig | grep inet | grep -v "inet 127" | grep -v "inet 10\." | awk '{ print2}'`
echo "############# ftp 信息 ################"
echo "IP地址: IP"
echo "用户名:U"
echo "密 码: $P"
echo "#######################################"
# 关闭调试
#set +x
return 0