网络服务搭建篇 其四
前文:
WEB服务器搭建
DNS服务器搭建
DHCP服务器搭建
环境
服务器镜像:Ubuntu 18.04 LTS Server
主机名 | 描述 | IP | |
---|---|---|---|
Server1 | FTP和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
可查看服务运行状态
查看/etc/passwd
文件
发现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/
修改配置文件
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
在FTP客户端中查看
无修改权限
配置虚拟用户
新建一个宿主用户,以便虚拟用户映射到真实用户上。宿主用户设置为不允许登录系统。
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目录下,有预装的
配置虚拟用户
根据目标,我们的虚拟用户主目录在/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
建立虚拟用户配置模板
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访问,可以正常读写
关于实体用户
只保留一个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等同于匿名用户
设定白名单
我们索性限制可以登录的账户,只让所有虚拟用户、匿名用户和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服务
这时不在列表中的用户将直接拒绝访问