使用vsftpd搭建FTP服务器

网络服务搭建篇 其四

前文:
WEB服务器搭建
DNS服务器搭建
DHCP服务器搭建

环境

服务器镜像:Ubuntu 18.04 LTS Server

主机名描述IP
Server1FTP和DHCP服务器192.168.200.10有外网权限

目标

提供FTP服务,建立以下用户:

用户名账户类型描述目录路径权限
anonymous匿名用户无需账户登陆,只有指定目录读取权限/srv/ftp/public仅可读
user1虚拟用户仅对指定目录可见/srv/ftp/user1可读可写
user2虚拟用户仅对指定目录可见/srv/ftp/user2可读可写

并配置其它用户都不能登录FTP

ftpadmin用户使用命令行或sftp管理FTP目录

相关知识

vsftpd

​ vsftpd (very secure FTP daemon) 是一个被广泛Unix类系统上的轻量级、稳定和安全的FTP服务器程序。它提供了丰富的权限控制、传输和安全选项。

三种用户类型

vsftpd提供了三种用户类型:

匿名用户

匿名用户是默认不需要进行账户认证的用户,它对所有人公开。一般使用匿名用户分发公开文件,有时也接受公众的文件上传。

本地用户

本地用户是Linux系统中的实体用户,他被定义在/etc/passwd文件下,受到系统管理。vsftp在本地用户可用的情况下,默认本地用户默认可以使用FTP访问它在用户权限下的所有资源。vsftpd也可以通过配置限制本地用户的活动目录。配置文件中以local_开头的配置项都和本地用户有关。

虚拟用户

虚拟用户是仅限于vsftp中的用户,他们的权限继承自一个本地用户。vsftp可以很方便地对虚拟用户进行个性化的配置。并且由于其的虚拟性,就算vsftpd组件被攻击,这些用户也不会影响到其它本地用户。

PAM

PAM是Linux系统的一个用户认证框架。PAM 将程序开发与认证方式进行分离,程序在运行时调用附加的“认证”模块完成自己的工作。本地系统管理员通过配置选择要使用哪些认证模块。

Linux的权限管理机制

Linux系统的基本权限包括读(r)、写(w)和执行(x),而其权限控制粒度有拥有者、群组和其它组三种。这些权限和粒度能够组成九种基本的权限控制选项。

每种粒度权限使用一个三位的二进制串标识,从高为起分别为rwx,也可用一个八进制数字来表示。三种粒度组合在一起的三个八进制字符,从高为起分别为拥有者、群组、其他组。

此外,Linux还有一些扩展的ACL策略,如我们需要单独给一个用户授予某文件的访问权限,可用setfacl命令管理:

setfacl -m u:username:wrx file

使用getfacl命令可以获得一个文件或目录的访问策略。

SFTP

SSH文件传输协议(SSH File Transfer Protocol) 也称安全文件传送协议(Secret File Transfer Protocol),是一数据流连线,提供文件访问、传输和管理功能的网络传输协议。它使用安全信道进行传输,有相较于FTP更好的安全性。一般来说,SFTP协议的数据都通过SSH或TLS信道进行传输。对于本地用户,推荐使用SFTP代替FTP。

配置

安装

sudo apt install vsftpd -y

启动服务

sudo service vsftpd start

使用service vsftpd status可查看服务运行状态

1557664405654

查看/etc/passwd文件

1557664566748

发现ftp用户的主目录是/srv/ftp。这也是当前FTP匿名账户登录后的根目录

配置匿名用户

重新配置目录

我们将匿名账户目录更改到/srv/ftp/public目录下

使用管理员账户编辑/etc/passwd文件

ftp:x:113:115:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin

修改为ftp:x:113:115:ftp daemon,,,:/srv/ftp/public:/usr/sbin/nologin

新建/srv/ftp/public目录并修改所有者

sudo mkdir /srv/ftp/public/
sudo chown root.ftp /srv/ftp/public/

1557665379049

修改配置文件

Ubuntu18的vsftpd的配置文件在/etc/vsftpd.conf

备份原始配置文件并重新创建

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo nano /etc/vsftpd.conf

输入以下配置

#设定Vsftpd服务工作在StandAlone模式下
listen=YES
#关闭IPv6的listen,避免端口冲突
listen_ipv6=NO
#设定本地用户可以访问。
local_enable=YES
#设定开启目录标语功能。
dirmessage_enable=YES
#使用本地时间而不是UTC
use_localtime=YES
#让系统自动维护上传和下载的日志文件
xferlog_enable=YES
#设定主动式连接使用的端口号(ftp-data)
connect_from_port_20=YES
#设定支持TCP Wrappers
tcp_wrappers=YES

#允许匿名用户
anonymous_enable=YES
#设置匿名用户的根目录
anon_root=/srv/ftp/public

保存并应用配置

重启服务

sudo service vsftpd restart
service vsftpd status

/srv/ftp/public下建立一个空文件

sudo touch /srv/ftp/public/aaa

1557668268989

在FTP客户端中查看

1557668441701

无修改权限

1557668493160

配置虚拟用户

新建一个宿主用户,以便虚拟用户映射到真实用户上。宿主用户设置为不允许登录系统。

Tips:这步可免,可以直接用ftp用户

useradd virtualhost -s /sbin/nologin

建立虚拟用户配置文件存放目录

sudo mkdir -p /etc/vsftpd/virtualconf

建立虚拟用户数据库

安装db-util安装数据库支持工具

sudo apt install db-util -y

建立一个虚拟用户名单文件,用来记录虚拟用户的用户名和口令数据。为了方便将其放在/etc/vsftpd/目录下

sudo nano /etc/vsftpd/virtusers

编辑这个文件,按一行用户名,一行密码的格式写入用户名和口令

user1
123
user2
456

保存后生成数据库文件

sudo db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

设定PAM验证文件

我们编辑vsftp的PAM验证文件,引入上节提到的数据库。配置文件是/etc/pam.d/vsftpd,即vsftpd.cond中的pam_service_name

使用管理员权限备份并编辑文件

sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
sudo nano /etc/pam.d/vsftpd

在文件开头加入以下信息:

#%PAM-1.0
auth    sufficient      /lib/x86_64-linux-gnu/security/pam_userdb.so     db=/etc/vsftpd/virtusers
account sufficient      /lib/x86_64-linux-gnu/security/pam_userdb.so     db=/etc/vsftpd/virtusers

以上两条的内容是对虚拟用户的安全和帐户权限进行验证。

  • auth是指对用户的用户名口令进行验证。
  • accout是指对用户的帐户有哪些权限哪些限制进行验证。
  • sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
  • /lib/x86_64-linux-gnu/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
  • db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。

如果找不到pam_userdb.so这个库文件的话可以用以下命令来找:

sudo find / -name pam_userdb.so

一般来说都在/lib目录下,有预装的

1557670175249

配置虚拟用户

根据目标,我们的虚拟用户主目录在/srv/ftp/

建立虚拟用户的FTP目录,并修改所属组,赋予775权限

sudo mkdir /srv/ftp/user1 /srv/ftp/user2
sudo chgrp ftp /srv/ftp/user1 /srv/ftp/user2
sudo chmod 775 /srv/ftp/user1 /srv/ftp/user2

1557673414943

建立虚拟用户配置模板

sudo nano /etc/vsftpd/virtualconf/vconf.tmp

输入以下内容

local_root=/srv/ftp/virtuser
#指定虚拟用户的具体主路径。
anonymous_enable=NO
#设定不允许匿名用户访问。
write_enable=YES
#设定允许写操作。
local_umask=002
#设定上传文件权限掩码。
anon_upload_enable=NO
#设定不允许匿名用户上传。
anon_mkdir_write_enable=NO
#设定不允许匿名用户建立目录。
idle_session_timeout=600
#设定空闲连接超时时间。
data_connection_timeout=120
#设定单次连续传输最大时间。
max_clients=10
#设定并发客户端访问个数。
max_per_ip=5
#设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。
local_max_rate=50000
#设定该用户的最大传输速率,单位b/s。

这里的配置能够覆盖/etc/vsftpd.conf中的配置,不过对于单用户不需要指定太多的配置,注意是一些流量控制和指定虚拟用户的FTP主路径就可以了。

配置虚拟用户,从配置模板文件复制

sudo cp /etc/vsftpd/virtualconf/vconf.tmp /etc/vsftpd/virtualconf/user1
sudo cp /etc/vsftpd/virtualconf/vconf.tmp /etc/vsftpd/virtualconf/user2

根据不同用户策略对各用户的配置文件进行修改,尤其注意修改local_root。如把user1的修改为local_root=/srv/ftp/user1

修改vsftpd配置文件

对核心配置文件进行修改

###基本设置###
#设定Vsftpd服务工作在StandAlone模式下
listen=YES
#关闭IPv6的listen,避免端口冲突
listen_ipv6=NO
#设定本地用户可以访问。
local_enable=YES
#设定开启目录标语功能。
dirmessage_enable=YES
#使用本地时间而不是UTC
use_localtime=YES

# 设定开启目录标语功能。
dirmessage_enable=YES
# 设定Vsftpd的登陆标语。
ftpd_banner=Welcome to blah FTP service.

#让系统自动维护上传和下载的日志文件
xferlog_enable=YES
# 设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。
# 必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主
# 用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,
# 否则服务将启动失败。
# xferlog_file=/var/log/xferlog
#设定日志使用标准的记录格式。
# xferlog_std_format=YES

#设定主动式连接使用的端口号(ftp-data)
connect_from_port_20=YES
#设定支持TCP Wrappers
tcp_wrappers=YES
#打开PASV
pasv_enable=YES

#设定支持ASCII模式的上传和下载功能。
ascii_upload_enable=YES
ascii_download_enable=YES

#支持异步传输
async_abor_enable=YES

###权限设置###
#设定禁止上传文件更改宿主。
chown_uploads=NO
#禁止用户登陆FTP后使用"ls -R"的命令。
#该命令会对服务器性能造成巨大开销。
#如果该项被允许,那么当多用户同时使用该命令时将会对该服务器造成威胁。
ls_recurse_enable=NO
#设置本地用户的chroot,启用后会话将被限制在指定的目录
chroot_local_user=YES
#允许chroot了的根目录写入,否则访问会保存
allow_writeable_chroot=YES
#设定文件上传后的权限掩码
local_umask=022
#设定本地可进行写操作
write_enable=YES

###匿名用户设置###
#允许匿名用户
anonymous_enable=YES
#设置匿名用户的根目录
anon_root=/srv/ftp/public
#禁止匿名用户上传
anon_upload_enable=NO
#禁止匿名用户创建目录
anon_mkdir_write_enable=NO


# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty

###虚拟用户配置###
#启用虚拟用户
guest_enable=YES
#指定宿主用户
#guest_username=ftp
#设定虚拟用户的权限符合他们的宿主用户。
virtual_use_local_privs=YES
#设定PAM服务下Vsftpd的验证配置文件名
pam_service_name=vsftpd
#设定虚拟用户个人Vsftp的配置文件存放路径
user_config_dir=/etc/vsftpd/virtualconf

#排除用户被chroot
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list

保存并重启服务

使用user1访问,可以正常读写

1557673471422

关于实体用户

只保留一个ftpadmin做管理使用,其它用户一律不能登录ftp

添加ftpadmin用户,将其主要组指定为ftp组,主目录为/srv/ftp,设定密码为789

sudo useradd ftpadmin -g ftp -s /bin/bash -d /srv/ftp
sudo passwd ftpadmin

由于匿名用户的公共目录/srv/ftp/public应用组的w权限后FTP登录匿名账户会因chroot问题无法访问,所以使用配置扩展ACL的方法授权ftpadmin用户的目录访问

sudo setfacl -m u:ftpadmin:wrx /srv/ftp/public/

ftpadmin现在可以使用sftp协议做到对/srv/ftp目录的完全控制

[注] SFTP上的umask是022,所以建立文件或目录时注意将其权限设置成775

此时所有的实体用户登录到FTP等同于匿名用户

1557675613177

设定白名单

我们索性限制可以登录的账户,只让所有虚拟用户、匿名用户和ftpadmin用户可登录FTP

/etc/vsftpd.conf添加以下配置

###本地用户限制###
#启用用户列表
userlist_enable=YES
#NO:白名单模式(YES是黑名单模式)
userlist_deny=NO
#用户列表存放文件
userlist_file=/etc/vsftpd/allow_user_list

新建/etc/vsftpd/allow_user_list并加入以下内容:

anonymous
ftpadmin
user1
user2

重启vsftpd服务

这时不在列表中的用户将直接拒绝访问

1557676893202

参考资料

https://blog.csdn.net/aiynmimi/article/details/77012507

官方FAQ

官方文件配置说明

Last modification:June 8th, 2019 at 04:16 pm

Leave a Comment