Vsftpd
简介
为了解决在复杂多样的设备之间传输文件,文件传输协议(FTP)诞生了。由于FTP协议是明文传输,不够可靠。所以为了满足传输的安全性,出现了vsftpd(very secure ftp daemon,非常安全的FTP守护进程)
FTP默认使用20、21端口
- 20端口用于数据传输
- 21端口用于FTP的连接和控制(接受客户端发出的FTP命令和参数)。
认证方式
- 匿名用户模式
最不安全的一种认证模式,任何人都无需密码验证而直接登录到FTP服务器
- 本地用户模式
通过Linux系统本地的账户密码认证的模式,相较于匿名更安全,配置也更简单。(如果有人通过FTP破解了账户的信息,就可以畅通无阻的登录到FTP服务器,从而控制整台服务器)
- 虚拟用户模式
更安全的一种认证模式,它需要FTP服务单独为客户建立数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务进行认证使用。
安装Vsftpd
当前环境为CentOS Linux 8.4,配置软件仓库
mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.bak
curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-8.repo
dnf clean all
dnf makecache
安装vsftp软件包
dnf install vsftpd
备份原配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
过滤#开头的行,生成新的配置文件
grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
查看配置文件
cat /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
主配置文件的常用参数
参数 | 作用 |
---|---|
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为不限制 |
配置匿名用户模式
vsftpd服务程序默认关闭了匿名登录的方式,我们需要开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。不建议在生产环境中使用此种模式
安装vsftpd软件包
dnf install vsftpd
备份原配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
过滤#开头的行,生成新的配置文件
grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
编辑配置文件
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
向匿名用户开放的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
创建在ftp默认访问目录下创建一个公用目录
mkdir /var/ftp/pub
给与ftp用户子目录的属主
chown -R ftp /var/ftp/pub/
注意:不建议给予父目录/var/ftp属主或777权限,会触发安全保护机制,导致用户无法登录
重启服务
systemctl restart vsftpd
加入开机自启
systemctl enable vsftpd
查看与FTP相关的SELinux域策略
getsebool -a | grep ftp
修改SELinux策略,-P永久生效
setsebool -P ftpd_full_access=on
允许firewall通过ftp协议
firewall-cmd --permanent --zone=public --add-service=ftp
重新加载firewall策略生效
firewall-cmd --reload
配置本地用户模式
vsftpd服务程序默认关闭了匿名登录的方式,我们需要开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。不建议在生产环境中使用此种模式
安装vsftpd软件包
dnf install vsftpd
备份原配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
过滤#开头的行,生成新的配置文件
grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
编辑配置文件
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
本地用户模式使用的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名访问模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置可写权限 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_deny=YES | 启用“禁止用户名单”,名单文件为ftpusers和user_list |
userlist_enable=YES | 开启用户作用名单文件功能 |
重启服务
systemctl restart vsftpd
加入开机自启
systemctl enable vsftpd
查看与FTP相关的SELinux域策略
getsebool -a | grep ftp
修改SELinux策略,-P永久生效
setsebool -P ftpd_full_access=on
允许firewall通过ftp协议
firewall-cmd --permanent --zone=public --add-service=ftp
重新加载firewall策略生效
firewall-cmd --reload
现在可以使用的本地账户,来登录ftp服务,但为了服务器的安全性,ftp服务默认禁止了大多本地系统用户的登录。如果想要使用root用户登录,删除ftp用户黑名单ftpusers
和user_list
[1]中的root即可。
当然也可以创建一个不允许登录系统的账户,给ftp登录专用
useradd -s /sbin/nologin test
配置虚拟用户模式
安装vsftpd软件包
dnf install vsftpd
新建虚拟用户账号密码文件
cd /etc/vsftpd/
vim vuser.list
test1
pwd@test1
test2
pwd@test2
注:奇数为用户名,偶数用户密码
使用哈希(hash)算法转换成数据库文件
db_load -T -t hash -f vuser.list vuser.db
降低此文件的权限
chmod 600 vuser.db
#建议删除明文信息文件(可选,怕忘密码可以不删)
rm -rf vuser.list
创建virtual本地用户用于和虚拟用户的映射,指定家目录,不允许该用户登录系统
useradd -d /var/ftproot -s /sbin/nologin virtual
注:指定的家目录为/var/ftproot(上面的操作将设置此为ftp登录后默认进入的目录)
查看新生成的目录权限,为700
ls -ld /var/ftproot/
drwx------. 2 virtual virtual 62 Oct 19 10:44 /var/ftproot/
强制提升目录权限为755
chmod -Rf 755 /var/ftproot/
ls -ld /var/ftproot/
drwxr-xr-x. 2 virtual virtual 62 Oct 19 15:17 /var/ftproot/
建立支持虚拟用户的PAM[2]文件
vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
备份原配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
过滤#开头的行,生成新的配置文件
grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
创建虚拟用户权限目录
mkdir /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir
不给予test1权限,test1只拥有默认的查看和下载权限
touch test1
给与test2所有权限,test2能够上传、下载、删除等
vim test2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
编辑配置文件
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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.vu
userlist_enable=YES
user_config_dir=/etc/vsftpd/vusers_dir
利用PAM文件进行认证时使用的参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名开放模式 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=ftpvuser | 指定虚拟用户账户 |
pam_service_name=vsftpd.vu | 指定PAM文件 |
allow_writeable_chroot=YES | 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求 |
重启服务
systemctl restart vsftpd
加入开机自启
systemctl enable vsftpd
查看与FTP相关的SELinux域策略
getsebool -a | grep ftp
修改SELinux策略,-P永久生效
setsebool -P ftpd_full_access=on
允许firewall通过ftp协议
firewall-cmd --permanent --zone=public --add-service=ftp
重新加载firewall策略生效
firewall-cmd --reload
连接测试
- test1只有下载权限
- test2拥有所有权限
安装lftp客户端工具,连接测试
dnf install lftp
#lftp的简易使用
lftp <FTP服务器IP> -u <用户名> #登录FTP服务
lftp> ls #列表显示当前所有内容
lftp> cd xxx #进入指定目录
lftp> get xxx #下载指定文件或目录到当前位置
lftp> put xxx #上传指定文件或目录到FTP
FTP目录放入一个文件,测试使用
echo "hiahia" > /var/ftproot/lookup.txt
使用test1用户登录测试
[root@localhost ~]# lftp 192.168.88.133 -u test1
Password:
lftp test1@192.168.88.133:~> ls
-rw-r--r-- 1 0 0 7 Oct 19 07:22 lookup.txt
lftp test1@192.168.88.133:/> get lookup.txt #能下载文件
7 bytes transferred
lftp test1@192.168.88.133:/> mkdir test1 #无法创建目录
mkdir: Access failed: 550 Permission denied. (test1)
lftp test1@192.168.88.133:/> ls
-rw-r--r-- 1 0 0 7 Oct 19 07:22 lookup.txt
lftp test1@192.168.88.133:/> rm lookup.txt #无法删除文件
rm: Access failed: 550 Permission denied. (lookup.txt)
lftp test1@192.168.88.133:/> exit
[root@localhost ~]# ls #查看下载到本地的文件,测试完毕无异常
anaconda-ks.cfg lookup.txt
[root@localhost ~]# cat lookup.txt
hiahia
[root@localhost ~]# rm -rf lookup.txt
使用test2用户登录测试
[root@localhost ~]# lftp 192.168.88.133 -u test2
Password:
lftp test2@192.168.88.133:~> ls
-rw-r--r-- 1 0 0 7 Oct 19 07:22 lookup.txt
lftp test2@192.168.88.133:/> get lookup.txt #能下载文件
7 bytes transferred
lftp test2@192.168.88.133:/> put /etc/vsftpd/vsftpd.conf #能上传文件
338 bytes transferred
lftp test2@192.168.88.133:/> ls
-rw-r--r-- 1 0 0 7 Oct 19 07:22 lookup.txt
-rw------- 1 1000 1000 338 Oct 19 07:43 vsftpd.conf
lftp test2@192.168.88.133:/> mkdir test2 #能创建目录
mkdir ok, `test2' created
lftp test2@192.168.88.133:/> ls
-rw-r--r-- 1 0 0 7 Oct 19 07:22 lookup.txt
drwx------ 2 1000 1000 6 Oct 19 07:43 test2
-rw------- 1 1000 1000 338 Oct 19 07:43 vsftpd.conf
lftp test2@192.168.88.133:/> rm lookup.txt #能删除文件
rm ok, `lookup.txt' removed
lftp test2@192.168.88.133:/> ls
drwx------ 2 1000 1000 6 Oct 19 07:43 test2
-rw------- 1 1000 1000 338 Oct 19 07:43 vsftpd.conf
lftp test2@192.168.88.133:/> exit
[root@localhost ~]# ls #查看下载到本地的文件,测试完毕无异常
anaconda-ks.cfg lookup.txt
[root@localhost ~]# cat lookup.txt
hiahia
Vsftpd服务程序登陆后所在目录
登录方式 | 默认目录 |
---|---|
匿名公开 | /var/ftp |
本地用户 | 该用户的家目录 |
虚拟用户 | 对应映射用户的家目录 |
TFTP
简介
TFTP(Trivial File Transfer Protocol, 简单文件传输协议),基于UDP协议。提供不复杂、开销小的文件传输服务,相当于FTP协议的简化版本。
TFTP,不需要客户端的权限认证,减少了带宽和系统的消耗。它的功能较少,甚至不能遍历目录,安全性也不如FTP。但因此在传输琐碎(Trivial)小文件时,效率更高。
安装TFTP
来安装体验一下,tftp-server 提供服务程序 | tftp是用于连接的客户端工具 | xinetd[3]是管理程序的服务
dnf install tftp-server tftp xinetd
安装TFTP软件包后,还需要再xinetd服务程序中将其开启,再RHEL 8 系统中,tftp所对应的配置文件默认不存在,需要根据示例文件(/usr/share/doc/xinetd/sample.conf)自行创建。把底下的配置直接复制进去就OK
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
}
重启服务
systemctl restart tftp
开启自启
systemctl enable tftp
重启xinetd管理服务
systemctl restart xinetd
开启自启
systemctl enable xinetd
允许firewall通过udp/69
firewall-cmd --zone=public --permanent --add-port=69/udp
重新加载firewall策略生效
firewall-cmd --reload
连接测试
新建测试文件,供下载
echo "keke" >> /var/lib/tftpboot/nn
TFTP的根目录为**/var/lib/tftpboot**,使用tftp客户端尝试连接
[root@localhost ~]# tftp 192.168.88.133
tftp> ls
?Invalid command (无法遍历目录)
tftp> get nn
tftp> quit
[root@localhost ~]# cat nn
keke
tftp命令中可用的参数以及作用
参数 | 作用 |
---|---|
? | 帮助信息 |
put | 上传文件 |
get | 下载文件 |
verbose | 显示详细的处理信息 |
status | 显示当前的状态信息 |
binary | 使用二进制进行传输 |
ascii | 使用ASCII码进行传输 |
timeout | 设置重传的超时时间 |
quit | 退出 |
-
这里为什么需要两个同样的文件来禁用登录功能呢,玄机在与
user_list
上面的一段注释。如果主配置文件中的 "userlist_deny=YES" 则user_list
文件变为黑名单,不允许用户登录(此为默认值)。如果主配置文件中的 “userlist_deny=NO” 则user_list
变为白名单,将允许名单内的用户登录。 -
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想
-
在Linux系统中,TFTP服务是xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。它专门用于控制那些比较小的应用程序的开启和关闭,有点类似带有独立开关的插线板,想要开启哪个服务,就编辑对应的xinetd配置文件的开关参数。