1、概念介绍
FTP(File Transfer Protocol:文件传输协议)作用Internet 上用来传送文件的协议
FTP Server(File Transfer Protocol Server)是在互联网/局域网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。采用C/S架构模式。
a. 常见 FTPS
windows:Serv-U FTP Server,filezilla_server
Linux:VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
b. 服务端口
21 :用于建立控制连接,并传输指令
20 :用于建立数据连接,并传输文件数据
ftp会话包含了两个通道,控制通道和数据通道。根据ftp服务器在建立数据连接过程中的主、被动关系,ftp数据连接分为主动模式和被动模式。
注意:这里的主动和被动,是相对于的FTP server 端来判断的,如果server 去连接client 开放的端口,说明是主动的,如果client去连接server开放的端口,则是被动的。
c. 主动模式
服务器主动连接客户端传输数据
d. 被动模式
服务器等待客户端的连接传输数据
2、安装配置 vsftpd
a. vsftpd 服务端
# 服务端 安装 vsftpd
yum install -y vsftpd
b. vsftpd 配置文件
/etc/vsftpd/vsftpd.conf | vsftpd 的主配置文件 |
/etc/vsftpd/ftpusers | 黑名单文件,用于指定哪些用户不能访问FTP 服务器。此文件中列出的用户将禁止登陆vsftpd服务器。 |
/etc/vsftpd/user_list | 此文件中包含的用户可能被禁止登录,也可能被允许登录。具体取决于主配置文件vsftpd.conf中的设置。当存在userlist_enable=YES的配置项时,user_list列表文件方可生效;若指定userlist_deny=YES,则仅禁止此列表中的用户登录(黑名单),若指定userlist_deny=NO,则仅允许列表中的用户登录。 |
/etc/vsftpd/vsftpd_conf_migrate.sh | 是vsftpd 操作的一些变量和设置脚本 |
/var/ftp/ | 默认情况下匿名用户的根目录 |
# 启动 vsftpd
systemctl start vsftpd# 设置开机自启动
systemctl enable vsftpd# 查看 vsftpd 状态
systemctl status vsftpd# 查看 vsftpd 端口
netstat -antup vsftpd | grep vsftpd# 查看 vsftpd 进程
ps -ef | grep vsftpd
c. vsftpd 客户端
最简单的ftp客户端工具莫过于ftp命令程序了,通过ftp命令程序可以连接到ftp服务器进行交互式的上传、下载通信。
除此之外还有大量的图形化客户端工具,如cuteftp、flashftp、filezilla等
# 客户端 安装 ftp
yum install -y ftp
d. vsftpd.conf 常用配置
listen_address=ftp服务器的地址 # 只在一个接口监听服务
listen_port=2121 # 监听端口改为2121
pasv_min_port=24500 # 指定被动模式的下限端口
pasv_max_port=24600 # 指定被动模式的上限端口
max_clients=20 # 限制并发客户端最多20个
max_per_ip=2 # 限制每个ip地址的连接数最多2个
3、远程登录 vsftpd
FTP服务器默认情况下允许匿名用户登陆,只允许匿名用户下载文件,不允许上传和删除文件
# 使用ftp命令连接服务器
ftp 192.168.137.253
a. ftp 常用命令
命令 | 含义 |
open [ftpservername] | 和指定的远程Linux FTP服务器连接 |
user [username] | |
pwd | 显示远程Linux FTP服务器上的当前路径。 |
ls | 列出远程Linux FTP服务器上当前路径下的目录和文件。 |
dir | 列出远程Linux FTP服务器上当前路径下的目录和文件(同上)。 |
mkdir [foldname] | 在远程Linux FTP服务器上当前路径下建立指定目录。 |
rmdir [foldname] | 删除远程Linux FTP服务器上当前路径下的指定目录。 |
cd [foldname] | 更改远程Linux FTP服务器上的工作目录。 |
delete [filename] | 删除远程Linux FTP服务器上指定的文件。 |
rename [filename] [newfilename] | 重命名远程Linux FTP服务器上指定的文件。 |
close | 从远程Linux FTP服务器断开但保留FTP命令参数提示。 |
disconnect | 从远程Linux FTP服务器断开但保留FTP命令参数提示(同上)。 |
bye | 结束和远程Linux FTP服务器的连接。 |
quit | 结束和远程Linux FTP服务器的连接(同上)。 |
! | 直接从远程Linux FTP服务器进入到本地shell中。 |
exit | (接上步)从本地shell环境中返回到远程Linux FTP服务器环境下。 |
!ls | 列出本地机器上当前路径下的目录和文件。 |
lcd [foldname] | 更改本地机器的工作目录。 |
? | 显示ftp命令说明。 |
help | 显示ftp命令说明(同上)。 |
# 在ftp中查看当前目录
ftp>pwd # 输出-> 257 "/"# 查看当前目录下的文件
ftp>ls
# 下载文件
get test.txt
# 退回Shell查看 下载文件
ls
b. Windows 查看服务器
4、实战:匿名访问VSFTP
a. 需求分析
需求:公司技术部准备搭建一台功能简单的FTP 服务器,允许所有员工上传和下载文件,并允许创建用户自己的目录。
分析:允许所有员工上传和下载文件,需要设置成允许匿名用户登录,并且需要允许匿名用户上传功能。
b. 修改配置文件
# 允许匿名用户访问
anonymous_enable=YES
# 允许匿名用户上传文件
anon_upload_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# 允许匿名用户写文件和删除文件
anon_other_write_enable=YES
c. 设置ftp根目录权限
# 给ftp根目录设置权限
chown -R ftp:ftp /var/ftp/pub# 重启 vsftpd 服务
systemctl restart vsftpd
d. Linux 客户端测试
# 登陆ftp服务器
ftp 192.168.137.253# 测试目录创建
ftp>pwd
ftp>mkdir test
ftp>cd pub
ftp>mkdir test
# 退出ftp并创建测试文件
ftp>!
echo "Hello Linux" > test.txt# 回到ftp
exit
ftp>cd pub# 上传测试文件
ftp>put /root/test.txt test.txt
# 更改文件名字
ftp>rename test.txt test_ftp.txt
# 删除文件
ftp>delete test
e. Windows 文件管理器测试
可以在Windows管理器中进行 文件夹的创建、修改、删除以及文件上传
5、实战:用户名密码方式访问VSFTP
a. 需求分析
需求:公司内部现在有一台FTP 和WEB 服务器,FTP 的功能主要用于维护公司的网站内容,包括上传文件、创建目录、更新网页等等。公司现有两个部门负责维护任务,他们分别适用team1 和team2帐号进行管理。先要求仅允许team1 和team2 帐号登录FTP 服务器,并将这两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。ftp 和web服务器相结合。
- web服务器根目录:/var/www/html
- team1账号只能在/var/www/html/team1/ftp上传文件和目录
- team2账号只能在/var/www/html/team2/ftp上传文件和目录
只允许:team1和team2两用户可以上传。 vsftp禁止匿名。
分析:将FTP 和WEB 服务器做在一起是企业经常采用的方法,这样方便实现对网站的维护,为了增强安全性:
- 首先需要使用仅允许本地用户访问,并禁止匿名用户登录。
- 其次使用chroot 功能将team1和team2 锁定在/var/www/html 目录下。
- 如果需要删除文件则还需要注意本地权限。
Vsftpd可以直接使用linux主机的系统用户作为ftp账号,提供基于用户名/密码的登录验证。用户使用系统用户账号登录ftp服务器后,将默认位于自己的家目录中,且对家目录拥有读写权限。
b. 修改配置文件
# 恢复配置文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
# 禁止匿名用户登录
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
# 允许本地用户登录
local_enable=YES
# 启用 chroot 锁定本地用户功能
chroot_local_user=YES
# 启用 chroot 锁定本地用户列表功能
chroot_list_enable=YES
# 本地用户列表保存文件目录
chroot_list_file=/etc/vsftpd/chroot_list
# 锁定本地用户ftp根目录,如果不是设置,默认用户ftp根目录为用户家目录
local_root=/var/www/html
# 锁定用户拥有写权限
allow_writeable_chroot=YES
# ftp 用户限制
userlist_enable=YES
userlist_deny=NO
c. 创建网站根目录
mkdir -p /var/www/html/team{1..2}/ftp
tree /var/www/html
d. 创建用户并设置权限
useradd team1
useradd team2
echo "team1:123456" | chpasswd
echo "team2:123456" | chpasswd
权限设定除了在配置文件设定用户写权限,还必须要让用户对自己的目录拥有读写权限
# team1 用户对 team1/ftp 有rwx权限
setfacl -Rm u:team1:rwx /var/www/html/team1/ftp
# team2 用户对 team2/ftp 有rwx权限
setfacl -Rm u:team2:rwx /var/www/html/team2/ftp# team1用户 不可以访问team2目录
setfacl -Rm u:team1:- /var/www/html/team2
# team2用户 不可以访问team1目录
setfacl -Rm u:team2:- /var/www/html/team1
e. 将用户添加到限制文件
# ftp 用户限制
echo -e "team1\nteam2" >> /etc/vsftpd/user_list# 添加chroot_list文件
echo -e "team1\nteam2" > /etc/vsftpd/chroot_list
cat /etc/vsftpd/chroot_list# 重启服务
systemctl restart vsftpd
f. 使用 Filezilla 测试
6、实战:使用虚拟用户
a. 需求分析
在vsftpd服务器中,使用虚拟用户的主要好处在于,可以将ftp登录账户与系统登录账号分开,用户名、密码都不相同,从而进一步增强ftp服务器的安全性。
需求:公司为了宣传最新的产品信息,计划搭建FTP 服务器,为客户提供相关文档的下载:
- 对所有互联网开放共享目录,允许下载产品信息,禁止上传。
- 公司的合作单位能够使用FTP 服务器进行上传和下载,但不可以删除数据。需要保证服务器的稳定性并做优化。
- 创建ftp虚拟帐号,允许客户使用ftp帐号下载文件。
- 自己的合作伙伴帐号:vip可以上传内部文件
分析:根据企业的需求,对于不同用户进行不同的权限限制,FTP 服务器需要实现用户的审核。需考虑到服务器的安全性,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。
b. 创建虚拟用户数据库:db_load
建立用户文本文件,添加两个虚拟帐号:
- 管理员帐号admin,admin账号有FTP所有权限
- 合作账号帐号vip,vip只能上传和下载文件
- 匿名用户只能下载文件
# 一行用户一行密码
vim /etc/vsftpd/vsftpd_virtualuser.txt
生成虚拟用户数据库文件:保存虚拟帐号和密码的文本文件无法被系统帐号直接调用。我们需要使用db_load 命令生成db数据库文件。
db_load 命令
- 描述:将文本文件生成数据库文件
- 语法:db_load [选项] 文本文件 数据库文件
-T:允许应用程序能够将文本文件转译载入进数据库
-t:hash使用hash码加密
-f:指定包含用户名和密码文本文件。此文件格式:奇数行用户名、偶数行密码
# 查看 db_load 命令的位置,通过rpm查看在个安装包中
rpm -qf `which db_load`
# 安装 db_load 所在的软件包
yum install -y libdb-utils-5.3.21-25.el7.x86_64# 将虚拟用户文本文件 转换为 数据库文件
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
修改数据库文件访问权限:数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗取,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root 用户可读可写。
chmod 600 vsftpd_virtualuser.db
添加虚拟用户的映射账号:Vsftpd服务器对虚拟用户的控制采用了映射的控制方式,将所有的虚拟用户对应到同一个系统用户,该系统用户家目录作为有虚拟用户登录后共用的ftp根目录。因此还需要添加一个对应的系统用户账号(此账号无须设置密码登录shell)
# 因为匿名用户默认家目录为/var/ftp,把virtual用户家目录设为/var/ftp/pub,
# 这样匿名用户和虚拟用户就可以访问相同的ftp根目录
useradd -d /var/ftp/pub -s /sbin/nologin virtual_user# 设置虚拟用户对 /var/ftp/pub 的权限
setfacl -Rm u:virtual_user:rwx /var/ftp/pub
c. vsftpd 服务添加虚拟认证
在vsftpd服务器中,用户认证是通过PAM(pluggable authentication module,可插拔认证模块)机制来实现的, Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证文件。
# 为虚拟用户建立PAM认证文件
vim /etc/pam.d/vsftpd.vuauth required /lib64/security/pam_userdb.sodb=/etc/vsftpd/vsftpd_virtualuseraccount required /lib64/security/pam_userdb.sodb=/etc/vsftpd/vsftpd_virtualuser
- 这里的db=/etc/vsftpd/vsftpd_virtualuser,是pam文件的写法规范,不是真正指向db=/etc/vsftpd/vsftpd_virtualuser 这个文件,而是/etc/vsftpd/vsftpd_virtualuser.db 这个文件中(注意:省略了.db扩展名)
d. 修改 vsftpd.conf 文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
# 开启匿名用户访问,默认匿名用户只有下载权限
anonymous_enable=YES
#开启本地用户映射
local_enable=YES
# 启用上传写入支持
write_enable=YES
# 指定上传权限掩码, 666-022=644
anon_umask=022
# 允许来宾访问
guest_enable=YES
# 允许对ftp根目录有写权限
allow_writeable_chroot=YES
# 指定映射的系统用户名称
guest_username=virtual_user
# 指定新的PAM认证文件
pam_service_name=vsftpd.vu
# 指定虚拟用户权限文件目录
user_config_dir=/etc/vsftpd/vusers_dir
# 指定被动模式的下限端口
pasv_min_port=24500
# 指定被动模式的上限端口
pasv_max_port=24600
# 限制并发客户端最多20个
max_clients=20
# 限制每个ip地址的连接数最多2个
max_per_ip=2
注意事项:
- 从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
。要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,或者你可以在vsftpd的配置文件中增加下列项:allow_writeable_chroot=YES
- vsftpd.conf配置文件中默认存在pam_service_name配置项,建议加#号注释掉或直接修改。
- 在vsftpd服务中,虚拟用户默认作为匿名用户进行处理以降低权限,因此对应的配置项通常以anon_开头。例如,在设置虚拟用户所上文件的默认权限掩码时,应采用的配置项为anon_umask而不是local_umask。
e. 为不同的虚拟用户创建独立的配置文件
在/etc/vsftpd/vusers_dir目录下为不同的用户创建不同的权限文件
mkdir /etc/vsftpd/vusers_dir# 创建admin的配置文件
vim /etc/vsftpd/vusers_dir/admin# 允许用户上传文件anon_upload_enable=YES# 允许用户创建目录anon_mkdir_write_enable=YES# 允许用户删除文件权限anon_other_write_enable=YES# 创建vip的配置文件
vim /etc/vsftpd/vusers_dir/vip# 允许用户上传文件anon_upload_enable=YES# 允许用户创建目录anon_mkdir_write_enable=YES
# 重启 vsftpd 服务
systemctl restart vsftpd