一、什么是VSFTPD服务
VSFTPD(Very Secure FTP Daemon) 是一种专为类Unix系统(如Linux、BSD、Solaris等)设计的高安全性、轻量级FTP服务器软件。
VSFTPD服务监听端口分为:
TCP21:指令通道
TCP20:数据通道
工作原理:
(1)被动模式:默认
当客户端访问FTP服务器端,首先会尝试连接服务器端TCP 21端口,建立命令通道,服务器端会随机开启一个数据端口(>1024端口),客户端会尝试连接服务器端数据通道,从而建立数据连接。
(2)主动模式:
当客户端访问FTP服务器端21端口时,建立命令通道,此时客户端开启一个随机端口,服务器端用
20端口去连接客户端随机端口,从而建立数据通道,主动模式使用一般在局域网内,跨网络一般防火墙会阻挡。
二、安装vsftpd服务
[root@web2 ~]# yum install -y vsftpd
配置文件
[root@web2 ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers //类似于黑名单
/etc/vsftpd/user_list //使用userlist_deny=NO时,此文件为白名单;
默认为userlist_deny=YES,也是类似于黑名单
/etc/vsftpd/vsftpd.conf //主配置文件
三、匿名用户、本地用户、虚拟用户配置方式
(1)匿名用户
1、配置VSFTPD主配置文件/etc/vsftpd/vsftpd.conf
[root@web2 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES ##开启匿名访问
anon_upload_enable=YES ##允许匿名上传
anon_mkdir_write_enable=YES ##允许匿名创建文件夹
anon_other_write_enable=YES ##允许匿名用户删除、修改目录
anon_umask=022 ##匿名用户上传文件默认的权限掩码
pasv_min_port=16000 ##数据传输随机最小端口
pasv_max_port=16100 ##数据传输随机最大端口
2、重启VSFTPD服务
[root@web2 ~]# systemctl restart vsftpd
[root@web2 ~]# chmod 777 /var/ftp/pub/
3、客户端测试
[root@localhost ~]# ftp 192.168.10.201
Connected to 192.168.10.201 (192.168.10.201).
220 (vsFTPd 3.0.3)
Name (192.168.10.201:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,10,201,172,208).
150 Here comes the directory listing.
drwxrwxrwx 2 0 0 20 Apr 12 03:42 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir test ##匿名创建文件夹
257 "/pub/test" created
ftp> rename test test1 ##匿名用户重命名文件夹
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,10,201,174,212).
150 Here comes the directory listing.
-rw------- 1 14 50 2598 Apr 12 03:42 passwd
drwxr-xr-x 2 14 50 6 Apr 12 04:32 test1
226 Directory send OK.
ftp> put /etc/shadow shadow ##匿名上传文件
local: /etc/shadow remote: shadow
227 Entering Passive Mode (192,168,10,201,97,111).
150 Ok to send data.
226 Transfer complete.
1360 bytes sent in 3.4e-05 secs (40000.00 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,10,201,247,58).
150 Here comes the directory listing.
-rw------- 1 14 50 2598 Apr 12 03:42 passwd
-rw-r--r-- 1 14 50 1360 Apr 12 04:33 shadow
drwxr-xr-x 2 14 50 6 Apr 12 04:32 test1
226 Directory send OK.
(2)本地用户
允许使用本地用户登录,且用户登录默认到/data/ftp目录中,仅允许user1和user2用户登录,其他用户不可以登录该FTP服务器,用户登录时不能跳出FTP目录。
1、配置VSFTPD主配置文件/etc/vsftpd/vsftpd.conf
[root@web2 ~]# mkdir /data/ftp
[root@web2 ~]# vim /etc/vsftpd/vsftpd.conf
local_enable=YES ##允许使用本地用户登录
local_root=/data/ftp ##本地用户登录目录
write_enable=YES ##允许本地用户写
local_umask=077 ##本地用户上传文件默认的权限掩码
chroot_local_user=YES ##限制用户跳出登录目录
userlist_deny=NO ##/etc/vsftpd/user_list文件为白名单
[root@web2 ~]# useradd user1
[root@web2 ~]# useradd user2
[root@web2 ~]# useradd user3
[root@web2 ~]# echo redhat |passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@web2 ~]# echo redhat |passwd --stdin user2
Changing password for user user2.
passwd: all authentication tokens updated successfully.
[root@web2 ~]# echo redhat |passwd --stdin user3
Changing password for user user3.
passwd: all authentication tokens updated successfully.
2、添加白名单,仅允许user1和user2用户登录
[root@web2 ~]# vim /etc/vsftpd/user_list
user1
user2
当/etc/vsftpd/ftpusers和/etc/vsftpd/user_list两个文件中同时存在一个用户时,会拒绝该用户登录,黑名单大于白名单
3、重启服务并客户端测试
[root@web2 ~]# systemctl restart vsftpd
[root@web2 ~]# mkdir /data/ftp/test
[root@web2 ~]# setfacl -m u:user1:rwx /data/ftp/test/
[root@web2 ~]# setfacl -m u:user2:rwx /data/ftp/test/
///到客户端测试
##user1测试
[root@localhost ~]# lftp 192.168.10.201
lftp 192.168.10.201:~> user user1
Password:
lftp user1@192.168.10.201:~> cd test/
lftp user1@192.168.10.201:/test> mkdir user1
mkdir ok, `user1' created
lftp user1@192.168.10.201:/test> put /etc/passwd
2598 bytes transferred
lftp user1@192.168.10.201:/test> ls
-rw------- 1 1001 1001 2598 Apr 12 04:59 passwd
drwx------ 2 1001 1001 6 Apr 12 04:59 user1
##user2测试
[root@localhost ~]# lftp 192.168.10.201
lftp 192.168.10.201:~> user user2
Password:
lftp user2@192.168.10.201:~> cd test/
lftp user2@192.168.10.201:/test> ls
-rw------- 1 1001 1001 2598 Apr 12 04:59 passwd
drwx------ 2 1001 1001 6 Apr 12 04:59 user1
##user3测试
[root@localhost ~]# ftp 192.168.10.201
Connected to 192.168.10.201 (192.168.10.201).
220 (vsFTPd 3.0.3)
Name (192.168.10.201:root): user3
530 Permission denied.
Login failed.
ftp>
(3)虚拟用户
1、创建虚拟用户数据库
[root@web2 ~]# useradd vuser ##创建一个用户和虚拟用户进行对应
[root@web2 ~]# chmod 755 /home/vuser # 确保目录可访问
[root@web2 ~]# cd /etc/vsftpd/
[root@web2 vsftpd]# vim logins.txt
admin1
redhat
admin2
redhat
[root@web2 vsftpd]# db_load -T -t hash -f logins.txt /etc/vsftpd/login.db
[root@web2 vsftpd]# chmod 600 /etc/vsftpd/login.db
2、创建一个使用新数据库的PAM文件。
[root@web2 ~]# vim /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login
3、修改vsftpd服务主配置文件。
[root@web2 ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES ##启动虚拟用户
guest_username=vuser ##设置虚拟用户和本地vuser用户绑定
allow_writeable_chroot=YES ##允许创建文件.
user_config_dir=/etc/vsftpd/vuser_conf # 用户独立配置目录
[root@web2 ~]# mkdir /etc/vsftpd/vuser_conf
4、配置虚拟用户权限。
定义用户权限文件,每个虚拟用户对应一个文件(如/etc/vsftpd/vuser_conf/admin1):
[root@web2 ~]# cd /etc/vsftpd/vuser_conf/
[root@web2 vuser_conf]# vim admin1
write_enable=YES ##允许写权限
anon_upload_enable=YES ##允许上传
anon_mkdir_write_enable=YES ##允许创建目录
anon_other_write_enable=YES ##允许删除、修改目录
5、重启服务并客户端测试。
[root@web2 ~]# systemctl restart vsftpd
///客户端测试
###虚拟用户admin1测试
[root@localhost ~]# lftp 192.168.10.201
lftp 192.168.10.201:~> user admin1
Password:
lftp admin1@192.168.10.201:~> ls
-rw-r--r-- 1 1004 1004 1360 Apr 12 05:50 shadow
lftp admin1@192.168.10.201:/> mkdir 1
mkdir ok, `1' created
lftp admin1@192.168.10.201:/> mv 1 2
rename successful
lftp admin1@192.168.10.201:/> ls
drwx------ 2 1004 1004 6 Apr 12 05:59 2
-rw-r--r-- 1 1004 1004 1360 Apr 12 05:50 shadow
lftp admin1@192.168.10.201:/> rm -r 2
rm ok, `2' removed
lftp admin1@192.168.10.201:/> ls
-rw-r--r-- 1 1004 1004 1360 Apr 12 05:50 shadow
lftp admin1@192.168.10.201:/> put /etc/passwd
2598 bytes transferred
lftp admin1@192.168.10.201:/> ls
-rw------- 1 1004 1004 2598 Apr 12 06:00 passwd
-rw-r--r-- 1 1004 1004 1360 Apr 12 05:50 shadow
###虚拟用户admin2测试
[root@localhost ~]# lftp 192.168.10.201
lftp 192.168.10.201:~> user admin2
Password:
lftp admin2@192.168.10.201:~> ls
-rw------- 1 1004 1004 2598 Apr 12 06:00 passwd
-rw-r--r-- 1 1004 1004 1360 Apr 12 05:50 shadow
lftp admin2@192.168.10.201:/> put /etc/group
put: /etc/group: Access failed: 550 Permission denied. (group)
lftp admin2@192.168.10.201:/> mkdir admin2
mkdir: Access failed: 550 Permission denied. (admin2)
lftp admin2@192.168.10.201:/> rm passwd
rm: Access failed: 550 Permission denied. (passwd)