一、关于 FTP 和 VSFTP
-
FTP(File Transfer Protocol: 文件传输协议)
是用来在 Internet 上传送文件的协议。FTP 服务器(File Transfer Protocol Server)是文件传输协议服务器,是在互联网上提供文件存储和访问服务的计算机,它们依照 FTP 协议提供服务。 -
VSFTP
是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,它的全称是 Very Secure FTP。从名称可以看出,编制者的初衷是代码的安全性。VSFTP 具有安全、高速、稳定的特点。VSFTP 的软件架构为 C/S 模式(即一个客户端一个服务器端)。 -
FTP 的端口
FTP 的端口有两个:20 和 21。20 端口用来进行数据传输,21 端口是控制端口,用于传输指令。查看 FTP 端口的方法如下:cat /etc/services | grep "^ftp"
-
FTP 的会话
包含了两个通道:控制通道和数据传输通道。FTP 有两种工作模式,一种是主动模式,一种是被动模式。以 FTP Server 为参考点,主动模式是服务器端主动连接客户端传输,被动模式是服务器端等待客户端连接。 -
VSFTP 配置文件
/etc/vsftpd/vsftpd.conf
:VSFTP 的核心配置文件。/etc/vsftpd/ftpusers
:指定哪些用户不能访问 FTP 服务器,即黑名单。/etc/vsftpd/user_list
:指定允许使用 VSFTP 的用户列表文件,即白名单。/etc/vsftpd/vsftpd_conf_migrate.sh
:VSFTP 操作的一些变量和设置脚本。/var/ftp/
:默认情况下匿名用户的根目录。
-
ftpusers
和user_list
文件说明ftpusers
文件总是生效,它是一个黑名单,通常存放管理员不希望登录 FTP 的用户(如root
)。user_list
文件是否生效取决于vsftpd.conf
中的userlist_enable
和userlist_deny
配置。user_list
可以是一个黑名单或白名单。
-
问题
-
问题一:ftpusers和user_list两个文件各自的用途是什么?有何关系?
首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。而user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。所以简单总结就是:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置。 -
问题二:vsftpd.conf中的userlist_enable和userlist_deny两个配置项各自起什么作用,两者如何搭配使用?
为了说明这个问题,我们来建立两个测试用户:
tom: 在user_list中
jim:不在user_list中
然后我们分别给两个配置项取不同的值,分4种Case进行测试:
Case 1: userlist_enable=YES, userlist_deny=YES
tom: 拒绝登入
jim: 允许登录
Case 2: userlist_enable=YES, userlist_deny=NO
tom: 允许登录
jim:拒绝登录(如user_list文件开头的注释所述,甚至不会提示输入密码,即无登入提示框,直接拒绝连接)
Case 3: userlist_enable=NO,userlist_deny=NO
tom: 允许登录
jim: 允许登录
Case 4: userlist_enable=NO,userlist_deny=YES
tom: 允许登录
jim: 允许登录 -
综上实验得出以下结论:
userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous
-
二、FTP、SFTP、VSFTP、VSFTPD 的区别
-
FTP
是 File Transfer Protocol 的缩写,是一种用于在网络上进行文件传输的协议,属于网络传输协议的应用层。 -
SFTP
是 SSH File Transfer Protocol 的缩写,是基于 SSH 协议的加密 FTP 传输协议。SFTP 为 SSH 的一部分,使用 SFTP 是非常安全的。SFTP 使用的是 SSH 协议。 -
VSFTP
是 Very Secure FTP 的缩写,是一个类 Unix 系统上使用的 FTP 服务器软件,支持 FTP 协议,不支持 SFTP 协议。 -
VSFTPD
是 Very Secure FTP Daemon 的缩写,是 VSFTP 的守护进程。
三、安装&&准备
[root@localhost ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
================================================================================
Installing:
vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
vsftpd.x86_64 0:3.0.2-9.el7
Complete!
[root@linuxprobe ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Install 1 Package
ftp.x86_64 0:0.17-66.el7
Complete!
关闭本机防火墙
[root@localhost vsftpd]# systemctl stop firewalld
[root@localhost vsftpd]# systemctl disable firewalld
[root@localhost vsftpd]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
四、匿名访问模式
vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。
# 匿名访问模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_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
anon_root=/var/ftp #指定匿名访问目录
查看该目录的权限得知,只有root管理员才有写入权限,开放ftp用户权限
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
[root@localhost ~]# chown -Rf ftp /var/ftp/pub
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
临时关闭 SELinux
setenforce 0
sestatus #查看状态
SELinux status: disabled 或 Current mode: permissive为成功关闭
# 重启服务
[root@localhost ~]# systemctl restart vsftpd
# 服务程序加入到开机启动项中,以保证服务器在重启后依然能够正常提供传输服务
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
测试访问(匿名用户)
[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): anonymous
331 Please specify the password.
Password: 此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp>
五、本地用户模式
关闭之前的匿名模式,开启本地用户模式。
# 本地用户模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
xferlog_enable=YES
xferlog_std_format=YES
重启服务&&设置自启
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
新建用户escape
[root@localhost vsftpd]# useradd escape
[root@localhost vsftpd]# passwd escape
更改用户 escape 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
测试访问(本地用户)
[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): escape
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,165,200,68,207).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/home/escape"
ftp> exit
221 Goodbye.
六、虚拟用户模式
认证模式:vsftpd + pam + file
第一步:创建用于进行 FTP 认证的用户数据库文件
- 数据库文件中奇数行为账户名,偶数行为密码
# 编辑虚拟用户文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
zhangsan
123456
redhat
123456
lisi
123456
redhat
123456
# 明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式
# 因此需要使用db_load命令用哈希算法将原始的明文信息文件转换成数据库文件
# 降低数据库文件的权限,然后再把原始的明文信息文件删除
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -f vuser.list
第二步:创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户
- FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置
- 可以把这个系统本地用户的家目录设置为/var目录并设置不允许登录FTP服务器
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@localhost ~]# chmod -Rf 755 /var/ftproot/
第三步:建立支持虚拟用户的 PAM 认证文件
- PAM是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开
- PAM是可插拔认证模块,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式
# 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
# PAM文件内的db=参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀
[root@localhost ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
第四步:在 vsftpd.conf 文件中添加支持配置
- 在vsftpd服务程序的主配置文件中默认就带有参数–pam_service_name=vsftpd
- 表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的
# 我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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
userlist_enable=YES
tcp_wrappers=YES
第五步:为虚拟用户设置不同的权限
- 只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件
- 在每个文件中,对用户分别进行配置,达到管理不用用户权限的效果
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch lisi
[root@localhost vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
第六步:设置 SELinux 域允许策略
临时关闭 SELinux
setenforce 0
sestatus #查看状态
SELinux status: disabled 或 Current mode: permissive为成功关闭
第七步:使用虚拟 FTP 用户访问测试
Name (192.168.165.200:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> ls
227 Entering Passive Mode (192,168,165,200,131,144).
150 Here comes the directory listing.
drwx------ 2 1013 1013 6 Aug 26 07:24 file
drwx------ 2 1013 1013 6 Aug 26 08:00 files
226 Directory send OK.
项目:搭建通用 FTP 服务器
3.1 项目要求
搭建一台通用 FTP 服务器,局域网内的所有员工都可以访问,员工可以进行上传/下载文件的操作,并创建属于自己的目录。
3.2 项目思路分析
由于需要所有员工都可以访问,因此需要设置成可以匿名用户登录,并且开启上传文件和创建文件的权限。
3.3 使用 VSFTP 搭建可以匿名访问的 FTP 服务器
- 部署环境
操作系统版本 | CPU架构 | 进程 | 功能描述 | |
---|---|---|---|---|
CentOS 7.6 | x86_64 | vsftpd | FTP 服务器端 |
-
安装 VSFTP 服务器端
yum -y install vsftpd
- 启动 VSFTP:
systemctl start vsftpd
- 设置开机启动:
systemctl enable vsftpd
- 启动 VSFTP:
-
修改 VSFTP 的配置文件
/etc/vsftpd/vsftpd.conf
- 备份配置文件:
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
- 编辑配置文件,添加以下内容:
anonymous_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
- 新增用户ftp,设置密码123:
useradd ftp passwd 123
- 确认 FTP 目录权限**
chmod 755 /var/ftp/pub/
- 修改匿名用户登录的目录权限:
chown ftp:ftp /var/ftp/pub/
- 重启 VSFTP 服务:
systemctl restart vsftpd
- 备份配置文件:
-
使用 Windows 资源管理器访问 FTP 服务器
输入ftp://192.168.1**.*/
,可以看到pub
目录并进行上传、下载等操作。 -
使用lftp工具访问 FTP 服务器
[root@localhost vsftpd]# lftp 192.168.165.200 lftp 192.168.165.200:~> pwd ftp://192.168.165.200 lftp 192.168.165.200:~> ls drwxr-xr-x 2 1009 1009 6 Aug 20 07:51 pub lftp 192.168.165.200:/> pwd ftp://192.168.165.200/ lftp 192.168.165.200:/> cd pub/ lftp 192.168.165.200:/pub> ls lftp 192.168.165.200:/pub> mkdir t mkdir 成功, 建立 `t' lftp 192.168.165.200:/pub> ls drwx------ 2 1009 1009 6 Aug 20 08:21 t lftp 192.168.165.200:/pub> exit [root@localhost vsftpd]#