FTP

FTP

  • FTP简介
  • 原理概述
  • 主动模式
  • 被动模式

FTP配置

  • FTP文件族
  • FTP主配置文件参数详解
  • FTP配置实验(匿名,实体,虚拟)
  • FTP Over SSL

FTP简介

FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一,FTP协议由两个部分组成,其一为FTP服务、其二为FTP客户端,也就是标准的C/S架构

其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器中的目录资源,在网站开发时,通常利用FTP协议将网页或程序上传到FTP服务器上,此外,由于FTP传输效率非常高,所以在网络上传输大的文件时,一般也采用该协议

原理概述

FTP方便地解决了文件的传输问题,FTP已经成为了计算机网络上文件共享的一个标准,FTP服务器中的文件按照目录结构进行组织,用户通过网络与服务器建立连接,FTP仅支持TCP,不支持UDP

FTP支持两种模式,一种方式叫Standard(主动模式),另一种为passive(被动模式),standard模式下客户端发送port命令到FTP服务器,Passive模式下FTP客户端发送PASV命令到FTP服务器,FTP使用两个端口,一个为命令端口,一个为数据端口,通常来说这两个端口分别为21(命令端口),20(数据端口)

主动模式

主动方式的FTP客户端从一个任意非保留端口N(N>1024)连接到FTP服务器的命令端口21,然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,接着服务器会从自己的数据端口(20)连接到客户端指定的数据端口(N+1),主动模式下,服务器端开启的是21(控制端口)与20(数据端口),客户端开启1024以上的端口

FTP_第1张图片

但是这样的模式会碰到问题,也就是当客户端位置位于防火墙之内,而FTP服务器位置位于防火墙之外,那么由FTP服务器主动向客户端发起的连接会被拒绝,因为对于防火墙来说,这是一个未知的Internet主机向内网计算机发起一个高端口TCP链接,这显然是不安全的,所以防火墙一定不会放行该流量,这也就直接导致了客户端无法连接FTP服务器

FTP_第2张图片

被动模式

为了解决服务器发起到客户端的连接出现问题所采取的被动方式,或叫做PASV,当客户端通知服务器处于被动模式时才会启用,在被动方式FTP中,命令连接和数据连接都有客户端发起,当启动一个FTP连接时,客户端打开任意两个非保留端口,(N>1024和N+1),第一个端口用于连接FTP服务器的21端口,但与主动方式的FTP不同,客户端不会提交“port N+1”命令并允许服务器来回连接他的数据端口,而是提交PASV命令,这样做的结果是服务器会开启一个任意的非保留端口(P>1024),并发送“Port P”命令给客户端,然后客户端从本地使用“N+1”端口连接服务器的端口P开始传送数据,此时服务器开启的是21命令端口和一个大于1024的数据端口,客户端则是开启两个大于1024的非保留端口

FTP_第3张图片

使用这样的通信模型便可解决主动模式所带来的问题,因为数据通信由服务器连接客户端转变成了客户端连接服务器,这样一来无论是命令端口还是数据端口,都由客户端主动向服务器发起,这样也就不会被防火墙判定为非法流量了

FTP_第4张图片

Vsftpd文件族

  • /etc/vsftpd/vsftpd.conf

整个Vsftpd软件只有这一个配置文件,这个文件的设置是以bash的变量设置相同的方式来处理的,也就是“参数=设置值”来设置的,需要注意的是,“=”号两边不能有空白,参数与选项之间的“=”号必须连接

  • /etc/pam.d/vsftpd

该文件为vsftpd调用pam模块的配置文件,主要用作身份验证,还具备阻挡部分用户身份的功能

以下就是/etc/pam.d/vsftpd文件中的内容,其中file后面跟的文件,就是起到限制用户登录的作用

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
  • /etc/vsftpd/ftpusers

与上一个文件有关系,也就是PAM模块所调用的阻止用户登录的文件,该文件配置非常简单,只要将你不希望让其登录的那个用户名一行一行的写入该文件即可,从配置文件中可以看出,大部分的系统用户是不可以使用ftp登录的,这也起到了保护系统安全性的作用

root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
  • /etc/vsftpd/user_list

该文件起到的作用于ftpusers几乎一致,但是是否生效取决于vsftpd.conf配置文件中的两个参数,分别为userlist_enable与userlist_deny,也就是说你也同样可以将不允许登录的用户名写入该文件,但是是否发生作用取决于主配置文件中的userlist_deny={YES/NO}

# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
  • /etc/vsftpd/chroot_list

这个文件默认情况下不存在,需要手工创建,该文件可以将某些账号的用户chroot建立在各自的家目录下,但是该文件是否生效取决于主配置文件中的两个参数chroot_list_enable、chroot_list_file,如果你希望将某些实体用户限制在他们的家目录而去不了其他目录,可以添加这个参数

  • /usr/bin/vsftpd

该文件为vsftpd软件的唯一执行文件

  • /var/ftp

该目录默认为匿名用户登录的主目录,与ftp账户所在的家目录有关


主配置文件参数

服务器环境相关参数

  • connect_from_port_20={YES/NO}

数据端口的端口号

  • listen_port=21

命令端口侦听在21

  • dirmessage_enable={YES/NO}

当用户进入某个目录时,会显示出提示文本,本文位于该目录下的.message

  • message_file=.message

当dirmessage_file=YES时,可以设置文件下message信息的文件名

  • listen={YES/NO}

是否将vsftpd运行于stand alone模式,默认是NO

  • pasv_enable={YES/NO}

支持数据流的被动式连接模式,一定要设置为YES

  • use_localtime={YES/NO}

是否使用本地时间,默认使用GMT时间,所以会比中国晚8小时

  • write_enable={YES/NO}

允许用户上传数据

  • connect_timeout=60

在主动模式的连接下,如果发出的命令客户端在60秒内得不到回应,则强行中断连接

  • accept_timeout=60

当用户使用被动模式连接时,服务器开启Passive Port后,60秒的时间内没有接收到客户端的回应,则强制中断连接,这项参数与connect_timeout相似,一个控制主动模式,一个控制被动模式

  • data_connection_timeout=300

如果服务器与客户端之间的数据通道已经成功建立(无论主动被动),但是可能由于线路或其他原因造成在300秒内无法完成数据传输,那么该客户端的连接则会被强制中断

  • idle_session_timeout=300

如果客户端在300秒内没有命令操作,则强制中断连接

  • max_clients=0

规定同一时间内可以有多少台主机连接FTP服务器

  • max_per_ip=0

规定由同一个IP地址可以发出多少个FTP连接

  • pasv_min_port=0、pasv_max_port=0

与被动模式下开启的随机端口号有关,如果你希望使用10000到10009这10个IP地址,那么可以通过配置pasv_min_port=10000,pasv_max_port=10009

如果全为0,则表示随即使用不限制

  • ftpd_banner=文字说明

当用户连接到FTP服务器后,会弹出一些文字来说明该FTP服务器,但是有些场景使用这短短一行文字说并不聊什么,所以可以使用下面的banner_file参数来替代

  • banner_file=/path/file

该项参数可以指定一个纯文本文件,作为用户登录到FTP服务器后弹出的欢迎文字,也可以写入一些关键信息,让用户知晓FTP服务器中的目录结构


实体用户参数

  • guest_enable={YES\NO}

将任何实体账号映射为guest用户默认为ftp用户权限,可通过下条参数修改

  • guest_username=ftp

指定guest用户映射到的真实用户

  • local_enable={YES\NO}

如果为YES,那么只有在/etc/passwd文件内存在的账户才有资格登录

  • local_max_rate=0

实体用户的文件传输速度限制

  • chroot_local_user={YES\NO}

是否将实体用户限制在其用户家目录内,不允许切换至其父目录及其他父目录

  • chroot_list_enable={YES\NO}

是否启用chroot写入列表功能,与下列参数有关,否则设置无效

  • chroot_list_file=/etc/vsftpd/chroot_list

如果上面的参数为YES,那么就可以设置该项目了,这条与上面两条chroot参数是相辅相成的

  • userlist_enable={YES\NO}

是否借助vsftpd的阻挡机制来拒绝用户登录

  • userlist_deny={YES\NO}

该参数只有当userlist_enable=YES时才会生效,若某个用户被列入下条选项中的文件时,那么当用户登录时,则会被拒绝

  • userlist_file=/etc/vsftpd/user_list

若上条参数的值为YES时,该参数有效,被列在该文件内的所有用户,都不被允许登录到FTP服务器


匿名用户配置参数

  • anonymous_enable={YES\NO}

允许匿名用户登录FTP服务器,是所有的匿名用户相关参数生效的前提

  • anon_world_readable_only={YES\NO}

仅允许匿名用户下载可读文件的权限

  • anon_other_write_enable={YES\NO}

是否允许匿名用户具有写入之外的其他权限,包括删除或修改服务器上的文件及文件名等权限

  • anon_mkdir_write_enable={YES\NO}

是否允许匿名用户新建目录

  • anon_upload_enable={YES\NO}

是否允许匿名用户上传数据

  • deny_email_enable={YES\NO}

通过邮箱地址登录FTP服务器也是登录方法之一,使用这个方法可以规定哪些邮箱地址不被允许登录到FTP服务器

  •  banned_email_file=/etc/vsftpd/banned_emails

当上项参数为YES时,可以利用该项目来设置哪些Email-address不允许登录到FTP服务器

  • no_anon_password={YES\NO}

设置为YES时,表示匿名用户跳过密码验证步骤(免密登录)

  • anon_max_rate=0

限制匿名用户传输速率,为0则为不限制,单位为bytes/秒,如果想设置为30KB/S,那就设置为anon_max_rate=30000

  • anon_umask=077

设置匿名用户默认权限,如果为077,那么匿名用户上传或创建的文件目录权限默认为-rw------- 

  • virtual_use_local_privs={YES\NO}

虚拟用户权限是否与本地用户相同,若为NO,将与匿名用户权限相同,在每个虚拟用户配置文件里设置匿名用户的选项等于虚拟用户的权限


系统安全参数

  • ascii_download_enable={YES\NO}

Client优先使用ascii格式下载文件

  • ascii_upload_enable={YES\NO}

Client优先使用ascii格式上传文件

  • one_process_model={YES\NO}

为每一个建立的连接创建一个进程负责,这样可以提高vsftpd的运行效率,但是如果服务器硬件配置不高,很容易耗尽系统资源

  • tcp_wappers={YES\NO}

可以使用TCP wappers做支持

  • xferlog_enable={YES\NO}

将用户的上传于下载文件的操作记录下来

  • xferlog_file=/var/log/xferlog

如果上一个选项为YES的话,该项目才生效,路径为日志的保存地址

  • xferlog_std_format={YES\NO}

是否设置为wu-ftp相同的日志文件格式,默认为NO,因为这样的日志文件比较易读,但如果你有使用wu-ftp的日志分析软件,这一项可以设置为YES

  • dual_log_enable=YES

除了wu-ftp格式的日志外,还有vsftpd独特的日志文件格式

  • vsftpd_log_file=/var/log/vsftpd.log

vsftpd日志文件存储位置

  • nopriv_user=nobody

vsftpd默认以nobody用户作为此服务执行者的权限,因为nobody的权限非常低,就算入侵者通过vsftpd入侵服务器,入侵者也只能取得nobody权限

  • pam_service_name=vsftpd

PAM模块的名称,位于/etc/pam.d/下

匿名模式

配置匿名用户可登录,可创建目录,可上传文件,可删除与重命名文件(最大权限)

cat /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
anon_mkdir_write_enable=YES
anon_world_readable_only=NO
anon_other_write_enable=YES
write_enable=YES
listen=YES
  • 启动vsftpd并设置vsftpd开机启动
systemctl start vsftpd
systemctl enable vsftpd
  • 使用FilleZilla登录测试

FTP_第5张图片

实体用户

我的系统中有两个用户,分别是user1,user2,我希望将user1用户锁定在自己的家目录(/home/user1),而user2用户可以随意访问系统中其他目录

  • 创建两个用户,并分配权限
useradd user1;chown user1:user1 -R /home/user1
useradd user2;chown user2:user2 -R /home/user2
  • 编辑主配置文件/etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
listen=YES
pam_service_name=vsftpd
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
#这条参数,是新版本之后的vsftpd规定,出于安全性考虑,规定了用户的家目录不可以拥有写权限,除非在配置文件中设置该参数且为YES
  • 编辑/etc/vsftpd/chroot_list
vim /etc/vsftpd/chroot_list

user2
  • 重启vsftpd
systemctl restart vsftpd

虚拟用户

虚拟用户可以定义为基于用户做自定义参数权限的匿名用户,正因如此,与匿名用户的机制一样,虚拟用户主目录所在的父级目录不可以拥有写权限,其次虚拟用户必须映射到一个存在的实体用户(宿主用户),但是可以根据虚拟用户配置文件自定义每个虚拟目录自己的主目录在何处

  • 安装vsftpd
yum install vsftpd -y
  • 创建宿主用户
useradd -s /sbin/nologin vftpuser
  • 对主配置文件去注释并编辑
cat /etc/vsftpd/vsftpd.conf | grep -v ^# > /etc/vsftpd/1.cfg;rm -rf /etc/vsftpd/vsftpd.conf && mv /etc/vsftpd/1.cfg /etc/vsftpd/vsftpd.conf;vim /etc/vsftpd/vsftpd.conf
  • 可以删除配置文件内所有内容并填入以下内容
vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
guest_enable=YES
guest_username=vftpuser
user_config_dir=/etc/vsftpd/vftpuser.d/
allow_writeable_chroot=YES
  • 创建chroot_list文件与vftpuser.d目录
touch /etc/vsftpd/chroot_list;mkdir /etc/vsftpd/vftpuser.d/


#chroot_list为空即可,vftpuser.d用于存放匿名用户自定义权限
  • 创建并编辑/etc/vsftpd/vusers.txt
touch /etc/vsftpd/vusers.txt && vim /etc/vsftpd/vusers.txt

##该配置文件是虚拟用户的用户名与密码的数据库
  • 并对配置文件写入如下信息
vuser1
abc.123
vuser2
abc.1234


#奇行为用户名,偶行为用户口令
  • 将文本文件转换为数据库格式
db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db
  • 在根目录下创建虚拟用户家目录的父目录/data,并赋予权限
mkdir -p /data/vuser{1,2};chown vftpuser:vftpuser -R /data;chmod 770 -R /data/vuser{1,2}
  • 在两个虚拟用户的根目录下创建vuser1.txt与vuser2.txt
touch /data/vuser1/vuser1.txt
touch /data/vuser2/vuser2.txt
  • 在/etc/vsftpd/vftpuser.d/目录下创建与虚拟用户同名的文件并输入以下内容
vim /etc/vsftpd/vftpuser.d/vuser1

local_root=/data/vuser1
anon_umask=077 
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

vim /etc/vsftpd/vftpuser.d/vuser2

local_root=/data/vuser2
anon_umask=077 
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
  • 备份/etc/pam.d/vsftpd并修改该文件
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

vim /etc/pam.d/vsftpd

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vusers


#只需要在该文件中写入这两行即可,其他都可删除
  • 重启服务并设置开机自启动
systemctl restart vsftpd
systemctl enable vsftpd
  • 使用FileZilla登录测试

FTP_第6张图片

FTP Over SSL

FTP默认情况下是使用明文传输的,无论是用户名,口令或是数据内容,在这种情况下,就可以使用openssl这个加密函数库,但前提是你的vsftpd必须支持ssl函数库,然后建立证书文件提供给vsftpd使用,这就可以实现加密,而且配置非常简单,接下来是实验演示,认证模式使用实体用户

  • 先搭建一个最简单的实体用户模式的FTP,只需要登陆上来即可
vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
listen=YES
pam_service_name=vsftpd
allow_writeable_chroot=YES
  • 创建user1,user2实体用户并设置密码
echo 123456 | passwd --stdin user1
echo 123456 | passwd --stdin user2
  • 重启vsftpd并登陆测试
systemctl restart vsftpd
  • 开始配置SSL加密,先检查当前版本的vsftpd是否可以支持SSL
ldd $(which vsftpd) | grep ssl
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f5740ef9000)
  • 进入/etc/pki/tls/certs/目录,创建SSL证书
cd /etc/pki/tls/certs/

make vsftpd.pem

umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
.........................................+++
.................................................................+++
writing new private key to '/tmp/openssl.ed8UKs'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:CN
Organization Name (eg, company) [Default Company Ltd]:CN
Organizational Unit Name (eg, section) []:CN
Common Name (eg, your name or your server's hostname) []:www.a.com
Email Address []:[email protected]
  • 将证书文件复制到vsftpd根目录,其权限应该是600
cp -a vsftpd.pem /etc/vsftpd/

ls -l /etc/vsftpd/vsftpd.pem
-rw-------. 1 root root 3072 Dec  1 00:59 /etc/vsftpd/vsftpd.pem
  • 在主配置文件中添加如下参数调用证书
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
  • 当你使用FileZilla再次登录实体用户时,出现这个时就说明已经完成了SSL配置

FTP_第7张图片

☆附注1:如果出现以下报错内容:​​​​​​​

命令:	USER anonymous
响应:	331 Please specify the password.
命令:	PASS *********
响应:	500 OOPS: vsftpd: refusing to run with writable root inside chroot()
错误:	严重错误: 无法连接到服务器

△很有可能是以下原因:

  1. 如果用的是匿名用户,那么无论匿名用户的根目录在何处,其根目录自身权限中的”其他用户”不可具备“写”权限(775)

☆附注2:当你对实体用户做了chroot配置后,登录时如果出现以下报错:

命令:	USER user1
响应:	331 Please specify the password.
命令:	PASS *******
响应:	500 OOPS: vsftpd: refusing to run with writable root inside chroot()

△造成该问题的主要原因就是:在新版本的vsftpd软甲中,出于安全性考虑,被chroot的用户的家目录不可以有写权限,所以解决该问题的方法有两种:

  • 取消用户家目录的写入权限
chmod 550 /home/USERNAME
  • 在配置文件中加入该参数并重启vsftpd(家目录可拥有写权限)
echo "allow_writeable_chroot=YES" >> /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd

你可能感兴趣的:(Centos7)