一.FTP介绍
FTP(file transfer protocol):互联网中最老牌的文件传输协议。
FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
- 主要用于互联网中文件的双向传输(上传/下载)、文件共享
- 跨平台 Linux、Windows
- FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输
- FTP的默认端口 21号(命令端口) 20号(数据端口,主动模式下) 默认被动模式下
- FTP程序(软件)vsftpd
FTP软件名称 => vsftpd => vs(very secure ftp daemon)
二.FTP实现
0.环境准备
配置两台主机IP:
client:172.25.254.10
server: 172.25.254.20
# 关闭selinux
# 临时关闭
setenforce 0
# 修改配置文件 永久关闭
vim /etc/selinux/config
SELINUX=disabled
1.vsftpd基本信息
基本信息
服务名称:vsftpd.service
配置目录:/etc/vsftpd/
主配置文件:/etc/vsftpd/vsftpd.conf
默认发布目录:/var/ftp
报错信息
550 程序本身拒绝
553 文件系统权限限制
500 权限过大
530 认证失败
FTP服务的客户端工具
- Linux:ftp、lftp(客户端程序)
- Windows:FlashFXP(虚拟主机)、FileZilla、IE、Chrome、Firefox
- lftp和ftp工具区别:
- lftp:默认是以匿名用户访问
- ftp:默认是以用户名/密码方式访问
- lftp可以批量并且下载目录
2.vsftpd安装及启用
安装及启用:
# 在server端:
yum install vsftpd #安装vsftpd
systemctl enable --now firewalld #假设防火墙开启
systemctl enable --now vsftpd
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-source=172.25.254.10 --zone=trusted
systemctl restart firewalld
测试:
# 方法一:在client端浏览器中输入"ftp://172.25.254.20"
# 方法二:使用lftp工具(没有的话要安装)。
# 使用lftp前必须在server端打开匿名访问!
vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=YES #启动匿名用户的访问功能
systemctl restart vsftpd
lftp 172.25.254.20
# 如果可以列出资源,表示成功,成功后输入"exit"退出
3.FTP匿名用户访问控制
匿名用户访问(client端)
lftp 172.25.254.20
vim /etc/vsftpd/vsftpd.conf
#匿名用户可以登陆
anonymous_enable=YES
#匿名用户家目录控制
anon_root=/test
#匿名用户可以上传
#该设置未打开时上传文件(put /testfile),权限被拒绝,报错550
anon_upload_enable=YES
#匿名用户可以下载不能读的文件
anon_world_readable_only=NO
#匿名用户可以新建目录
anon_mkdir_write_enable=YES
#匿名用户可以删除或重命名
anon_other_write_enable=YES
#用户登陆数量控制
max_clients=2
#匿名用户上传速率控制
anon_max_rate=102400
#匿名用户权限
anon_umask=022
#匿名用户上传文件的用户身份设定
chown_upload=YES
chown_username=student #以student用户身份上传文件
chown_upload_mode=0644
##################################################################
修改配置文件后需要重启服务
systemctl restart vsftpd
##################################################################
4.FTP本地用户访问控制
本地用户(server端):在ftp服务器里是有用户身份的。
lftp 172.25.254.20 -u student
vim /etc/vsftpd/vsftpd.conf
#本地用户可以访问
local_enable=YES
#本地用户家目录控制,默认为该用户的家目录
local_root=/home/student
#本地用户写权限控制
write_enable=YES
#本地用户权限设置,默认为022
local_umask=077
#本地用户上传速率控制
local_max_rate=102400
#锁定用户到自己的家目录中
chroot_local_user=YES
#如果出现500报错
#去除写权限(治标不治本)
chmod a-w /home/student
#核心解决方案,添加一个选项
vim /etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES
##################################################################
修改配置文件后需要重启服务
systemctl restart vsftpd
##################################################################
☆ FTP访问对象控制
/etc/vsftpd/ftpusers为FTP黑名单,在这个文件中的用户永远不能登陆FTP,例如root用户。
/etc/vsftpd/user_list 默认是黑名单(可以成为白名单),在此文件中的用户默认也是不能登陆FTP服务的。那么如何将/etc/vsftpd/user_list变成白名单呢:
vim /etc/vsftpd/vsftpd.conf
# 将此配置设置为NO时,只有user_list中的用户可以登陆FTP服务!
userlist_deny=NO
systemctl restart vsftpd
如果user_list文件是白名单,用户即在ftpusers中又在user_list中,那么ftpusers拒绝优先
5.虚拟用户访问
虚拟用户:在当前的服务器主机系统当中,是没有这个用户存在的身份,只有在ftp程序里才承认这个用户身份的存在。
服务器不可能无数量地新建本地用户,这样既浪费服务器资源,又造成登录用户权限过大而造成系统安全性的问题。所以ftp就不适用系统的认证方式,而是重新为ftp服务来构建认证体系。
☆虚拟用户建立
第一步: 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
vim /etc/vsftpd/ftp_auth_file
user1
123
user2
123
# ftp_auth_file文件不能直接使用,因为添加的认证关系是明文形式 不安全。
db_load -T -t hash -f ftp_auth_file ftp_auth_file.db
# 加密认证文件 -T表示的是transform转换,-t hash :指定hash加密的形式
第二步: 建立用于支持虚拟用户的PAM文件。
vim /etc/pam.d/ftp_auth
account required pam_userdb.so db=/etc/vsftpd/ftp_auth_file
auth required pam_userdb.so db=/etc/vsftpd/ftp_auth_file
vim /etc/vsftpd/vsftpd.conf
pam_service_name=ftp_auth #指定认证策略文件
guest_enable=YES #指定虚拟用户功能开启
guest_username=ftp #指定虚拟用户在ftp服务器上的用户身份
systemctl restart vsftpd
虚拟用户创建好之后,登陆测试发现user1 user2登录进去访问的全部都是同一个目录/var/ftp。
☆虚拟用户家目录的独立设定
# 测试文件:
mkdir -p /virtuserdir/user{1..2}
mkdir /virtuserdir/user{1..2}/pub
touch /virtuserdir/user1/user1file
touch /virtuserdir/user2/user2file
vim /etc/vsftpd/vsftpd.conf
local_root=/virtuserdir/$USER
user_sub_token=$USER
systemctl restart vsftpd
☆虚拟用户配置独立
需求:只有user1可以上传,其他用户不能上传
# 首先关闭用户上传功能
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=NO
chmod 775 /virtuserdir/user{1..3}/pub
chgrp ftp /virtuserdir/user{1..3}/pub
# 建立用户配置目录
mkdir /etc/vsftpd/user_conf
# 写user1用户的配置文件
vim /etc/vsftpd/user_conf/user1
anon_upload_enable=YES
# 指定用户配置目录
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/user_conf
systemctl restart vsftpd
# 重启服务后,只有用户user1可以上传文件。
所有配置参数可以通过"man 5 vsftpd.conf"查询