FTP文件传输协议_第1张图片

本章内容

FTP文件传输协议介绍

vsftpd服务

实现基于SSLFTPS

vsftpd虚拟用户介绍

实现基于文件验证的vsftpd虚拟用户

实现基于MYSQL验证的vsftpd虚拟用户

 

文件传输协议(FTP

File Transfer Protocol 早期的三个应用级协议之一(另外两个是smtphttp

基于C/S结构

双通道协议:数据和命令连接

数据传输格式:二进制(默认)和文本

两种模式:服务器角度

主动(PORT style):服务器主动连接(不常用,客户端有时会装防火墙)

命令(控制):客户端:随机port --- 服务器:tcp21

数据:客户端:随机port ---服务器:tcp20

被动(PASV style):客户端主动连接

命令(控制):客户端:随机port --- 服务器:tcp21

数据:客户端:随机port ---服务器:随机port

服务器被动模式数据端口示例:

227 Entering Passive Mode (192,168,175,138,224,59)

服务器数据端口为:224*256+59

Windows默认是主动模式,linux默认是被动模式

 

FTP软件介绍

FTP服务器:

Wu-ftpdProftpdPureftpdServUIIS

vsftpd:Very Secure FTP DaemonCentOS默认FTP服务器

高速,稳定,下载速度是WU-FTP的两倍

ftp.redhat.com数据:单机最多可支持15000个并发

客户端软件:

ftplftplftpgetwgetcurl

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)

filezillaCuteFtpFlashFXPLeapFtp

IE ftp://username:password@ftpserver

ftp不支持补齐,lftp支持补齐,lftpgetwgetcurl是非交互式的,wgetcurl还支持http

curl ftp://url -o newfilename

curl ftp://url/f1.sh | bash  #一键安装脚本实现

filezella:免费,既可以当ftp客户端,也可以当ssh客户端

CuteFtpFlashFXPLeapFtp:付费

 

FTP服务

状态码:

1XX:信息 125:数据连接打开

2XX:成功类状态 200:命令OK 230:登录成功

3XX:补充类 331:用户名OK

4XX:客户端错误 425:不能打开数据连接

5XX:服务器错误 530:不能登录

用户认证:

匿名用户:ftp,anonymous,对应Linux用户ftp

系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow

虚拟用户:特定服务的专用用户,独立的用户/密码文件

nsswitch:network service switch名称解析框架

pam:pluggable authentication module 用户认证

/lib64/security /etc/pam.d/ /etc/pam.conf

 

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

系统用户共享文件位置:用户家目录

虚拟用户共享文件位置:为其映射的系统用户的家目录

 

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,指ftp这个客户端工具,但没法照顾包括各浏览器在内的客户端工具,总会有不对的)

 

匿名用户

anonymous_enable=YES 支持匿名用户 no_anon_password=YES(默认NO) 匿名用户略过口令检查 anon_world_readable_only (默认YES)只能下载全部读的文件

anon_upload_enable=YES 匿名上传,注意:文件系统权限

anon_mkdir_write_enable=YES

anon_umask=077 指定匿名上传文件的umask

anon_other_write_enable=YES 可删除和修改上传的文件

ftp的根目录(/var/ftp)默认不允许有写权限,否则登录不上去

指定上传文件的默认的所有者和权限

chown_uploads=YES(默认NO)

chown_username=wind

chown_upload_mode=0644

 

Linux系统用户

guest_enable=YES 所有系统用户都映射成guest用户

guest_username=ftp 配合上面选项才生效,指定guest用户

local_enable=YES 是否允许linux用户登录

write_enable-YES 允许linux用户上传文件

local_umask=022 指定系统用户上传文件的默认权限

local_root=/ftproot 非匿名用户登录所在目录

禁锢所有系统用户在家目录中

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 cloud ftp server"

banner_file=/etc/vsftpd/ftpbanner.txt 优先此项生效

目录访问提示信息

dirmessage_enable=YES (默认)

message_file=.message(默认)信息存放在指定目录下.message

 

使用pam(Pluggable Authentication Modules)完成用户认证

pam_service_name=vsftpd

pam配置文件:/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers 默认文件中用户拒绝登录(因/etc/pam.d/vsftpdpam_listfile.so 这行的sense=deny,改成allow则为白名单)

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

userlist_enable=YES 默认有此设置

userlist_deny=YES(默认值)黑名单,不提示口令,NO为白名单

userlist_file=/etc/vsftpd/users_list 此为默认值

若要root用户登录,则ftpusersusers_list这两个文件都要改

连接限制

max_clients=0 最大并发连接数

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

vsftpd服务指定用户身份运行

nopriv_user=nobody

 

传输速率:字节/

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_download_enable=YES

最好还是用二进制方式传输,否则容易破坏非文本文件的数据

ftp连着时可以自由切换

ftp> ascii

200 Switching to ASCII mode.

ftp> binary

200 Switching to Binary mode.

ftp>

 

配置FTP服务以非独立服务方运行:listen=NO,默认为独立方式

cat /etc/xinetd.d/vsftpd

service ftp

{

flags = REUSE

socket_type = stream

wait = no

user = root

server = /usr/sbin/vsftpd

log_on_failure += USERID

disable = no

}

 

实现基于SSLFTPS

查看是否支持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等工具测试

 

vsftpd虚拟用户

企业中有时候会有这种需求,不同的用户使用不同的用户名密码,以不同的权限访问不同的ftp目录,虚拟用户可用来满足这种需求

虚拟用户:

所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录

各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

虚拟用户帐号的存储方式:

文件:编辑文本文件,此文件需要被编码为hash格式

奇数行为用户名,偶数行为密码

db_load -T -t hash -f vusers.txt vusers.db

关系型数据库中的表中:

实时查询数据库完成用户认证

mysql库:pam要依赖于pam-mysql

/lib64/security/pam_mysql.so

/usr/share/doc/pam_mysql-0.7/README

 

实现基于文件验证的vsftpd虚拟用户

一、创建用户数据库文件

vim /etc/vsftpd/vusers.txt

ftpuser1

centos

ftpuser2

rhel

ftpuser3

111111

cd /etc/vsftpd/

db_load -T -t hash -f vusers.txt vusers.db

chmod 600 vusers.db

 

二、创建用户和访问FTP目录

useradd -r -d /var/ftproot -m -s /sbin/nologin vuser

chmod +rx /var/ftproot/

centos7 还需要执行以下操作:

chmod -w /var/ftproot/

mkdir /var/ftproot/upload

setfacl -m u:vuser:rwx /var/ftproot/upload

 

三、创建pam配置文件

vim /etc/pam.d/vsftpd.db

auth required pam_userdb.so db=/etc/vsftpd/vusers

account required pam_userdb.so db=/etc/vsftpd/vusers

 

四、指定pam配置文件

vim /etc/vsftpd/vsftpd.conf

guest_enable=YES

guest_username=vuser

pam_service_name=vsftpd.db

 

五、SELinux设置:

禁用SELinux 或者 setsebool -P ftpd_full_access 1

 

六、虚拟用户建立独立的配置文件

mdkir /etc/vsftpd/vusers.d/ 创建配置文件存放的路径

vim /etc/vsftpd/vsftpd.conf

user_config_dir=/etc/vsftpd/vusers.d/

cd /etc/vsftpd/vusers.d/ 进入此目录

允许ftpuser1用户可读写,其它用户只读

vim ftpuser1 创建各用户自已的配置文件

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

vim ftpuser2 创建各用户自已的配置文件

local_root=/ftproot 登录目录改变至指定的目录

 

七、测试

ftpuser1配置成功,拥有读写权限

FTP文件传输协议_第2张图片

ftpuser2配置成功,只有只读权限,故上传失败

FTP文件传输协议_第3张图片 

实现基于MYSQL验证的vsftpd虚拟用户

说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器,此处以192.168.30.75作为FTP服务器,以192.168.30.7作为数据库服务器

一、安装所需要包和包组:

在数据库服务器上安装包:

Centos7:在数据库服务器上安装

yum -y install mariadb-server

systemctl start mariadb.service

systemctl enable mariadb

Centos6:在数据库服务器上安装

yum -y install mysql-server

FTP服务器上安装vsftpdpam_mysql

centos6pam_mysqlepel6的源中提供

yum install vsftpd pam_mysql

centos7:无对应rpm包,需手动编译安装

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

编译成功后,在/lib64/security文件夹中会出现pam_mysql.so文件

FTP文件传输协议_第4张图片 

二、在数据库服务器上创建虚拟用户账号

1.建立存储虚拟用户数据库和连接的数据库用户

mysql> CREATE DATABASE vsftpd;

mysql> SHOW DATABASES;

ftp服务和mysql不在同一主机:

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@'192.168.30.%' IDENTIFIED BY 'centos';

ftp服务和mysql在同一主机:

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@localhost IDENTIFIED BY 'centos';

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@'127.0.0.1' IDENTIFIED BY 'centos';

mysql> FLUSH PRIVILEGES;

 

2.准备相关表

mysql> USE vsftpd;

Mysql> SHOW TABLES;

mysql> CREATE TABLE users (

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,

name CHAR(50) BINARY NOT NULL,

password CHAR(48) BINARY NOT NULL

);

mysql>DESC users;

测试连接

mysql -uvsftpd -h 192.168.30.7 -pcentos

mysql> SHOW DATABASES;

 

3.添加虚拟用户

根据需要添加所需要的用户,为了安全应该使用PASSWORD函数加密其密码后存储

mysql>DESC users;

mysql> INSERT INTO users(name,password) values('ftpuser1',password('centos'));

mysql> INSERT INTO users(name,password) values('ftpuser2',password('centos'));

mysql> SELECT * FROM users;

FTP文件传输协议_第5张图片 

三、在FTP服务器上配置vsftpd服务

1.FTP服务器上建立pam认证所需文件

vi /etc/pam.d/vsftpd.mysql 添加如下两行

auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.30.7 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account required pam_mysql.so user=vsftpd passwd=centos host=192.168.30.7 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:参考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=centos 登录mysql的的密码

host=mysqlserver mysql服务器的主机名或ip地址

db=vsftpd 指定连接msyql的数据库名称

table=users 指定连接数据库中的表名

usercolumn=name 当做用户名的字段

passwdcolumn=password 当做用户名字段的密码

crypt=2 密码的加密方式为mysql password()函数加密

 

2.建立相应用户和修改vsftpd配置文件,使其适应mysql认证

建立虚拟用户映射的系统用户及对应的目录

useradd -s /sbin/nologin -d /var/ftproot vuser

chmod 555 /var/ftproot centos7 需除去ftp根目录的写权限

mkdir /var/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服务

service vsftpd start;systemctl start vsftpd

chkconfig vsftpd on;systemctl enable vsftpd

查看端口开启情况

netstat -tnlp |grep :21

 

五、Selinux相关设置:在FTP服务器上执行

restorecon -R /lib64/security

setsebool -P ftpd_connect_db 1

setsebool -P ftp_home_dir 1

chcon -R -t public_content_rw_t /var/ftproot/

 

六、测试:利用FTP客户端工具,以虚拟用户登录验证结果

tail /var/log/secure

 

七、在FTP服务器上配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可

1、配置vsftpd为虚拟用户使用配置文件目录

vim /etc/vsftpd/vsftpd.conf

添加如下选项

user_config_dir=/etc/vsftpd/vusers_config

2、创建所需要目录,并为虚拟用户提供配置文件

mkdir /etc/vsftpd/vusers_config/

cd /etc/vsftpd/vusers_config/

touch ftpuser1 ftpuser2

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=/ftproot 登录目录改变至指定的目录

4、测试

FTP文件传输协议_第6张图片 

Ftp工具

Axel:网络客户端工具

下载安装axel

ftp://172.20.0.1/pub/Sources/6.x86_64/axel/axel-2.4-1.el6.rf.x86_64.rpm

axel -n 3 -o /root ftp://172.20.0.1/pub/ISOs/CentOS/CentOS-7-x86_64-Everything-1804.iso 可以启用并发