# Vsftp 服务实践
# 一、VSFTP 概述
FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet 上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式。
VSFTP 是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,它的全称是 Very Secure FTP,从名称定义上基本可以看出,这是为了解决 ftp 传输安全性问题的。
# 二、VSFTP 工作模式
# 2.1 Port 模式
FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT 命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据。FTP server 必须和客户端建立一个新的连接用来传送数据。
![1.jpg]()
# 2.2 Passive 模式
FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送 Pasv 命令。服务器收到 Pasv 命令后,打开一个临时端口(端口大于 1023 小于 65535)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP 服务器的临时端口,然后 FTP 服务器将通过这个端口传输数据。
![2.jpg]()
# 三、VSFTP 部署
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| |
| |
| [root@vsftp ~] |
| -rw------- 1 root root 125 Jun 10 2021 ftpusers |
| -rw------- 1 root root 361 Jun 10 2021 user_list |
| -rw------- 1 root root 5116 Jun 10 2021 vsftpd.conf |
| -rwxr--r-- 1 root root 338 Jun 10 2021 vsftpd_conf_migrate.sh |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| 15:05:40.187871 IP 192.168.40.1.54319 > 192.168.40.50.21: Flags [P.], seq 1:14, ack 21, win 1023, length 13: FTP: USER xuyong |
| 0x0000: 4500 0035 36d8 4000 8006 f266 c0a8 2801 E..56.@....f..(. |
| 0x0010: c0a8 2832 d42f 0015 b46e 2af8 bd8d d6ef ..(2./...n*..... |
| 0x0020: 5018 03ff 8100 0000 5553 4552 2078 7579 P.......USER.xuy |
| 0x0030: 6f6e 670d 0a ong.. |
| 15:05:40.188149 IP 192.168.40.1.54319 > 192.168.40.50.21: Flags [P.], seq 14:27, ack 55, win 1023, length 13: FTP: PASS 123456 |
| 0x0000: 4500 0035 36db 4000 8006 f263 c0a8 2801 E..56.@....c..(. |
| 0x0010: c0a8 2832 d42f 0015 b46e 2b05 bd8d d711 ..(2./...n+..... |
| 0x0020: 5018 03ff 27a9 0000 5041 5353 2031 3233 P...'...PASS.123 |
| 0x0030: 3435 360d 0a 456.. |
# 四、登录验证方式
1. 匿名用户验证:
- 用户账号名称:ftp 或 anonymous
- 用户账号密码:无密码
- 工作目录:/var/ftp
- 默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)
2. 本地用户验证:
- 用户账号名称:本地用户(/etc/passwd)
- 用户账号密码:用户密码(/etc/shadow)
- 工作目录:登录用户的家目录
- 权限:最大权限(drwx------)
3. 虚拟(virtual)用户验证:
- 创建虚拟用户用来代替本地用户,减少本地用户曝光率
- 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
- 能够设置严格的权限(为每一个用户生成单独的配置文件)
# 五、VSFTP 配置文件详解
# 5.1 VSFTP 默认配置文件
- 允许匿名用户和本地用户登陆。anonymous_enable=YES 、local_enable=YES
- 匿名用户使用的登陆名为 ftp 或 anonymous,口令为空;匿名用户不能离开匿名用户家目录 /var/ftp,且只能下载不能上传。
- 本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传 / 下载。write_enable=YES
- 写在文件 /etc/vsftpd.ftpusers 中的本地用户禁止登陆。
| [root@vsftp ~] |
| anonymous_enable=YES |
| 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=NO |
| listen_ipv6=YES |
| pam_service_name=vsftpd |
| userlist_enable=YES |
| tcp_wrappers=YES |
# 5.2 常用全局配置
# 5.2.1 匿名用户(anonymous)设置
| anonymous_enable=YES |
| |
| |
| write_enable=YES |
| |
| |
| no_anon_password=NO |
| |
| |
| ftp_username=ftp |
| |
| |
| anon_root=/var/ftp |
| |
| |
| anon_upload_enable=NO |
| |
| |
| anon_world_readable_only=YES |
| |
| |
| anon_mkdir_write_enable=NO |
| |
| |
| anon_other_write_enable=NO |
| |
| |
| chown_uploads=NO |
| |
| |
| chown_username=username |
| |
| |
| anon_umask=077 |
| |
| |
| deny_email_enable=NO |
| |
| |
| banned_email_file=/etc/vsftpd/banner_emails |
| |
# 5.2.2 本地用户设置
| local_enable=YES/NO(YES) |
| |
| |
| local_root=/home/username |
| |
| |
| write_enable=YES/NO(YES) |
| |
| |
| local_umask=022 |
| |
| |
| file_open_mode=0755 |
| |
# 5.2.3 欢迎语设置
| dirmessage_enable=YES/NO(YES) |
| |
| |
| message_file=.message |
| |
| |
| banner_file=/etc/vsftpd/banner |
| |
| |
| ftpd_banner=Welcome to BOB's FTP server |
| |
# 5.2.4 控制用户是否允许切换到上级目录
在默认配置下,本地用户登入 FTP 后可以使用 cd 命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。
| chroot_list_enable=NO |
| chroot_list_file=/etc/vsftpd.chroot_list |
| chroot_local_user=NO |
通过搭配能实现以下几种效果:
- 当 chroot_list_enable=YES,chroot_local_user=YES 时,在 /etc/vsftpd.chroot_list 文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
- 当 chroot_list_enable=YES,chroot_local_user=NO 时,在 /etc/vsftpd.chroot_list 文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
- 当 chroot_list_enable=NO,chroot_local_user=YES 时,所有的用户均不能切换到其他目录。
- 当 chroot_list_enable=NO,chroot_local_user=NO 时,所有的用户均可以切换到其他目录。
# 5.2.5 数据传输模式设置
FTP 在传输数据时,可以使用二进制方式,也可以使用 ASCII 模式来上传或下载数据。
| ascii_upload_enable=YES/NO(NO) |
| |
| |
| ascii_download_enable=YES/NO(NO) |
| |
# 5.2.6 访问控制设置
两种控制方式:一种控制主机访问,另一种控制用户访问。
1、控制主机访问:
| tcp_wrappers=YES/NO(YES) |
| |
| vsftpd:192.168.0. :allow |
| all:all :deny |
2、控制用户访问
对于用户的访问控制可以通过 /etc 目录下的 vsftpd.user_list 和 ftpusers 文件来实现。
| userlist_file=/etc/vsftpd.user_list |
| |
| |
| userlist_enable=YES/NO(NO) |
| |
| |
| userlist_deny=YES/NO(YES) |
| |
# 5.2.7 访问速率设置
| anon_max_rate=0 |
| local_max_rate=0 |
# 5.2.8 超时时间设置
| accept_timeout=60 |
| connect_timeout=60 |
| data_connection_timeout=120 |
| idle_session_timeout=300 |
# 5.2.9 日志文件设置
| xferlog_enable= YES/NO(YES) |
| |
| |
| xferlog_file=/var/log/vsftpd.log |
| |
| |
| xferlog_std_format=YES/NO(NO) |
| |
| |
| log_ftp_protocol=YES|NO(NO) |
| |
# 5.2.10 FTP 工作模式与端口设置
FTP 有两种工作方式:PORT FTP(主动模式)和 PASV FTP(被动模式)
| listen_port=21 |
| |
| |
| connect_from_port_20=YES/NO |
| |
| |
| ftp_data_port=20 |
| |
| |
| pasv_enable=YES/NO(YES) |
| |
| |
| pasv_max_port=24800 |
| |
| |
| pasv_min_port=24500 |
| |
# 5.2.11 与连接相关的设置
| listen=YES/NO(YES) |
| |
| |
| max_clients=0 |
| |
| |
| max_per_ip=0 |
| |
| |
| listen_address=IP 地址 |
| |
| |
| setproctitle_enable=YES/NO(NO) |
| |
# 5.2.12 虚拟用户设置
虚拟用户使用 PAM 认证方式。
| pam_service_name=vsftpd |
| |
| |
| guest_enable= YES/NO(NO) |
| |
| |
| guest_username=ftp |
| |
| |
| virtual_use_local_privs=YES/NO(NO) |
| |
# 5.2.13 定义用户配置文件
在 vsftpd 中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。
| user_config_dir=/etc/vsftpd/userconf |
| |
例如:定义 user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在 user_config_dir 的目录新增文件名为 test1 和 test2 两个文件。若是 test1 登入,则会读取 user_config_dir 下的 test1 这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义 local_max_rate=XX,即可。
# 六、VSFTP 匿名用户访问
| |
| [root@vsftp ~] |
| anonymous_enable=YES |
| local_enable=YES |
| write_enable=YES |
| local_umask=022 |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| dirmessage_enable=YES |
| xferlog_enable=YES |
| connect_from_port_20=YES |
| xferlog_std_format=YES |
| listen=NO |
| listen_ipv6=YES |
| pam_service_name=vsftpd |
| userlist_enable=YES |
| tcp_wrappers=YES |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| |
| |
| [root@vsftp ~] |
| drwxr-xr-x 3 root root 30 Nov 4 23:05 /var/ftp/ |
| [root@vsftp ~] |
# 七、VSFTP 系统用户访问
# 7.1 VSFTP 配置文件
| [root@vsftp ~] |
| anonymous_enable=YES |
| 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=NO |
| listen_ipv6=YES |
| pam_service_name=vsftpd |
| userlist_enable=YES |
| tcp_wrappers=YES |
# 7.2 新建系统用户
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
# 7.3 VSFTP 基本配置
vsftp 登录路径默认为用户家目录,可以通过修改配置文件自定义主目录,修改后所有用户登录的工作目录都是该路径 /share_home。
| local_root=/share_home |
| local_max_rate=0 |
此时用户登录后没有写入权限,原因为虽然 VSFTP 服务开启了写权限,但是 /share_home 目录属主属组为 root,用户没有目录写权限。
| [root@vsftp ~] |
| [root@vsftp ~] |
| uid=1000(xuyong) gid=1000(xuyong) groups=1000(xuyong) |
| [root@vsftp ~] |
| [root@vsftp ~] |
| uid=1000(xuyong) gid=1000(xuyong) groups=1000(xuyong),1003(caiwu) |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| drwxr-xr-x 2 root root 6 Nov 5 09:59 /share_home/ |
| [root@manager ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| drwxrwxr-x 2 root caiwu 6 Jun 22 16:39 /share_home/ |
# 7.4 限制登录用户切换家目录
1、限制所有登录用户切换家目录
从 2.3.5 之后,vsftpd 增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
| chroot_local_user=YES |
| allow_writeable_chroot=YES |
| |
2、仅允许写入 /etc/vsftpd/chroot_list 文件中的用户可以切换目录,其他用户都限制在用户主目录
| chroot_local_user=YES |
| allow_writeable_chroot=YES |
| chroot_list_enable=YES |
| chroot_list_file=/etc/vsftpd/chroot_list |
| |
| |
| [root@vsftp ~] |
| xuyong |
| [root@vsftp ~] |
# 7.5 VSFTP 用户访问控制
1、配置文件
| [root@manager ~] |
| total 36 |
| -rw------- 1 root root 125 Jun 10 2021 ftpusers |
| -rw------- 1 root root 361 Jun 10 2021 user_list |
2、将用户 xuyong 加入 user_list 文件中后默认为黑名单,不能登入 vsftp 服务器
| [root@manager ~] |
| |
| |
| |
| |
| |
| |
| root |
| bin |
| daemon |
| adm |
| lp |
| sync |
| shutdown |
| halt |
| mail |
| news |
| uucp |
| operator |
| games |
| nobody |
| xuyong |
3、通过修改配置文件 /etc/vsftpd/vsftpd.conf,仅写入 /etc/vsftpd/user_list 中的用户可以访问 vsftp 服务器,其他用户不可以访问。此时该文件为白名单。
| userlist_enable=YES |
| userlist_deny=NO |
| Userlist_file=/etc/vsftpd/user_list |
# 八、VSFTP 虚拟用户访问
# 8.1 创建虚拟用户口令文件
| [root@vsftp ~] |
| xuyong |
| 123456 |
| zhaomin |
| 123456 |
| zhangwuji |
| 123456 |
# 8.2 生成虚拟用户已口令认证文件
| |
| [root@vsftp ~] |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| -rw-r--r-- 1 root root 12288 Jun 22 20:41 /etc/vsftpd/vusers.db |
# 8.3 编辑 VSFTP 的 PAM 认证文件
| |
| [root@vsftp ~] |
| |
| |
| |
| |
| |
| |
| |
| |
| auth required pam_userdb.so db=/etc/vsftpd/vusers |
| account required pam_userdb.so db=/etc/vsftpd/vusers |
# 8.4 建立本地映射用户并设置宿主目录权限
- 所有 Vsftpd 虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用;
- 用户名必须和下一步配置文件中一致;
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| drwxr-xr-x 2 vuser vuser 62 Jun 22 20:58 /home/vftproot |
# 8.5 修改配置文件
| [root@vsftp ~] |
| ... |
| guest_enable=YES |
| guest_username=vuser |
| pam_service_name=vsftpd |
# 8.6 重启 VSFTP 服务并测试
- 此时虚拟用户可以登录、查看、下载,不能上传
- 默认上传文件的位置是虚拟用户的家目录
- 权限使用的是匿名用户权限进行管理
| [root@vsftp ~] |
| |
| |
| [root@vsftp vftproot] |
| /home/vftproot |
| [root@vsftp vftproot] |
| a.txt |
![1.jpg]()
# 8.7 调整虚拟用户权限
- 给虚拟用户设定权限,允许所有虚拟用上传
- 关闭匿名用户登录,更加安全(不影响虚拟用户登录)
| [root@vsftp ~] |
| anonymous_enable=NO |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| |
| [root@vsftp vftproot] |
![2.jpg]()
# 8.8 单独定义虚拟用户权限
为每个虚拟用户建立自己的配置文件,每个虚拟用户都有自己的共享目录,并单独定义权限;
| |
| [root@vsftp ~] |
| user_config_dir=/etc/vsftpd/vusers_dir |
| |
| |
| [root@vsftp ~] |
| |
| |
| [root@vsftp ~] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| local_root=/data/xuyong |
| |
| |
| [root@vsftp ~] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=NO |
| local_root=/data/zhangwuji |
| |
| [root@vsftp ~] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=NO |
| anon_other_write_enable=NO |
| local_root=/data/zhaomin |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| |
| |
| [root@vsftp vftproot] |
- 用户 xuyong 可以登录、查看、下载,删除、创建目录和文件、上传
- 用户 zhangwuji 可以登录、查看、下载、创建目录和文件,上传,无法删除
- 用户 zhangwuji 可以登录、查看、下载、上传,无法删除、创建目录和文件
# 九、项目实战
# 9.1 公司 FTP 服务器需求
- 每位员工有独立的目录,可上传、可读、可写、可删除权限,但目录本身员工不可删除
- 每位员工拥有独立根目录,在自己目录下可见公司共享目录 public_share(只读)
- 部门内部员工可见部门共享目录_caiwu_share(读写)
- 禁锢虚拟用户的主目录,同时禁止访问除主目录之外的目录
- 开启日志记录登录、上传、下载、删除信息
![1.png]()
# 9.2 VSFTP 部署
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| tcp6 0 0 :::21 :::* LISTEN 973/vsftpd |
# 9.3 配置虚拟用户访问
| |
| [root@vsftp ~] |
| xuyong |
| 123456 |
| zhaomin |
| 123456 |
| zhangwuji |
| 123456 |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| -rw-r--r-- 1 root root 12288 Jun 23 13:54 /etc/vsftpd/vusers.db |
| |
| |
| [root@vsftp ~] |
| |
| |
| |
| |
| |
| |
| |
| |
| auth required pam_userdb.so db=/etc/vsftpd/vusers |
| account required pam_userdb.so db=/etc/vsftpd/vusers |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| drwxr-xr-x 2 vuser vuser 62 Jun 23 13:55 /home/vftproot |
| |
| |
| [root@vsftp ~] |
| anonymous_enable=NO |
| ... |
| chroot_local_user=YES |
| allow_writeable_chroot=YES |
| |
| ... |
| guest_enable=YES |
| guest_username=vuser |
| pam_service_name=vsftpd |
| |
| |
| [root@vsftp ~] |
| user_config_dir=/etc/vsftpd/vusers_dir |
| |
| |
| [root@vsftp ~] |
| |
| |
| |
| |
| |
| |
| |
| [root@vsftp vusers_dir] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| local_root=/data/it/xuyong |
| |
| [root@vsftp vusers_dir] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| local_root=/data/caiwu/zhangwuji |
| |
| [root@vsftp vusers_dir] |
| anon_upload_enable=YES |
| anon_mkdir_write_enable=YES |
| anon_other_write_enable=YES |
| local_root=/data/caiwu/zhaomin |
| |
| |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| [root@vsftp ~] |
| |
| |
| [root@vsftp vftproot] |
# 9.4 配置公共目录共享
因为 1 个虚拟用户只可以配置 1 个目录,故需要通过 mount -B 来实现目录共享
| |
| mkdir -p /data/public_share |
| mkdir -p /data/caiwu/caiwu_share |
| mkdir -p /data/it/it_share |
| |
| mkdir -p /data/caiwu/zhangwuji/caiwu_share |
| mkdir -p /data/caiwu/zhangwuji/public_share |
| |
| mkdir -p /data/caiwu/zhaomin/caiwu_share |
| mkdir -p /data/caiwu/zhaomin/public_share |
| |
| mkdir -p /data/it/xuyong/it_share |
| mkdir -p /data/it/xuyong/public_share |
| |
| |
| |
| mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhangwuji/caiwu_share |
| mount -B -o ro /data/public_share /data/caiwu/zhangwuji/public_share |
| |
| mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhaomin/caiwu_share |
| mount -B -o ro /data/public_share /data/caiwu/zhaomin/public_share |
| |
| mount -B -o rw /data/it/it_share /data/it/xuyong/it_share |
| mount -B -o ro /data/public_share /data/it/xuyong/public_share |
| |
| |
| chown vuser:vuser /data/caiwu/caiwu_share |
| chown vuser:vuser /data/it/it_share |
| |
| |
| [root@vsftp ~] |
| 追加内容如下: |
| mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhangwuji/caiwu_share |
| mount -B -o ro /data/public_share /data/caiwu/zhangwuji/public_share |
| mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhaomin/caiwu_share |
| mount -B -o ro /data/public_share /data/caiwu/zhaomin/public_share |
| mount -B -o rw /data/it/it_share /data/it/xuyong/it_share |
| mount -B -o ro /data/public_share /data/it/xuyong/public_share |