本文档描述了如何搭建FTP服务器,共享公司文件并对各用户实现严格的文件权限控制。
1.设备及环境准备
服务器 | 硬盘 | U盘 |
---|---|---|
Dell C610或其他 | 4块300GB做两组Raid1 | 做Redhat7.5安装盘 |
2.系统安装,并配置
2.1 系统安装
①服务器插上系统安装U盘,开机选择从U盘启动,安装RHEL7.5
②安装语言选择English(United States),
③时区选择 Asia Shanghai
④LANGUAGE SUPPORT勾选简体中文(中国)
⑤最小化安装Minimal install
⑥分区方案:
挂载点 | 容量(557.75GB) |
---|---|
/home | 21.24 GiB |
/boot | 512MiB |
/ | 32 GiB |
/var | 500 GiB |
swap | 4096 MiB |
这里分给/var 500GB,是因为把通过FTP传输的文件保存在/var/ftproot/
⑦关闭KDUMP Kdump is disabled
2.2 相关配置
2.2.1 设置固定IP
# vi /etc/sysconfig/network-scripts/ifcfg-em1
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" #设置静态ip
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="em1"
UUID="7131983c-e50c-4b14-90f2-2111e37844e3"
DEVICE="em1" #网口名
ONBOOT="yes" #每次开机都会生效
IPADDR=192.168.98.16 #ip地址
PREFIX=24 #子网掩码
GATEWAY=192.168.98.1 #网关
2.2.2 设置DNS
# vi /etc/resolv.conf
nameserver 210.22.70.3 #DNS1
nameserver 210.22.84.3 #DNS2
2.2.3 配置主机名
# vi /etc/hostname
FTPserver
2.2.4 配置hosts文件
# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.98.16 FTPserver
2.2.5 配置本地yum源
①上传rhel-server-7.5-x86_64-dvd.iso镜像到/home目录下;
②创建/mnt/cdrom目录,用于挂在iso镜像;
# mkdir /mnt/cdrom
③修改/etc/fstab文件,添加如下内容:
# vi /etc/fstab
/home/rhel-server-7.5-x86_64-dvd.iso /mnt/cdrom iso9660 defaults 0 0
# mount –a #挂载fstab文件中的设备
④创建rhel.repo文件,并添加:
# vi /etc/yum.repos.d/rhel.repo
[CDROM]
name=isofile
baseurl=file:///mnt/cdrom
enable=1
gpgcheck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
⑤运行yum clean all,安装gcc测试下:
# yum clean all
# yum install gcc
3.开始搭建
一切准备就绪,开始搭建FTP服务
3.1 安装vsftpd服务程序
# yum install vsftpd
3.2 设置iptables
#systemctl stop firewalld #停止firewall
#systemctl mask firewalld #屏蔽firewall
#yum install iptables-services #安装iptables服务
#systemctl enable iptables #开启iptables自启动
#systemctl restart iptables #重启iptables服务
#service iptables save #保存iptables防火墙规则
# iptables –F #清空iptables防火墙的默认策略
# service iptables save #把当前已经被清理的防火墙策略状态保存下来
3.3 vsftpd配置文件
# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak #备份vsftpd.conf文档
# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf #过滤注释,重新保存文件
# cat /etc/vsftpd/vsftpd.conf #输出vsftpd.conf中的内容
anonymous_enable=YES #允许匿名用户访问
local_enable=YES #允许本地用户登录FTP
write_enable=YES
local_umask=022 #本地用户上传文件的umask值
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
3.4 选用认证模式
vsftpd的三种认证模式:匿名开放模式,本地用户模式,虚拟用户模式。这里选用最安全的虚拟用户模式。
3.4.1 配置账号密码
# cd /etc/vsftpd/ #进入/etc/vsftpd/目录
# vi vuser.list #创建用于认证的用户数据库文件,其中奇数行为账户名,偶数行为密码
liwenbin #账号
111111 #密码
zhaohuiyang #账号
111111 #密码
# db_load -T -t hash -f vuser.list vuser.db #将明文文件转换成数据库文件
# file vuser.db #查看文件类型
# chmod 600 vuser.db #设定文件所有者权限
# rm -f vuser.list #删除vuser.list
3.4.2 创建虚拟用户
创建虚拟用户映射的系统本地用户。让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。
为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为用来存放经常发生改变的数据/var目录。
# useradd -d /var/ftproot -s /sbin/nologin virtual #创建不允许登录的virtual用户,并指定其家目录为/var/ftproot
# ls -ld /var/ftproot/ #列出该目录的详细列表信息
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
# chmod -Rf 755 /var/ftproot/ #设定该目录下所有文件及目录755权限,部分设定失败也不要显示错误信息。
3.4.3 使用PAM认证
# vim /etc/pam.d/vsftpd.vu #新建一个用于虚拟用户认证的PAM文件vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser #不用写数据库文件的后缀
account required pam_userdb.so db=/etc/vsftpd/vuser
3.4.4 配置vsftpd.conf
# vim /etc/vsftpd/vsftpd.conf #修改vsftpd.conf文件
anonymous_enable=NO #禁止匿名访问模式
local_enable=YES #允许本地用户模式
guest_enable=YES #开启虚拟用户模式
guest_username=virtual #指定虚拟用户账户
allow_writeable_chroot=YES #允许对FTP根目录执行写入操作,而且接受用户的登录请求
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu #指定PAM文件
userlist_enable=YES
tcp_wrappers=YES
3.4.5 设定账号的权限
# mkdir /etc/vsftpd/vusers_dir/
# cd /etc/vsftpd/vusers_dir/
# touch zhaohuiyang
# vim liwenbin
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022 #上传时,文件属性缺省值为644,创建目录属性缺省值为755
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
3.4.6 重启vsftpd服务
# systemctl restart vsftpd
# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-
user.target.wants/vsftpd.service
3.4.7 配置SELinux
# getsebool -a | grep ftp
ftp_home_dir –> off
ftpd_anon_write –> off
ftpd_connect_all_unreserved –> off
ftpd_connect_db –> off
ftpd_full_access –> off
ftpd_use_cifs –> off
ftpd_use_fusefs –> off
ftpd_use_nfs –> off
ftpd_use_passive_mode –> off
httpd_can_connect_ftp –> off
httpd_enable_ftp_server –> off
sftpd_anon_write –> off
sftpd_enable_homedirs –> off
sftpd_full_access –> off
sftpd_write_ssh_home –> off
tftp_anon_write –> off
tftp_home_dir –> off
# setsebool -P ftpd_full_access=on
4.使用Filezilla客户端测试
通过测试发现,liwenbin账号,对/目录具有创建、删除目录和文件,上传下载文件的权限。
而zhaohuiyang账号配置文件内容为空白,不能创建、删除目录和文件,可以下载别人的文件,不能上传自己的文件。
如果仅让zhaohuiyang账号拥有文件的创建,上传,下载权限
则,修改/etc/vsftpd/vusers_dir/zhaohuiyang
anon_upload_enable=YES
#anon_mkdir_write_enable=YES # 用”#”号注释掉,使其不生效
#anon_other_write_enable=YES # 用”#”号注释掉,使其不生效
anon_umask=022
5.使用SSL/TLS加固FTP
FTP(文件传输协议)在传输数据时不会对数据进行加密。这就造成了数据服务器的安全风险。这里使用 SSL/TLS证书保护Vsftpd服务,对FTP服务器手动启用数据加密服务。
5.1 生成SSL/TLS证书和密钥
在 /etc/ssl目录下创建用于保存 SSL/TLS 证书和密钥文件的子目录:
# mkdir /etc/ssl/private
然后运行下面的命令为 vsftpd 创建证书和密钥并保存到一个文件中,下面会解析使用的每个选项。
req - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 - X.509 证书数据管理。
days - 定义证书的有效日期。
newkey - 指定证书密钥处理器。
rsa:2048 - RSA 密钥处理器,会生成一个 2048 位的密钥。
keyout - 设置密钥存储文件。
out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件:/etc/ssl/private/vsftpd.pem。
# openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048
上面的命令会让你回答以下的问题,记住使用你自己情况的值。
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:shfx.com
Organizational Unit Name (eg, section) []:shsl.com
Common Name (eg, your name or your server's hostname) []:FTPserver
Email Address []:[email protected]
5.2 配置VSFTPD使用SSL/TLS
在我们进行任何 VSFTPD 配置之前,首先开放 990 和 40000-50000 端口,以便在 VSFTPD 配置文件中分别定义 TLS 连接的端口和被动端口的端口范围:
Firewall防火墙操作:
# firewall-cmd --zone=public --permanent --add-port=990/tcp
# firewall-cmd --zone=public --permanent --add-port=40000-50000/tcp
# firewall-cmd –reload
iptables防火墙操作:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 990 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 990 -j ACCEPT
iptables -A INPUT -p tcp --dport 40000:50000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 40000:50000 -j ACCEPT
service iptables save
现在,打开 VSFTPD 配置文件并在文件中指定 SSL 的详细信息:
# vi /etc/vsftpd/vsftpd.conf
找到 ssl_enable 选项把它的值设置为 YES 激活使用 SSL,另外,由于 TSL 比 SSL 更安全,我们会使用 ssl_tlsv1_2 选项让 VSFTPD 使用更严格的 TLS:
ssl_enable=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
然后,添加下面的行来定义 SSL 证书和密钥文件的位置:
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
下面,我们要阻止匿名用户使用 SSL,然后强制所有非匿名用户登录使用安全的 SSL 连接进行数据传输和登录过程中的密码发送:
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
另外,我们还可以添加下面的选项增强 FTP 服务器的安全性。当选项 require_ssl_reuse 被设置为 YES 时,要求所有 SSL 数据连接都会重用 SSL 会话;这样它们会知道控制通道的主密码。
因此,我们需要把它关闭。
require_ssl_reuse=NO
另外,我们还要用 ssl_ciphers 选项选择 VSFTPD 允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者:
ssl_ciphers=HIGH
现在,设置被动端口的端口范围(最小和最大端口)。
pasv_min_port=40000
pasv_max_port=50000
选择性启用 debug_ssl 选项以允许 SSL 调试,这意味着 OpenSSL 连接诊断会被记录到 VSFTPD 日志文件:
debug_ssl=YES
保存所有更改并关闭文件。然后让我们重启 VSFTPD 服务:
# systemctl restart vsftpd
5.3 用SSL/TLS连接测试FTP服务器
完成上面的所有配置之后,像下面这样通过在命令行中尝试使用 FTP 测试 VSFTPD 是否使用 SSL/TLS 连接:
从上面的截图中,我们可以看到这里有个错误提示我们 VSFTPD 只允许用户从支持加密服务的客户端登录。
命令行并不会提供加密服务因此产生了这个错误。因此,为了安全地连接到服务器,我们需要一个支持SSL/TLS连接的FTP客户端,例如FileZilla。
5.4 安装FileZilla以便安全地连接到FTP服务器
FileZilla是一个现代化、流行且重要的跨平台的FTP客户端,它默认支持SSL/TLS连接。
5.4.1 在linux上安装FileZilla
# yum install epel-release filezilla #Redhat系
$ sudo apt-get install filezilla #Debian系
5.4.2 新建站点
当安装完成后,打开它,选择File => Sites Manager或者按Ctrl + S打开Site Manager界面。点击New Site按钮添加一个新的站点/主机连接详细信息。
5.4.3 添加FTP服务器详细信息
像下面这样设置主机/站点名称、添加 IP 地址、定义使用的协议、加密和登录类型(使用你自己情况的值):
Host: 192.168.98.16
Protocol: FTP – File Transfer Protocol
Encryption: Require explicit FTP over #推荐
Logon Type: Ask for password #推荐
User: username
5.4.4 验证FTP SSL证书
然后点击Connect,再次输入密码,然后验证用于SSL/TLS连接的证书,再一次点击OK连接到FTP服务器:
到了这里,我们应该使用TLS连接成功地登录到了FTP服务器,在下面的界面中检查连接状态部分获取更多信息。
最后,在文件目录尝试从本地传输文件到FTP服务器,看FileZilla界面后面的部分查看文件传输相关的报告。