vsftpd的搭建和使用-虚拟多用户配置
服务器环境
centos 7.6
安装ftp服务
安装 vsftpd
安装虚拟用户数据库
后面用到的 db_load 命令
1
| yum -y install libdb-utils
|
启动FTP服务
1
| systemctl start vsftpd.service
|
设置FTP服务开机自启动
1
| systemctl enable vsftpd.service
|
其它相关命令
1 2
| systemctl restart vsftpd.service # 重启服务 systemctl status vsftpd.service # 服务状态查看
|
查看FTP服务的端口号
1
| netstat -antup | grep ftp
|
增加一个系统用户
virftp
,所有虚拟用户都会映射到此用户后对文件系统进行读写操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 方法一(推荐): #添加用户,用户登录时使用 nologin(禁止用此用户名登陆服务器) useradd -s /sbin/nologin virftp
#设置用户密码(明文密码一次成功,不需要二次确认) #这种方式虽然简单,但是通过history命令可以查到用户的密码,所以不安全。 echo "123456" | passwd --stdin virftp
方法二: #添加用户,用户登录时使用nologin(禁止用此用户名登陆服务器) useradd -s /sbin/nologin virftp
#设置用户密码(执行命令后要输入两次密码) passwd virftp
|
配置vsftp主配置文件
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
| #题外话:过滤配置文件注释后内容并查看(相当于 cat /etc/vsftpd/vsftpd.conf 不显示注释) grep -v "#" /etc/vsftpd/vsftpd.conf
#重命名vsftpd主配置文件为vsftpd.conf.bak(推荐) mv /etc/vsftpd/vsftpd.conf{,.bak}
#或者备份vsftpd主配置文件 #cp /etc/vsftpd/vsftpd.conf{,.bak}
#新建vsftpd.conf并编辑 vim /etc/vsftpd/vsftpd.conf
#禁止匿名用户登录 anonymous_enable=NO #允许本地用户登录 local_enable=YES #启用虚拟账户 guest_enable=YES #把虚拟账户映射到系统账户virftp guest_username=virftp #使用虚拟用户验证(PAM验证)新建文件/etc/pam.d/vsftpd.pam(默认验证文件是/etc/pam.d/vsftpd) pam_service_name=vsftpd.pam #设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为它的配置文件) user_config_dir=/etc/vsftpd/vsftpd_viruser #启用chroot时,虚拟用户根目录允许写入 allow_writeable_chroot=YES #设置被动模式下,建立数据传输可使用的端口范围的最小值。 #建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。 pasv_min_port=50000 #设置被动模式下,建立数据传输可使用的端口范围的最大值。 pasv_max_port=50010
|
配置虚拟用户访问vsftpd服务
1 2 3 4 5 6
| #创建虚拟用户密码文件(奇数行为帐号,偶数行为密码) vim /etc/vsftpd/vir_user test01 pwd01 test02 pwd02
|
创建虚拟用户的根目录
要保证虚拟用户映射的系统用户,对这个根目录有读写权限
1 2 3 4 5 6 7 8 9 10 11 12 13
| #创建虚拟用户对应根目录 #方法一(推荐): mkdir -p /home/virftp/{test01,test02}
#方法二: mkdir -p /home/virftp/test01 /home/virftp/test02
# #1、使用mkdir在同目录下创建多个目录: # mkdir /tmp/{proc,etc,home,usr}
#2、使用mkdir同时在多目录下创建多目录: # mkdir /tmp/{proc/{1,2,3},etc/{4,5,6},home/dir}
|
修改目录权限
1 2 3 4 5 6
| #方法一(推荐): chown -R virftp.virftp /home/virftp/{test01,test02}
#方法二: chown -R virftp.virftp /home/virftp/test01 chown -R virftp.virftp /home/virftp/test02
|
配置虚拟用户各自的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #创建‘虚拟用户配置文件’的存放目录 mkdir /etc/vsftpd/vsftpd_viruser/
#创建和配置虚拟用户各自的配置文件(文件名称是‘虚拟用户名’) vim /etc/vsftpd/vsftpd_viruser/test01 # 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录,即登录ftp后访问的根目录) local_root=/home/virftp/test01 # 允许写入 write_enable=YES #允许浏览FTP目录和下载 anon_world_readable_only=NO #禁止用户下载 #download_enable=NO # 允许虚拟用户上传文件 anon_upload_enable=YES # 允许虚拟用户创建目录 anon_mkdir_write_enable=YES # 允许虚拟用户执行其他操作(如改名、删除) anon_other_write_enable=YES # 上传文件的掩码,如022时,上传目录权限为755,文件权限为644 anon_umask=022
|
生成虚拟用户数据库
1 2
| db_load -T -t hash -f /etc/vsftpd/vir_user /etc/vsftpd/vir_user.db chmod 700 /etc/vsftpd/vir_user.db
|
配置vsftpd验证文件
默认验证文件 /etc/pam.d/vsftpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 方法一(推荐): #新建验证文件 touch /etc/pam.d/vsftpd.pam
# #touch /home/virftp/test02/test{01..10}.txt
# 使用命令在文件后追加(-e 参数,把\n当作换行处理,而不是当成字符串) echo -e "auth required pam_userdb.so db=/etc/vsftpd/vir_user\naccount required pam_userdb.so db=/etc/vsftpd/vir_user" >> /etc/pam.d/vsftpd.pam
方法二: #新建验证文件,并添加如下两行 vim /etc/pam.d/vsftpd.pam auth required pam_userdb.so db=/etc/vsftpd/vir_user account required pam_userdb.so db=/etc/vsftpd/vir_user
|
重启服务
1
| systemctl restart vsftpd
|
总结
若添加新虚拟用户,则需要做以下5件事:
1、创建虚拟用户对应根目录文件夹并修改目录权限
2、在/etc/vsftpd/vsftpd_viruser/目录下创建配置文件(文件名为虚拟用户名)
3、在/etc/vsftpd/vir_user文件中添加帐号及密码
4、再次执行生成虚拟用户数据库
db_load -T -t hash -f /etc/vsftpd/vir_user /etc/vsftpd/vir_user.db
5、重启vsftpd服务
systemctl restart vsftpd
异常问题
1、为目录设置权限,不然无法对目录进行操作
chmod -R 777 /var/ftp/test2
2、将ftpuser添加到chroot_list中,连接ftp,提示530 Login incorrect,连接失败。但是创建的普通账号就可以正常登陆。
解决方法:很多提供对系统非登录访问的守护进程(如FTP)会检查用户的登录shell是否列在/etc/shells中,如果没有列出,守护进程就会拒绝访问(这正是您所需要的动作)。
打开 /etc/shells后,发现确实没有/sbin/nologin这一行,添加上再次登陆,成功。
使用命令在文件后追加
1
| echo "/sbin/nologin" >> /etc/shells
|
vsftp配置文件及参数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| /etc/vsftpd目录下文件说明如下: /etc/vsftpd/vsftpd.conf是vsftpd的核心配置文件。 /etc/vsftpd/ftpusers是黑名单文件,此文件中的用户不允许访问FTP服务器。 /etc/vsftpd/user_list是白名单文件,此文件中的用户允许访问FTP服务器。 配置文件vsftpd.conf参数说明如下: 用户登录控制参数说明如下表所示。 参数 说明 anonymous_enable=YES 接受匿名用户 no_anon_password=YES 匿名用户login时不询问口令 anon_root=(none) 匿名用户主目录 local_enable=YES 接受本地用户 local_root=(none) 本地用户主目录 用户权限控制参数说明如下表所示。 参数 说明 write_enable=YES 可以上传文件(全局控制) local_umask=022 本地用户上传的文件权限 file_open_mode=0666 上传文件的权限配合umask使用 anon_upload_enable=NO 匿名用户可以上传文件 anon_mkdir_write_enable=NO 匿名用户可以建目录 anon_other_write_enable=NO 匿名用户修改删除 chown_username=lightwiter 匿名上传文件所属用户名
|
附件(sh执行文件)
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
| #!/bin/sh echo "Centos7.6搭建和使用 vsftpd - 虚拟多用户配置"
echo "一、安装ftp服务"
yum install -y vsftpd
systemctl start vsftpd.service
systemctl enable vsftpd.service
shijian=`date "+%Y-%m-%d_%H:%M:%S"`
sys_user="ljs"
vir_user_01="user01" vir_pwd_01="pwd01" vir_user_01_conf_filename=$vir_user_01 vir_user_01_ftp_dir="/home/abc/ftp01"
vir_user_02="user02" vir_pwd_02="pwd02" vir_user_02_conf_filename=$vir_user_02 vir_user_02_ftp_dir="/home/abc/ftp02"
ftp_conf_file="/etc/vsftpd/vsftpd.conf"
vir_user_pwd_file="/etc/vsftpd/vir_user.pwd"
vir_user_conf_dir="/etc/vsftpd/vsftpd_viruser"
pasv_min_port=50000 pasv_max_port=50010
verify_file="/etc/pam.d/vsftpd.pam"
vir_user_db_file="/etc/vsftpd/vir_user_database.db"
echo "二、增加一个系统用户${sys_user} ,所有虚拟用户都会映射到此用户后对文件系统进行读写操作"
useradd -s /sbin/nologin ${sys_user}
echo "123456" | passwd --stdin ${sys_user}
echo "三、配置vsftp主配置文件"
mv ${ftp_conf_file}{,.bak}
cat > ${ftp_conf_file} << EOF #文件生成时间 #${shijian} #开启被动模式。 pasv_enable=YES #禁止匿名用户登录 anonymous_enable=NO #允许本地用户登录 local_enable=YES #启用虚拟账户 guest_enable=YES #把虚拟账户映射到系统账户${sys_user} guest_username=${sys_user} # guest_username=www # 如果ftp目录是指向网站根目录,用来上传网站程序, # 可以指定虚拟用户的宿主用户为nginx运行账户www,可以避免很多权限设置问题 #使用虚拟用户验证(PAM验证)新建文件${verify_file}(默认验证文件是/etc/pam.d/vsftpd) pam_service_name=$(basename $verify_file) #设置存放各虚拟用户配置文件的目录(此目录下与虚拟用户名相同的文件为它的配置文件) user_config_dir=${vir_user_conf_dir} #启用chroot时,虚拟用户根目录允许写入 allow_writeable_chroot=YES #设置被动模式下,建立数据传输可使用的端口范围的最小值。 #建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。 pasv_min_port=${pasv_min_port} #设置被动模式下,建立数据传输可使用的端口范围的最大值。 pasv_max_port=${pasv_max_port} EOF
echo "四、配置虚拟用户访问vsftpd服务"
cat > ${vir_user_pwd_file} << EOF ${vir_user_01} ${vir_pwd_01} ${vir_user_02} ${vir_pwd_02} EOF
echo "五、创建虚拟用户的根目录,要保证虚拟用户映射的系统用户,对这个根目录有读写权限"
mkdir -p {$vir_user_01_ftp_dir,$vir_user_02_ftp_dir}
chown -R ${sys_user}.${sys_user} {$vir_user_01_ftp_dir,$vir_user_02_ftp_dir}
echo "六、配置虚拟用户各自的配置文件"
mkdir ${vir_user_conf_dir}
cat > ${vir_user_conf_dir}/${vir_user_01_conf_filename} << EOF # 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录,即登录ftp后访问的根目录) local_root=${vir_user_01_ftp_dir} # 允许写入 write_enable=YES #允许浏览FTP目录和下载 anon_world_readable_only=NO #禁止用户下载 #download_enable=NO # 允许虚拟用户上传文件 anon_upload_enable=YES # 允许虚拟用户创建目录 anon_mkdir_write_enable=YES # 允许虚拟用户执行其他操作(如改名、删除) anon_other_write_enable=YES # 上传文件的掩码,如022时,上传目录权限为755,文件权限为644 anon_umask=022 EOF
cat > ${vir_user_conf_dir}/${vir_user_02_conf_filename} << EOF # 指定虚拟用户的虚拟目录(虚拟用户登录后的主目录,即登录ftp后访问的根目录) local_root=${vir_user_02_ftp_dir} # 允许写入 write_enable=YES #允许浏览FTP目录和下载 anon_world_readable_only=NO #禁止用户下载 #download_enable=NO # 允许虚拟用户上传文件 anon_upload_enable=YES # 允许虚拟用户创建目录 anon_mkdir_write_enable=YES # 允许虚拟用户执行其他操作(如改名、删除) anon_other_write_enable=YES # 上传文件的掩码,如022时,上传目录权限为755,文件权限为644 anon_umask=022 EOF
echo "七、生成虚拟用户数据库" db_load -T -t hash -f ${vir_user_pwd_file} ${vir_user_db_file} chmod 700 ${vir_user_db_file}
echo "八、配置vsftpd验证文件(默认验证文件 /etc/pam.d/vsftpd)"
echo -e "auth required pam_userdb.so db=${vir_user_db_file%.*}\naccount required pam_userdb.so db=${vir_user_db_file%.*}" > ${verify_file}
echo "九、重启服务并查看vsftpd服务状态" systemctl restart vsftpd.service systemctl status vsftpd.service
|