FTP工作原理介绍
文件传输协议:File Transfer Protocol 早期的三个应用级协议之一,基于C/S结构
数据传输格式:二进制(默认)和文本
双通道协议:命令和数据连接
两种模式:从服务器角度
- 主动(PORT style):服务器主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port <—服务器:20/tcp - 被动(PASV style):客户端主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port —> 服务器:随机port /tcp
范例:服务器被动模式数据端口
227 Entering Passive Mode (172,16,0,1,224,59)
服务器数据端口为:224*256+59
FTP服务状态码:
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
常见 FTP 相关软件
FTP服务器端软件
Wu-ftpd,Proftpd,Pureftpd,Filezilla Server,Serv-U,Wing FTP Server,IIS
vsftpd:Very Secure FTP Daemon,CentOS 默认FTP服务器
高速,稳定,下载速度是WU-FTP的两倍
ftp.redhat.com数据:单机最多可支持15000个并发
vsftpd官网:https://security.appspot.com/vsftpd.html
注:vsftpd官网上不去,自己想想办法
Filezilla官网:FileZilla - The free FTP solution
客户端软件:
ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A 主动模式 –p 被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
gftp:GUI centos5 最新版2.0.19 (11/30/2008),官网:https://www.gftp.org/
filezilla,FTP Rush,CuteFtp,FlashFXP,LeapFtp
浏览器 ftp://username:password@ftpserver
vsftpd 软件介绍
由 vsftpd 包提供,不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd
启动服务相关文件:
/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
配置文件:
/etc/vsftpd/vsftpd.conf
帮助:man 5 vsftpd.conf
配置文件格式:
option=value
注意:= 前后不要有空格
用户和其共享目录
- 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
- 系统用户共享文件位置:用户家目录
- 虚拟用户共享文件位置:为其映射的系统用户的家目录
FTP匿名登录默认路径
/var/ftp/pub
配置文件
/etc/vsftpd/vsftpd.conf
指令格式 directive=value
查看所有配置指令
# man vsftpd.conf
# 全局权限
write_enable=no 所有用户都不能上传
listen_port=21 命令连接的监听端口
max_clients=2000 最近连接并发数(0:表示无限制)
max_per_ip 每个IP所允许发起的最大连接数
ftpd_banner=Welcome to ftp.lingyima.com Server !
# 用户可登录设置
userlist_enable 服务启用时加载一个由userlist_file指令指定的用户列表文件;
此文件中的用户是否能够访问vsftpd服务,
取决于userlist_deny指令
no:默认
userlist_file=/etc/vsftpd/user_list 用户列表文件
userlist_deny=YES default 此列表文件为黑名单,不需要输入密码
userlist_deny=NO 此列表为白名单
/etc/vsftpd/ftpuser 输入密码
# 文本传输,影响效率(二进制文件?)
#ascii_upload_enable=YES
#ascii_download_enable=YES
# 目录消息
dirmessage_enable=YES 用户第一次切换进入目录时,
vsftpd会查看.message文件的内容显示给用户
message_file=.message 指定dirmessage_enable命令的查看的文件路径,
而不使用默认的.message
# vim /var/ftp/upload/.message
anonymous login succesful
hello world
# ftp IP
ftp> cd upload
250-anonymous login succesful
250-hello world
250 Directory successfully changed.
# 数据传输日志
xferlog_enable=YES 是否开启传输日志文件
xferlog_file=/var/log/xferlog 传输日志文件
xferlog_std_format=YES 是否使用标准传输日志格式
# 数据传输模式
connect_from_port_20=NO 是否启用PORT模式
# 会话超时时长
idle_session_timeout=300 空闲会话超时时长(second)
connect_timeout=60 PORT模式下,服务器连接客户端的超时时长
data_connection_timeout=200 数据传输的超时时长
# 匿名用户默认配置
anonymous_enable=NO 是否使用匿名用户登录(默认yes,注意也是yes)
anon_upload_enable=NO 匿名用户(ftp用户)的上传操作
生效依赖于write_enable=yes
上传的文件映谢于ftp用户权限
anon_mkdir_write_enable=YES 匿名用户创建目录权限
anon_other_write_enable=YES 匿名用户删除及重命名操作权限
# 匿名用户上传文件的属主
chown_uploads=NO 修改匿名用户上传文件的属主
chown_username=root 启用chown_uploads指令时,
将文件属主修改为指令指定的用户;默认为root
chown_upload_mode=0600 设定匿名用户上传的文件的权限;默认为600
anon_max_rate 匿名用户的最大传输速率
# 本地用户默认配置
local_enable=NO 所有的非匿名的生效,都依赖于此指令
是否使用本地用户登录
开放匿名用户:NO
开放本地用户和虚拟用户:YES
local_umask=022 本地用户上传文件的权限掩码(文件666:644,目录777:775)
其它用户umask为077
local_max_rate=0 本地用户的传输速率,单位是字节;默认是0表示无限制
# 禁锢用户设置
chroot_local_user=YES 禁锢所有本地用户在其家目录下
注意:2.3.5之后,vsftpd增强了安全检查,要求用户不能对家目录有写权限 chmod a-w /home/username
或者:allow_writeable_chroot=YES
chroot_list_enable=YES 禁锢指定用户于家目录中,列表文件中的用户都被禁锢,,其他用户没有被禁锢
chroot_list_file=/etc/vsftpd/chroot_list 指定禁锢用户文件路径
1. 所有用户都被禁锢
chroot_local_user=YES
#chroot_list_enable=YES
2. chroot_list 禁锢黑名单
chroot_local_user=YES
chroot_list_enable=YES
只有chroot_list 文件的用户没被禁锢
3. chroot_list 禁锢白名单
chroot_local_user=NO 或 #chroot_local_user=NO
chroot_list_enable=YES
只有chroot_list 文件的用户被禁锢
Client Command
bi 使用binary传输模式
ha 显示hash进度
rm -[rw]
-r recurseive
-f work quietly
mv old new
实验:实现基于SSL的FTPS
yum -y install vsftpd.x86_64
查看是否支持SSL
ldd `which vsftpd` 查看到libssl.so
创建自签名证书
cd /etc/pki/tls/certs/
make vsftpd.pem
openssl x509 -in vsftpd.pem -noout –text
配置vsftpd服务支持SSL: /etc/vsftpd/vsftpd.conf
ssl_enable=YES 启用SSL
allow_anon_ssl=NO 匿名不支持SSL
force_local_logins_ssl=YES 本地用户登录加密
force_local_data_ssl=YES 本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
用filezilla等工具测试
实验:实现基于MYSQL验证的vsftpd虚拟用户
实验在两台CentOS主机上实现,一台做为FTP服务器,一台做DB服务器
一、安装所需要包和包组:
在数据库DB服务器上安装包:
• Centos7:在数据库服务器上安装
yum –y install mariadb-server
systemctl start mariadb.service
systemctl enable mariadb
在FTP服务器上安装vsftpd和pam_mysql包,需手动编译安装
yum -y groupinstall "Development Tools"
yum -y install mariadb-devel pam-devel vsftpd
下载pam_mysql-0.7RC1.tar.gz
http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-pam-mods-dir=/lib64/security
make
make install
二、在数据库服务器上创建虚拟用户账号
mysql >
create database vsftpd;
use vsftpd;
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
insert users (name,password) value('ftpuser1',password('centos'));
insert users (name,password) value('ftpuser2',password('centos'));
grant select on vsftpd.users to vsftpd@'172.25.0.%' identified by 'centos';
flush privileges;
三、在FTP服务器上配置vsftpd服务
1.在FTP服务器上建立pam认证所需文件
注意:参考README文档,选择正确的加密方式
crypt是加密方式, 0表示不加密, 1表示crypt(3)加密, 2表示使用mysql
password()函数加密, 3表示md5加密, 4表示sha1加密配置字段说明
• auth 表示认证
• account 验证账号密码正常使用
• required 表示认证要通过
• pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
• user=vsftpd为登录mysql的用户
• passwd=magedu 登录mysql的的密码
• host=mysqlserver mysql服务器的主机名或ip地址
• db=vsftpd 指定连接msyql的数据库名称
• table=users 指定连接数据库中的表名
• usercolumn=name 当做用户名的字段
• passwdcolumn=password 当做用户名字段的密码
• crypt=2 密码的加密方式为mysql password()函数加密
vi /etc/pam.d/vsftpd.mysql 添加如下两行
auth required pam_mysql.so user=vsftpd passwd=centos host=172.25.0.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=centos host=172.25.0.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
2.建立相应用户和修改vsftpd配置文件,使其适应mysql认证
# 建立ftp虚拟用户映射成操作系统用户及对应的目录
# vuser登录后默认路径为 /data/ftproot
useradd -s /sbin/nologin -d /data/ftproot vuser
# 除去ftp根目录的写权限
chmod 555 /data/ftproot
mkdir /data/ftproot/{upload,pub}
setfacl –m u:vuser:rwx /var/ftproot/upload
# 确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
# 添加下面两项
# 修改下面一项,原系统用户无法登录
guest_enable=YES
guest_username=vuser
#
pam_service_name=vsftpd.mysql
四、启动vsftpd服务
systemctl restart vsftpd
查看端口开启情况
netstat -tnlp |grep :21
五、测试:利用FTP客户端工具,以虚拟用户登录验证结果
• tail /var/log/secure
六、在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访
问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任
意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
• 1、配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
# 添加如下选项
user_config_dir=/etc/vsftpd/vusers.d/
• 2、创建所需要目录,并为虚拟用户提供配置文件
和数据库中用户名同名ftpuser1 ftpuser2
mkdir /etc/vsftpd/vusers.d/
• 3、配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。
如要让用户ftpuser1具有上传文件的权限,
可修改/etc/vsftpd/vusers_config/ftpuser1 文件,
在里面添加如下选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
local_root=/data/ftproot2 登录目录改变至指定的目录
vim /etc/vsftpd/vusers.d/ftpuser1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim /etc/vsftpd/vusers.d/ftpuser2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/ftproot2