vsftpd
FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP协议有下面两种工作模式。
主动模式:FTP服务器主动向客户端发起连接请求。
被动模式:FTP服务器等待客户端发起连接请求(默认工作模式)。
在配置妥当软件仓库之后,就可以安装vsftpd服务程序
[root@localhost ~]# yum install -y vsftpd
已加载插件:fastestmirror, langpacks
Repository base is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* base: mirrors.nju.edu.cn
* extras: mirrors.nju.edu.cn
* updates: mirrors.nju.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 vsftpd.x86_64.0.3.0.2-29.el7_9 将被 安装
--> 解决依赖关系完成
依赖关系解决
=================================================================================
Package 架构 版本 源 大小
=================================================================================
正在安装:
vsftpd x86_64 3.0.2-29.el7_9 updates 173 k
事务概要
=================================================================================
安装 1 软件包
总下载量:173 k
安装大小:353 k
Downloading packages:
警告:/var/cache/yum/x86_64/7/updates/packages/vsftpd-3.0.2-29.el7_9.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
vsftpd-3.0.2-29.el7_9.x86_64.rpm 的公钥尚未安装
vsftpd-3.0.2-29.el7_9.x86_64.rpm | 173 kB 00:00:00
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 检索密钥
导入 GPG key 0xF4A80EB5:
用户ID : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
指纹 : 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
软件包 : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda)
来自 : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : vsftpd-3.0.2-29.el7_9.x86_64 1/1
验证中 : vsftpd-3.0.2-29.el7_9.x86_64 1/1
已安装:
vsftpd.x86_64 0:3.0.2-29.el7_9
完毕!
关闭防火墙、关闭selinux
需要清空iptables防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# vim /etc/selinux/config
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables-save
将ftp协议添加到firewalld服务允许列表中(在防火墙开启的情况下)
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=ftp
success
[root@localhost ~]# firewall-cmd --reload
success
进行过滤vsftpd的主配置文件(过滤注释信息)
多复制几份进行多次实验
[root@localhost ~]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
*/etc/vsftpd/vsftpd.conf
[root@localhost ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
[root@localhost ~]# grep -v "#" /etc/vsftpd/vsftpd.conf_bak >/etc/vsftpd/vsftpd.conf
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd.conf_bak vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf_bak1
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf_bak2
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf_bak3
[root@localhost vsftpd]# ls
ftpusers vsftpd.conf vsftpd.conf_bak1 vsftpd.conf_bak3
user_list vsftpd.conf_bak vsftpd.conf_bak2 vsftpd_conf_migrate.sh
vsftpd服务程序常用的参数以及作用
参数 | 作用 |
---|---|
listen=[YES|NO] | 是否以独立运行的方式监听服务 |
listen_address=IP地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES|NO] | 是否允许下载文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=[YES|NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES|NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES|NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES|NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0为不限制 |
local_enable=[YES|NO] | 是否允许本地用户登录FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES|NO] | 是否将用户权限禁锢在FTP目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0为不限制 |
匿名开放模式:是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到FTP服务器。
本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。
虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。
安装ftp客户端工具进行测试
[root@localhost vsftpd]# yum install -y ftp
已加载插件:fastestmirror, langpacks
Repository base is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* base: mirrors.bfsu.edu.cn
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 ftp.x86_64.0.0.17-67.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=================================================================================
Package 架构 版本 源 大小
=================================================================================
正在安装:
ftp x86_64 0.17-67.el7 base 61 k
事务概要
=================================================================================
安装 1 软件包
总下载量:61 k
安装大小:96 k
Downloading packages:
ftp-0.17-67.el7.x86_64.rpm | 61 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : ftp-0.17-67.el7.x86_64 1/1
验证中 : ftp-0.17-67.el7.x86_64 1/1
已安装:
ftp.x86_64 0:0.17-67.el7
完毕!
匿名访问模式
向匿名用户开放的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
编写主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES
2 anon_umask=022
3 anon_upload_enable=YES
4 anon_mkdir_write_enable=YES
5 anon_other_write_enable=YES
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15
16 pam_service_name=vsftpd
17 userlist_enable=YES
18 tcp_wrappers=YES
重启服务加入开机自启
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multiuser.target.wants/vsftpd.service to/usr/lib/systemd/system/vsftpd.service.
使用ftp命令远程连接ftp服务器进行认证
匿名账户统一anonymous,密码为空
进入的ip地址根据本机ip a查看
[root@localhost ~]# ftp 192.168.153.128
Connected to 192.168.153.128 (192.168.153.128).
220 (vsFTPd 3.0.2)
Name (192.168.153.128: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
550 Create directory operation failed.
ftp>
系统拒绝创建目录,vsftpd服务默认访问是/var/ftp目录,查看该目录权限只有root管理员有写入权限,修改目录权限 ,修改后还是会出现报错,使用getsebool查看ftp相关的selinux域策略
[root@localhost ~]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 root root 6 6月 10 2021 /var/ftp/pub/
[root@localhost ~]# chown -R ftp /var/ftp/pub/
也可以使用chmod -R 777 /var/ftp
[root@localhost ~]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 ftp root 6 6月 10 2021 /var/ftp/pub/
[root@localhost ~]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
ftpd_full_access --> off导致操作失败,修改策略,使用-P参数使修改的策略永久生效
[root@localhost ~]# setsebool -P ftpd_full_access =on
setsebool: illegal value =on for boolean ftpd_full_access
修改完再次进行测试
[root@localhost ~]# ftp 192.168.153.128
Connected to 192.168.153.128 (192.168.153.128).
220 (vsFTPd 3.0.2)
Name (192.168.153.128: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> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
本地用户模式
本地用户模式使用的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名访问模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置可写权限 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_deny=YES | 启用“禁止用户名单”,名单文件为ftpusers和user_list |
userlist_enable=YES | 开启用户作用名单文件功能 |
这里着重提示做这个实验的前提是将第一个主配置文件删除,使用刚刚备份的文件重新进行实验
配置主配置文件参数
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11
12 pam_service_name=vsftpd
13 userlist_enable=YES
14 tcp_wrappers=YES
本地用户模式的配置基本不变只需要拒绝匿名访问模式
重启服务 加入启动项
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multiuser.target.wants/vsftpd.service to/usr/lib/systemd/system/vsftpd.service.
使用root用户登录,系统提示以下错误信息
[root@localhost ~]# ftp 192.168.153.128
Connected to 192.168.153.128 (192.168.153.128).
220 (vsFTPd 3.0.2)
Name (192.168.153.128:root): root
530 Permission denied.
Login failed.
ftp>
在目录中默认存放两个默认拒绝的用户(ftpusers和user_list)
删除掉root用户
[root@localhost ~]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
# root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@localhost ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
# root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
可以选择在上述两个文件中不存在的用户进行实验,也可以像上面一样删除掉root用户再进行实验,在实验之前需要开启 setsebool -P ftpd_full_access=on(如果重启后)
[root@localhost ~]# ftp 192.168.153.128
Connected to 192.168.153.128 (192.168.153.128).
220 (vsFTPd 3.0.2)
Name (192.168.153.128:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/root/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
虚拟用户模式
这里着重提示做这个实验的前提是将第一个主配置文件删除,使用刚刚备份的文件重新进行实验
创建进行ftp认证的用户数据库文件,奇数行为账户名,偶数行为密码
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat
由于明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -rf vuser.list
创建vsftpd服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户。vsftpd服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
[root@localhost vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost vsftpd]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 78 5月 8 20:44 /var/ftproot/
[root@localhost vsftpd]# chmod -Rf 755 /var/ftproot/
创建虚拟用户认证的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
利用PAM文件进行认证时使用的参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名开放模式 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=virtual | 指定虚拟用户账户 |
pam_service_name=vsftpd.vu | 指定PAM文件 |
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 guest_enable=YES
5 guest_username=virtual
6 allow_writeable_chroot=YES
7 local_umask=022
8 dirmessage_enable=YES
9 xferlog_enable=YES
10 connect_from_port_20=YES
11 xferlog_std_format=YES
12 listen=NO
13 listen_ipv6=YES
14 pam_service_name=vsftpd.vu
15 userlist_enable=YES
16 user_config_dir=/etc/vsftpd/vusers_dir(对虚拟账户新建目录以及写入相关权限后添加)
对虚拟账户新建目录以及写入相关权限
[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
重启服务 加入启动项
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multiuser.target.wants/vsftpd.service to/usr/lib/systemd/system/vsftpd.service.
在实验之前需要开启 setsebool -P ftpd_full_access=on(如果重启后)
[root@linuxprobe ~]# ftp 192.168.153.128
Connected to 192.168.153.128 (192.168.153.128).
220 (vsFTPd 3.0.3)
Name (192.168.10.10: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.
ftp> exit
221 Goodbye.
vsftpd服务程序登陆后所在目录
登录方式 | 默认目录 |
---|---|
匿名公开 | /var/ftp |
本地用户 | 该用户的家目录 |
虚拟用户 | 对应映射用户的家目录 |
TFTP简单文件传输协议
[root@localhost ~]# yum install -y tftp-server tftp xinetd
已加载插件:fastestmirror, langpacks
Repository base is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* base: mirrors.bfsu.edu.cn
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 tftp.x86_64.0.5.2-22.el7 将被 安装
---> 软件包 tftp-server.x86_64.0.5.2-22.el7 将被 安装
---> 软件包 xinetd.x86_64.2.2.3.15-14.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
================================================================================================
Package 架构 版本 源 大小
================================================================================================
正在安装:
tftp x86_64 5.2-22.el7 base 38 k
tftp-server x86_64 5.2-22.el7 base 47 k
xinetd x86_64 2:2.3.15-14.el7 base 128 k
事务概要
================================================================================================
安装 3 软件包
总下载量:213 k
安装大小:378 k
Downloading packages:
(1/3): tftp-5.2-22.el7.x86_64.rpm | 38 kB 00:00:00
(2/3): tftp-server-5.2-22.el7.x86_64.rpm | 47 kB 00:00:00
(3/3): xinetd-2.3.15-14.el7.x86_64.rpm | 128 kB 00:00:00
------------------------------------------------------------------------------------------------
总计 357 kB/s | 213 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : 2:xinetd-2.3.15-14.el7.x86_64 1/3
正在安装 : tftp-5.2-22.el7.x86_64 2/3
正在安装 : tftp-server-5.2-22.el7.x86_64 3/3
验证中 : tftp-server-5.2-22.el7.x86_64 1/3
验证中 : tftp-5.2-22.el7.x86_64 2/3
验证中 : 2:xinetd-2.3.15-14.el7.x86_64 3/3
已安装:
tftp.x86_64 0:5.2-22.el7 tftp-server.x86_64 0:5.2-22.el7 xinetd.x86_64 2:2.3.15-14.el7
完毕!
编写配置文件(默认不存在)
[root@localhost ~]# vim /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
重启服务 如果开启防火墙则手动加入策略
[root@localhost ~]# systemctl restart tftp
[root@localhost ~]# systemctl enable tftp
[root@localhost ~]# systemctl restart xinetd
[root@localhost ~]# systemctl enable xinetd
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-port=69/udp
success
[root@localhost ~]# firewall-cmd --reload
success
tftp命令中可用的参数以及作用
参数 | 作用 |
---|---|
? | 帮助信息 |
put | 上传文件 |
get | 下载文件 |
verbose | 显示详细的处理信息 |
status | 显示当前的状态信息 |
binary | 使用二进制进行传输 |
ascii | 使用ASCII码进行传输 |
timeout | 设置重传的超时时间 |
quit | 退出 |
测试
[root@localhost ~]# tftp 192.168.153.128
tftp> get readme.txt
tftp> quit
[root@localhost ~]# ls
anaconda-ks.cfg readme.txt 模板 图片 下载 桌面
initial-setup-ks.cfg 公共 视频 文档 音乐
[root@localhost ~]# cat readme.txt
welcome xiaozhao_student