欢迎您, 来到 宁时修博客.^_^

Linux系统基础知识 --- 部署 vsftpd 服务

2019/09/19 林木立 Linux 403
Linux上部署 vsftpd 服务

一、vsftpd基础知识

    1、vsftpd简介

    vsftpd 的名字代表"very secure FTP daemon", 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。

     一个例子就是 vsftpd 是在 chroot 模式下工作的,chroot 模式就是为程序(这里就是 vsftpd 了)单独指定一个新的目录,它也就不能访问那个目录之外的程序和文件了 --- 所以这也称为“被锁上的”。一个可能被潜在的攻击者破坏的 FTP 服务器将被从系统的其他部分独立开来,从而避免了更大的损失。


    2、vsftpd的工作模式

    主动模式(PORT):客户端向服务端发送数据端口的信息,由服务端主动连接客户端发送的数据端口。


    被动模式(PASV):服务端开启并发送数据端口的信息给客户端,由客户端连接服务端开启的数据端口,服务端被动接受连接。在被动模式下,需要配置服务端可以开启的数据端口范围。

    

    主动和被动的优缺点:

    主动模式对服务端管理有利,但是对客户端不利,因为服务端通过20端口去连接客户端的大于1024的端口x+1,而这个端口可能被防火墙阻塞了。

    被动模式对客户端管理有利,但是对服务端管理不利,因为客户端在发起数据连接到服务器的大于1024的端口y 连接的时候,而这个端口可能被服务端的防火墙关闭。

    综上:为了提供有效的ftp服务,一般都是使用被动模式,因为服务端的行为是可控的,但是客户端却是有不同的配置,无法控制。


    3、vsftpd有以下三种认证模式

    匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登陆。

    本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来简单。

    虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。



二、安装vsftpd

    执行以下命令,安装 vsftpd服务:

$ yum install -y vsftpd

    进入 /etc/vsftpd 目录,并查看该目录下的文件: 

$ cd /etc/vsftpd/
$ ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

    vsftpd.conf:vsftpd 的核心配置文件。

    ftpusers:黑名单文件,此文件中的用户不允许访问FTP服务器。

    user_list:白名单文件,此文件中的用户允许访问FTP服务器。


# 设置开机自启动
$ systemctl enable vsftpd

# 启动vsftpd服务  
$ systemctl start vsftpd

    vsftpd安装后默认开启了匿名访问FTP服务器的功能。使用匿名访问,无需输入用户名密码即可登录FTP服务器,但没有权限修改或上传文件。



三、匿名开放模式 配置

    匿名访问 FTP 服务器是一种不安全的访问模式,任何人无需密码验证就可以登录到FTP服务器,这种模式一般只用来保存不重要的公开文件,不推荐在生产环境中使用。


    1、修改配置文件/etc/vsftpd/vsftpd.conf

    修改为如下参数:

anonymous_enable=YES      # 启用匿名访问模式
anon_upload_enable=YES    # 允许匿名用户上传文件
anon_mkdir_write_enable=YES  # 允许匿名用户创建目录
anon_other_write_enable=YES  # 允许匿名用户重命名、删除等操作
anon_umask=022               # 匿名用户上传文件的umask值,默认为077
anon_root=/data/anon         # 匿名用户的FTP根目录

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

    没有就添加进去,也可选择性添加什么参数进去。


    2、创建并授权匿名用户的 FTP 根目录,匿名用户就是ftp

$ mkdir /data/anon/pub -p

$ chown -R ftp /data/anon/pub

# 也可以选择这样做
$ chmod o+w /data/anon/pub


    3、重启 vsftpd服务,重新加载配置文件。

$ systemctl restart vsftpd


    然后用户可以匿名访问 ftp服务器了,并且可以上传、创建、删除操作。



四、本地用户模式 配置

    本地用户登录是指使用Linux操作系统的账号和密码登录FTP服务器。vsftpd安装后默认只支持匿名访问FTP服务器,如果您试图使用本地用户登录服务器,将会被vsftpd服务拒绝。


    1、创建一个 Linux系统用户,并指定 用户家目录。

    这个用户最好是不能登录 Linux系统,所以设置默认 shell 是 /sbin/nologin。

$ useradd -d /data/ftpuser -s /sbin/nologin ftpuser
$ echo "ftpuser123" | passwd --stdin ftpuser

    这是 第一种 方式,可以将 用户家目录当成 用户存放文件的根目录,所以指定 用户家目录路径。


    我比较 倾向第二种方式,不用 用户的家目录,另建目录做为FTP根目录。

    步骤:

$ useradd -s /sbin/nologin ftpuser
$ echo "ftpuser123" | passwd --stdin ftpuser


    2、创建并授权 本地用户的 FTP根目录

$ mkdir /data/test
$ chown -R ftpuser.ftpuser /data/test


    3、修改配置文件/etc/vsftpd/vsftpd.conf

    修改为如下参数:

anonymous_enable=NO     # 关闭匿名访问模式
local_enable=YES        # 接受本地用户
write_enable=YES        # 可以上传(全局控制)
local_umask=022         # 本地用户上传文件的umask值
local_root=/data/test   # 指定本地用户的FTP根目录
chroot_local_user=YES   # 将用户权限禁锢在FTP目录
allow_writeable_chroot=YES   # 允许对FTP根目录执行写入操作

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

   

    vsftpd默认是主动模式,可以设置为 被动模式,添加如下参数:

pasv_enable=YES      #开启被动模式
pasv_min_port=50000  #设置被动模式下,建立数据传输可使用port范围的最小值
pasv_max_port=50100  #设置被动模式下,建立数据传输可使用port范围的最大值

    建议把端口范围设在比较高的一段范围内,例如50000-50100,有助于提高访问FTP服务器的安全性。


    4、重启 vsftpd服务,重新加载配置文件。

$ systemctl restart vsftpd



五、虚拟用户模式 配置

    1、创建用于FTP认证的用户数据库文件,即虚拟用户名和密码 文件。

    格式:“一行用户名,一行口令”。

$ vim /etc/vsftpd/virtuser.txt
ADgo
test12345
xuansdf
testxuan123


    明文信息不安全,使用 db_load 命令用哈希(hash)算法将明文信息转换成数据文件,然后将明文信息文件删除。

$ db_load -T -t hash -f /etc/vsftpd/virtuser.txt /etc/vsftpd/virtuser.db
$ file /etc/vsftpd/virtuser.db 
/etc/vsftpd/virtuser.db: Berkeley DB (Hash, version 9, native byte-order)
$ chmod 600 /etc/vsftpd/virtuser.db

    -T:允许应用程序能够将文本文件转译载入数据库。由于是将虚拟用户的信息存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。如果指定了选项-T,那么一定要追跟子选项-t。

    -t:追加在-T选项后,用来指定转译载入的数据库类型。-t可以指定的数据类型有Btree、Hash、Queue和Recon数据库。这里指定的是Hash型。

    -f:指定虚拟用户文件。


    如果需要增删虚拟用户时,需要重新执行一遍 db_load 命令使其生效。


    2、建立用于支持虚拟用户的PAM文件

    PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

    新建一个用于虚拟用户认证的PAM文件 vsftpd.vu,其中PAM文件内的“db=”参数为使用 db_load 命令生成的账户密码数据文件的路径,但不用写数据文件的后缀。

$ vim /etc/pam.d/vsftpd.vu
auth     required     pam_userdb.so  db=/etc/vsftpd/virtuser
account  required     pam_userdb.so  db=/etc/vsftpd/virtuser

    上一步建立的数据库 virtuser.db 在此处被使用,建立的虚拟用户将采用 PAM 方式进行验证,这是通过 /etc/vsftpd/vsftpd.conf 文件中的参数 pam_service_name=vsftpd.vu 来启用的。


    3、创建虚拟用户映射的系统本地用户和FTP根目录

    虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。它们的总体权限其实是集中寄托在一个在系统中的某一个用户身上的,所谓vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户。由于他支撑了FTP的所有虚拟的用户,那么他本身的权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要非分注意对该用户的权限的控制,该用户也绝对没有登陆系统的必要,这里也设定它为不能登陆系统的用户。

$ useradd virtualuser -d /data/ftproot -s /sbin/nologin


    4、修改配置文件/etc/vsftpd/vsftpd.conf

    修改为如下参数:

anonymous_enable=NO     # 关闭匿名访问模式
local_enable=YES        # 接受本地用户
write_enable=YES        # 可以上传(全局控制)
local_umask=022         # 本地用户上传文件的umask值
local_root=/data/ftproot   # 指定本地用户的FTP根目录
chroot_local_user=YES   # 将用户权限禁锢在FTP目录
allow_writeable_chroot=YES   # 允许对FTP根目录执行写入操作

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd.vu  # 指定PAM文件名
userlist_enable=YES
tcp_wrappers=YES

pasv_enable=YES      #开启被动模式
pasv_min_port=50000  #设置被动模式下,建立数据传输可使用port范围的最小值
pasv_max_port=50100  #设置被动模式下,建立数据传输可使用port范围的最大值

guest_enable=YES     # 开启虚拟用户模式
guest_username=virtualuser # 指定虚拟用户对应的系统用户
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vuserconf  # 指定虚拟用户配置文件目录


    5、虚拟用户配置

    创建两个虚拟用户配置文件

$ mkdir /etc/vsftpd/vuserconf
$ touch /etc/vsftpd/vuserconf/ADgo
$ touch /etc/vsftpd/vuserconf/xuansdf


    6、重启vsftpd服务

$ systemctl restart vsftpd


    两个虚拟用户就可以访问 FTP服务器了。



六、vsftpd.conf 内一些参数

listen=<YES/NO> :设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)

listen_port=<port> :设置控制连接的监听端口号,默认为21

listen_address=<ip address> :将在绑定到指定网络接口的IP地址运行,适合多网卡

connect_from_port_20=<YES/NO> :若为YES,则强迫FTP-DATA的数据传送使用port 20,默认YES

pasv_enable=<YES/NO> :是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> :设置被动模式后的数据连接端口范围在n和m之间,建议为50000-60000端口

message_file=<filename> :设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> :设置使用者进入某个目录时是否显示由message_file指定的文件内容

ftpd_banner=<message> :设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> :设置用户连接服务器后的显示信息存放在指定的filename文件中

connect_timeout=<n> :如果客户机连接服务器超过N秒,则强制断线,默认60
accept_timeout=<n> :当使用者以被动模式进行数据传输时,服务器发出passive port指令等待客户机超过N秒,则强制断线,默认60
accept_connection_timeout=<n> :设置空闲的数据连接在N秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在N秒后中断,默认300

max_clients=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> :在独立启动时限制客户机每IP的连接数,0表示无限制(不知道是否跟多线程下载有没干系)

local_enable=<YES/NO> :设置是否支持本地用户帐号访问
guest_enable=<YES/NO> :设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> :是否开放本地用户的写权限
download_enable=<YES/NO>: 是否允许下载文件
local_umask=<nnn> :设置本地用户上传的文件的生成掩码,默认为077
local_max_rate<n> :设置本地用户最大的传输速率,单位为bytes/sec,值为0表示不限制
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录

chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot,限制本地用户活动范围为 FTP根目录。
chroot_list_enable=<YES/NO> 
chroot_list_file=<filename> :当chroot_local_user=NO 且 chroot_list_enable=YES时,只有filename文件指定的用户可以执行chroot

anonymous_enable=<YES/NO> :设置是否支持匿名用户访问
anon_max_rate=<n> :设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> :设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> :设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)
anon_umask=<nnn> :设置匿名用户上传的文件的生成掩码,默认为077
anon_root=/var/ftp:匿名用户的FTP根目录


xferlog_enable=YES:启用日志记录
xferlog_std_format=YES
xferlog_file=/var/log/xferlog:日志存放路径,可自定义

chown_uploads=YES
chown_username=root: 当chown_uploads=YES,配置chown_username=root,会使上传的文件所有者被改为root,匿名用户的ftp用户就无法读取,下载了


参考1:https://blog.51cto.com/andyxu/2168875

参考2:https://wiki.ubuntu.org.cn/Vsftpd#.E5.AE.89.E8.A3.85

点赞
说说你的看法

所有评论: (0)