FTP文本传输协议及常见配置

FTP文本传输协议

FTP工作模式

FTP有两种工作模式:主动模式(标准模式或standard)和被动模式(pasv模式)。FTP将命令和数据分开传输,因此FTP工作时有两个端口,命令端口和数据端口

主动模式:FTP服务器接收命令时处于TCP21端口,传输数据时,服务器开放20端口主动连接客户端的端口,连接客户端的端口是客户端通过命令传输端口传给服务器端。
被动模式:FTP服务器接收命令时处于TCP21端口,传输数据时,服务器通过命令端口将服务器接收数据的端口发送给客户端,客户端通过随机端口主动连接服务器(相对服务器,就是被动连接)。
两种模式:从服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port <—服务器:20/tcp
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port —> 服务器:随机port /tcp

FTP连接时会看到如下,说明当前处于被动模式

227 Entering Passive Mode (172,16,0,1,224,59) 

而服务器数据端口协商的公式为:X256+Y,如上就是224224+59

FTP服务状态码

1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录

用户认证

FTP有三种用户认证方式:
1.匿名验证,通过ftp或者anonymous登录,密码随意,则为匿名登录,匿名用户登录后会映射为ftp用户,共享位置为ftp家目录:/var/ftp
2.系统用户,还可以使用系统中存在的用户进行登录,默认共享目录为用户的家目录
3.虚拟用户,自建的FTP用户则成为虚拟用户,虚拟用户的密码可以通过db文件或者mysql数据库存放,需指定映射的用户及共享目录。

常见 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个并发

客户端软件
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)
filezilla,FTP Rush,CuteFtp,FlashFXP,LeapFtp
IE ftp://username:password@ftpserver

vsftpd软件

vsftpd在linux中由 vsftpd 包提供,自centos7后不再由xinetd管理
依赖于pam模块进行身份验证,配置文件:/etc/pam.d/vsftpd
通过rpm -ql vsftpd可以查到软件包重要的文件:
启动服务相关文件
/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
配置文件:
/etc/vsftpd/vsftpd.conf

vsftpd常见配置

命令端口

listen_port=21

主动模式端口

connect_from_port_20=YES 主动模式端口为20
ftp_data_port=20 (默认) 指定主动模式的端口

被动模式端口范围

linux    客户端默认使用被动模式
windows 客户端默认使用主动模式
pasv_min_port=6000 (0为随机分配)
pasv_max_port=6010

使用当地时间

use_localtime=YES 使用当地时间(默认为NO,使用GMT),尽量保持默认,否则可能出现共享目录内的文件的时间状态发生变化

匿名用户登录

anonymous_enable=YES 支持匿名用户
no_anon_password=YES 匿名用户略过口令检查 , 默认NO

匿名用户上传

anon_upload_enable=YES 启用匿名用户上传功能,需注意:文件系统权限,否则可能哪怕ftp支持,系统不支持也无法正常上传
anon_mkdir_write_enable=YES 匿名建目录
anon_world_readable_only 只能下载全部读的文件, 默认YES
anon_umask=0333 指定匿名上传文件的umask,默认077
anon_other_write_enable=YES 可删除和修改上传的文件, ,默认NO
建议不启用,由安全风险

指定匿名用户的上传文件的默认的所有者和权限

chown_uploads=YES 默认NO
chown_username=wang
chown_upload_mode=0644

Linux系统用户

local_enable=YES  是否允许linux用户登录
write_enable=YES  允许linux用户上传文件
local_umask=022   指定系统用户上传文件的默认权限

将系统用户或虚拟用户映射为指定的guest用户

guest_enable=YES	所有系统用户都映射成guest用户
guest_username=ftp	配合上面选项才生效,指定guest用户
local_root=/dir 	guest用户登录所在目录

禁锢系统用户

禁锢所有系统在家目录中
chroot_local_user=YES 禁锢系统用户,默认NO,即不禁锢
禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
chroot_list_enable=YES 
chroot_list_file=/etc/vsftpd/chroot_list
当chroot_local_user=YES时,则chroot_list中用户不禁锢
当chroot_local_user=NO时,则chroot_list中用户禁锢
如果不禁锢,则系统用户默认的根目录为系统的根目录,可以查看到所有有权限的目录,建议启用

日志

wu-ftp日志:默认启用
xferlog_enable=YES 启用记录上传下载日志,此为默认值
xferlog_std_format=YES 使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog 可自动生成, 此为默认值
vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值

登录提示信息

ftpd_banner="welcome to mage ftp server"	直接指定登录提示
banner_file=/etc/vsftpd/ftpbanner.txt		将提示写入文件中,通过文件方式展示

如果要在每个目录访问提示信息则启用下列参数:
dirmessage_enable=YES 此为默认值
message_file=.message 信息存放在指定目录下.message ,此为默认值

PAM模块实现用户访问控制

pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录
配置文件如下:如果sense将deny改为allow,则效果相反
[root@localhost/etc/vsftpd/vsftpd.d]$cat /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required	pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required	pam_shells.so
auth       include	password-auth
account    include	password-auth
session    required     pam_loginuid.so
session    include	password-auth

是否启用控制用户登录的列表文件

vsftpd自带的访问控制,通过以下参数和特定的文件可以指定用户是否允许登录
userlist_enable=YES 					此为默认值
userlist_deny=YES(默认值) 				黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list	此为默认值

vsftpd服务指定用户身份运行

nopriv_user=nobody 此为默认值

连接数限制

max_clients=0 	最大并发连接数
max_per_ip=0	每个IP同时发起的最大连接数

传输速率,字节/秒

anon_max_rate=0 	匿名用户的最大传输速率
local_max_rate=0 	本地用户的最大传输速率

连接时间:秒为单位

connect_timeout=60 			主动模式数据连接超时时长
accept_timeout=60	 		被动模式数据连接超时时长
data_connection_timeout=300 数据连接无数据输超时时长
idle_session_timeout=60 	无命令操作超时时长

优先以文本方式传输

ascii_upload_enable=YES  上传以ascii编码方式
ascii_download_enable=YES	下载以ascii编码方式

使用SSL为FTP加密

创建自签证书
通过下列方式的自签会将私钥与公钥均写在证书中,因此只需要配置此自签证书即可(centos7有效,centos8没有makefile文件,可以从7上拷贝)

[root@localhost/etc/vsftpd/vsftpd.d]$cd /etc/pki/tls/certs/
[root@localhost/etc/pki/tls/certs]$ls
ca-bundle.crt  ca-bundle.trust.crt  make-dummy-cert  Makefile  renew-dummy-cert
[root@localhost/etc/pki/tls/certs]$make vsftpd.pem

配置参数

注:选项后不能加任何字符包括空格
#vim /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 
#rsa_private_key_file /path/file #此项如果没有指定,私钥也在证书文件中 
ssl_tlsv1=YES 
ssl_sslv2=NO 
ssl_sslv3=NO 
require_ssl_reuse=NO 
ssl_ciphers=HIGH

通过filezilla测试成功
在这里插入图片描述

基于MySQL验证实现vsftpd虚拟用户

原理:vsftpd的虚拟用户的验证用户和密码均存放于mysql中,但是vsftpd本身不支持,所以通过支持的pam模块来调用mysql。

1.配置数据库
在mysql中创建vsftpd虚拟用户需要的数据库h和表

MariaDB [(none)]> create database vuser;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use vuser;
Database changed

创建表

MariaDB [vuser]> create table vuser(id int  primary key not null auto_increment,name char(50) binary not null,password char(48) binary not null);
Query OK, 0 rows affected (0.01 sec)

MariaDB [vuser]> show tables;
+-----------------+
| Tables_in_vuser |
+-----------------+
| vuser           |
+-----------------+
1 row in set (0.01 sec)

授权登录vsftpd中pam模块登录mysql的用户和密码

MariaDB [vuser]> grant all on vuser.* to vuser@'192.168.7.%' identified by 'sa1234';
Query OK, 0 rows affected (0.00 sec)

插入数据生成vsftpd虚拟用户的用户名和密码

MariaDB [vuser]> insert into vuser(name,password) values('thomas',password('sa1234'));
Query OK, 1 row affected (0.01 sec)

MariaDB [vuser]> insert into vuser(name,password) values('thomas1',password('sa1234'));
Query OK, 1 row affected (0.00 sec)

MariaDB [vuser]> insert into vuser(name,password) values('thomas2',password('sa1234'));
Query OK, 1 row affected (0.01 sec)

2.编译安装pam_mysql
/lib64/security为pam动态库存放的路径,如果不指定,将会报错。

安装相关包 
yum install vsftpd gcc gcc-c++ make mariadb-devel pam-devel

#下载pam-mysql源码进行编译 
#下载pam_mysql-0.7RC1.tar.gz 
wget 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

编译完成即可生成对应的动态库

[root@localhost/etc/pki/tls/certs]$ll /lib64/security/pam_mysql.*
-rwxr-xr-x 1 root root    882 Dec 18 17:23 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141768 Dec 18 17:23 /lib64/security/pam_mysql.so

3.手动配置pam_mysql
原本pam的身份验证是基于/etc/pam.d/vsftp文件,现修改为基于MySQL的vsftpd.mysql。

[root@localhost/etc/pki/tls/certs]$cat /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vuser passwd=sa1234 host=192.168.7.170 db=vuser table=vuser usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vuser passwd=sa1234 host=192.168.7.170 db=vuser table=vuser usercolumn=name passwdcolumn=password crypt=2

配置文件参考创建数据库时的各个信息
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()函数加密

4.配置vsftp.conf
将pam_service_name=vsftpd
修改为pam_service_name=vsftpd.mysql,即修改验证虚拟用户的方式

新增以下两个选项,保证虚拟用户登录有可以映射为系统上的账号(此时还未创建)

guest_enable=YES 
guest_username=vuser

5.创建虚拟用户验证成功后的映射系统账户与共享目录

useradd -r -s /sbin/nologin -d '/data/vuser'  vuser

由于共享目录的根目录不允许有W权限,在其子目录下创建新的文件夹upload
并通过访问控制权限给vuser账户rwx权限

mkdir /data/vuser/upload
setfacl -Rm u:vuser:rwx /data/vuser/upload

此时在数据库中的所有用户均可以正常访问共享目录,但是仅具有r权限,无法上传、删除和修改共享目录的文件

6.配置特定用户权限
修改vsftpd.conf配置文件,新增此参数,

user_config_dir=/etc/vsftpd/vsftpd.d  #表示可以在vsftpd.d下为每个用户创建各自的权限

创建文件夹,并授权可以上传、删除和修改的权限

mkdir /etc/vsftpd/vsftpd.d/
[root@localhost/etc/pki/tls/certs]$cat /etc/vsftpd/vsftpd.d/thomas
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
#对于thomas这个虚拟用户,家目录为/data/vuser/,拥有upload目录的读写主席那个权限
[root@localhost/etc/pki/tls/certs]$cat /etc/vsftpd/vsftpd.d/thomas2
local_root=/data/thomas2dir
#对于thomas2这个用户,修改了可访问的目录为/data/thomas2dir

总结

1.vsftpd软件的配置是相当多,很难将其全部记住,重点需要掌握虚拟用户的创建与共享文件权限控制、修改pam的验证方式。
2.每个共享目录的家目录对于映射的用户而言是拒绝拥有W权限的,否则将无法登录。
3.系统用户需要确认是否将其禁锢到指定的家目录中,否则可以访问除家目录以外的文件,并不妥当。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值