FTP 服务

   FTP是早期的应用级协议之一,是一种基于C/S结构的双通道协议。
   可以作为FTP服务器的软件有很多,比如Wu-ftpd,Proftpd,Pureftpd,ServU,IIS,都可以。其中vsftpd是CentOS默认的FTP服务器。也是我们今天的主角,接下来将会进行重点介绍。
  既然是一种C/S结构的应用,有服务端就会有客户端。在Linux平台上可以作为FTP客户端的软件也有很多,诸如ftp,lftp,lftpget,wget,curl等。在Windows上也有很多的图形界面客户端,例如 filezilla,CuteFtp,FlashFXP,LeapFtp 等。

FTP 用户认证

FTP 的用户一共有三种类型

  • 匿名用户:ftp,anonymous,对应Linux用户ftp
  • 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
  • 虚拟用户:特定服务的专用用户,独立的用户名/密码文件

VSFTPD服务

  • vsftpd 服务,由vsftpd包提供,直接使用yum安装就可以。
  • 用户认证配置文件:/etc/pam.d/vsftpd
  • 服务脚本: /usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftp
  • 配置文件:/etc/vsftpd/vsftpd.conf
  • 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
  • 系统用户共享文件位置:用户家目录
  • 虚拟用户共享文件位置:为其映射的系统用户的家目录

VSFTPD服务配置

vsftpd 服务配置 大多数都在配置文件/etc/vsftpd/vsftpd.conf中,所以我们的大部分配置只要修改这个文件就可以。

查看帮助文档

可以使用man命令查看配置文件的帮助文档,查看有哪些选项是我们需要的,以及各种值分别代表什么含义。

man 5 vsftpd.conf

命令端口

ftp默认端口是21端口,如果配置文件中没有明确指定的话,就是21端口。当然也可以明确指定,或者指定为别的端口。在配置文件中添加下面这一行就可以。

listen_port=21

主动模式端口

ftp 的链接方式有两种,分别是主动模式和被动模式。这两种模式都是从服务器的角度来查看和定义的。

# 这这里的选项一直定义为YES就可以。
# 如果不写这一行,默认的也是YES
connect_from_port_20=YES 

# 如果要重新定义主动模式的端口为其他的值的话,那就再加上下面行,并指定端口值
ftp_data_port=2020

被动模式端口范围

linux客户端默认使用被动模式,windows 客户端默认使用主动模式。在配置文件中加入下面两行,代表可以定义被动模式的端口范围。

pasv_min_port=6000 
pasv_max_port=6010

# 如果这个属性指定为0的话,那么就随机分配
pasv_min_port=0

使用当地时间

设置是否使用当地时间。默认就是YES.

use_localtime=YES

匿名用户

是否支持匿名用户

# YES 支持匿名用户
anonymous_enable=YES

匿名用户略过口令检查,默认为no。如果为YES的时候,匿名用户登陆时,不会提示用户名和密码,直接登陆。如果为NO的话,匿名用户登陆时还是会提示输入密码,只不过,系统不会再去验证密码的正确性。系统默认的匿名账户有两个,分别是ftp和anonymous。

no_anon_password=YES

匿名上传。首先,文件系统上用户的家目录,要具备写权限。其次,ftp服务器要开启允许匿名上传的配置。也就是说,ftp用户的家家目录需要进行配置权限。

anon_upload_enable=YES

匿名用户能够创建目录。这一点与匿名上传一样,不仅需要注意服务的配置,同时需要注意用户的家目录权限。

anon_mkdir_write_enable=YES

默认只能下载全部读的文件。这句话的意思是说,如果启动了这句话,则匿名用户只能下载所有用户都具备读权限的文件。如果有一个文件,有一个用户不剧本读权限,匿名用户就不能够下载。

anon_world_readable_only=YES

匿名用户能否删除和修改上传的文件。默认是no,也就是不可以。

anon_other_write_enable=YES

**指定匿名上传文件的umask值。**umask的值可以直接影响到上传文件的权限。

anon_umask=077

指定上传文件的默认的所有者和权限。 完成了这些指定之后,匿名用户上传的元数据就是我们指定的那些内容。

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

系统用户

默认情况下,操作系统的账户是可以直接使用用户名和密码来登陆的。并且登陆成功之后,默认进入到了自己的家目录。

所有系统用户都映射成guest用户,但是映射的guest账户,需要人为地去指定下。同时这个guest账户与匿名账户类似,不允许家目录具有写权限,否则容易导致安全隐患。

guest_enable=YES

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

是否允许Linux用户登陆,默认是允许的,当然也可以禁止。

local_enable=YES

是否允许Linux用户上传文件,如果用户默认允许登陆的话,linux用户登陆成功之后,默认位于自己的家目录,这时是允许上传文件的。 如果将下面的这句话,改成no,则服务拒绝linux用户上传文件,即便位于自己的家目录也不可以。

write_enable=YES

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

local_umask=022

非匿名用户登录所在目录,当使用Linux用户登陆成功之后,就不会默认在自己的家目录了。相反,会位于下面指定的目录里。

local_root=/ftproot

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

禁锢所有的用户在家目录中的意思是说,用户登陆成功之后,不能够随意切换目录,只能够在自己的家目录中进行操作。 服务默认是NO,也就是不禁锢,这样的话,有比较大的安全隐患。

chroot_local_user=YES

禁锢或者不禁锢特定的用户

可以针对某一些用户进行单独的设置,例如对某一些用户进行禁锢,而对另外一些用户进行禁锢。
/etc/vsftpd/chroot_list文件中,指定需要做出特殊处理的用户。当chroot_list_enable选项为YES的时候,列表中的用户不被禁锢。而不在列表中的用户则被禁锢。反之,则相反。

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

wu-ftp日志:默认启用

wu-ftp日志,默认安装,默认启用。

xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成

vsftpd日志:默认不启用

vsftpd日志,默认不启用,如果想要启用的话,应该手动进行配置修改。

#使用vsftpd日志格式,默认不启用
dual_log_enable=YES 
#(默认)可自动生成
vsftpd_log_file=/var/log/vsftpd.log

登录提示信息

登陆提示信息图形界面是看不到的,只适用于ftp作为客户端的时候。可以使用下面的方式来进行配置。但是优先级却不一样。

ftpd_banner=“welcome to mage ftp server"

# 这一句话优先生效
banner_file=/etc/vsftpd/ftpbanner.txt

目录访问提示信息

当用户进入到某一个目录之后,可以给用户一个提示消息。用来提示这个目录的作用。在相应的目录下建立一个隐藏文件 .message,在该文件中进行信息提示描述。

dirmessage_enable=YES (默认)
message_file=.message(默认)

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

pam模块是Linux中的一种安全验证机制。所以vsftpd也可以根据pam模块进行用户的认证。
pam的配置文件/etc/pam.d/vsftpd,在这个文件中指定了默认文件/etc/vsftpd/ftpusers 默认文件中用户拒绝登录.
而vaftpd配置文件中,定义了pam模块。

pam_service_name=vsftpd

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

在黑名单中的用户,连密码提示都没有。

# 默认有此设置
# YES的时候启用了userlist
userlist_enable=YES

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

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

连接限制

链接限制,可以指定链接用户的最大数量,也就是最大的并发链接数。

# 最大并发连接数
# 如果为0的话,默认不限制
max_clients=0 

# 每个IP同时发起的最大连接数
# 如果为0的话,则默认不限制数量
max_per_ip=0

vsftpd服务指定用户身份运行

vsftpd服务启动时要开启相应的进程,那么相应的进程就有一定的用户身份。如果指定了,那么服务启动之后,就会以指定的用户来启动服务进程。

nopriv_user=nobody

限定传输速率:字节/秒

如果在上传和下载的过程中,没有对速率进行限制,很容易对服务器造成损坏。所以最好进行一下限定。注意单位是 字节

# 匿名用户的最大传输速率
# 如果为0的话,则默认不限制
anon_max_rate=0 

# 本地用户的最大传输速率
# 如果为0的话,则默认不限制
local_max_rate=0

限定链接时间:秒

指定用户连接到ftp服务器上的时间。时间单位是,这样做的好处是,如果用户连接到服务器之后,却不做任何操作的话,很容易浪费资源。这样是一种浪费。

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

优先以文本方式传输

文件在传输的过程中,可以指定是以文本方式传输,还是以二进制的方式传输。默认是以二进制的形式进行传输。
这里有一点需要注意,如果指定了以文本方式传输的话,Linux平台和Windows平台对文本的处理方式是不一样的,打个比方说,Linux平台上回车符是一个字节,但是在Windows的平台上是两个字节,也就是CRLF,这样也就导致,如果在Windows平台上使用客户端从Linux上FTP服务器下载文件,Windows会自动对文本进行转化的,反之也是一样。
如果我们传输一个二进制文件的话,二进制文件应该就会被破坏掉。

ascii_upload_enable=YES
ascii_download_enable=YES

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

FTP服务既可以作为独立服务运行,也可以作为非独立服务进行运行。所谓非独立服务,指的就是使用xinetd服务代替FTP服务来监听21端口,当有用户访问FTP服务的时候,xinetd服务就会自动启动FTP服务,并提供给用户访问。
listen=YES,表示以独立的服务运行,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
}

实现基于SSL的FTPS

FTP服务,默认用户登陆时的口令是明文的。这样很容易被获取到,那么vsftpd服务是否支持SSL来进行加密呢?

查看是否支持SSL

# 使用下面的命令能够查看到是否支持SSL
# 查看到libssl.so
ldd `which vsftpd`

创建自签名证书

# 进入到证书路径
cd /etc/pki/tls/certs/
# 使用下面的命令生成证书私钥和证书
make vsftpd.pem

openssl x509 -in vsftpd.pem -noout –text

配置vsftpd服务支持SSL:/etc/vsftpd/vsftpd.conf

#  启用SSL
ssl_enable=YES 
#  匿名不支持SSL
allow_anon_ssl=NO 
#  本地用户登录加密
force_local_logins_ssl=YES 
#  本地用户数据传输加密
force_local_data_ssl=YES
#  指定证书路径
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem

vsftpd虚拟用户

虚拟用户
  所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录。
  各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定。
虚拟用户帐号的存储方式:
   文件:编辑文本文件,此文件需要被编码为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

ftp1    用户名
ftp1pass  密码
tom     用户名
tompass 密码


# 进入到相应的目录下
cd /etc/vsftpd/

# 创建数据库文件
db_load -T -t hash -f vusers.txt vusers.db

# 修改数据库权限
chmod 600 vusers.db

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

虚拟用户访问FTP服务器的时候,要进入到自己的家目录下,但是系统中没有虚拟账户所对应的账号家目录,所以我们要创建一个系统用户,与虚拟账户关联起来,这样,当虚拟用户登陆之后,就会进入到我们创建的系统用户的家目录,然后进行数据访问。
对于CentOS7,家目录有写权限,用户在登陆的时候会出错的。所以要做一些特殊处理

# 创建系统用户并指定家目录
useradd -d /var/ftproot -s /sbin/nologin vuser
# 修改家目录权限
chmod +rx /var/ftproot/  

#CentOS 7 中要做出一些特殊的配置 

# 去掉家目录写权限
chmod -w /var/ftproot/

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

三、创建pam配置文件

修改vsftpd的pam模块的配置文件/etc/pam.d/vsftpd.db ,让vsftpd支持pam模块进行身份验证。

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

四、指定pam配置文件

修改vsftpd的配置文件/etc/vsftpd/vsftpd.conf ,给vsftpd指定pam模块。

guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db

五、SELinux设置

如果对SELinux有什么特殊要求的话,可以单独对SELinux进行设置,如果没有特殊要求的话,直接禁用SELinux就可以。

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

在vsftpd的配置文件中指定,用户配置文件的存储路径,然后在/etc/目录下,创建相应的目录,并且在目录中定义与用户名一致的配置文件并写入相应权限就可以了。
在vsftpd的配置文件 /etc/vsftpd/vsftpd.conf 中指定如下路径.

user_config_dir=/etc/vsftpd/vusers.d/

在etc目录下,创建如下的文件目录,这一个目录与前面在vsftpd配置文件中定义的一致。

mdkir /etc/vsftpd/vusers.d/

进入到/etc/vsftpd/vusers.d/ 目录下,创建与用户名同名的配置文件,例如用户为tom,那么就创建一个与tom一致的配置文件。 将下面的内容,写入配置文件,就可以进行权限控制。

# 虚拟用户上传权限
anon_upload_enable=YES
# 虚拟用户创建文件夹
anon_mkdir_write_enable=YES
# 虚拟的其他用户对指定用户目录的写权限
anon_other_write_enable=YES

或者还可以改变用户的默认登陆目录。也就是FTP用户登陆成功之后的默认路径。

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