FTP( 文件传输协议 )是一种传统的,广泛使用的标准工具,用于通过网络在服务器和客户端之间传输文件 ,特别是在不需要认证(允许匿名用户连接到服务器)的情况下。我们必须理解,默认情况下,FTP是不安全的,因为它传输用户凭据和数据没有加密。
在本指南中,我们将描述在CentOS / RHEL 7和Fedora发行版中安装,配置和保护FTP服务器( VSFTPD代表“ 非常安全FTP守护程序 ”)的步骤。
请注意,本指南中的所有命令都将以root身份运行,以防您未使用root帐户运行服务器,请使用sudo命令获取root权限。
第1步:安装FTP服务器
1.安装vsftpd服务器是直接,只是运行以下命令在终端。
# yum install vsftpd
2.安装完成后,服务将首先禁用,因此我们需要手动启动它,并使其能够从下一次系统引导自动启动:
# systemctl start vsftpd
# systemctl enable vsftpd
接下来,为了允许从外部系统访问FTP服务,我们必须打开端口21,FTP守护程序正在监听,如下所示:
# firewall-cmd --zone=public --permanent --add-port=21/tcp
# firewall-cmd --zone=public --permanent --add-service=ftp
# firewall-cmd --reload
第2步:配置FTP服务器
现在我们将进行一些配置来设置和保护我们的FTP服务器,让我们开始备份原始配置文件/etc/vsftpd/vsftpd.conf:
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig
接下来,打开上面的配置文件,并使用这些相应的值设置以下选项:
anonymous_enable=NO # disable anonymous login
local_enable=YES # permit local logins
write_enable=YES # enable FTP commands which change the filesystem
local_umask=022 # value of umask for file creation for local users
dirmessage_enable=YES # enable showing of messages when users first enter a new directory
xferlog_enable=YES # a log file will be maintained detailing uploads and downloads
connect_from_port_20=YES # use port 20 (ftp-data) on the server machine for PORT style connections
xferlog_std_format=YES # keep standard log file format
listen=NO # prevent vsftpd from running in standalone mode
listen_ipv6=YES # vsftpd will listen on an IPv6 socket instead of an IPv4 one
pam_service_name=vsftpd # name of the PAM service vsftpd will use
userlist_enable=YES # enable vsftpd to load a list of usernames
tcp_wrappers=YES # turn on tcp wrappers
5.现在配置FTP以允许/拒绝基于用户列表文件/etc/vsftpd.userlist的用户的FTP访问。
默认情况下,如果userlist_enable = YES,则在userlist_file=/etc/vsftpd.userlist中列出的用户将拒绝登录访问,并将userlist_deny选项设置为YES。
但是, userlist_deny = NO会更改设置,这意味着只有在userlist_file = / etc /vsftpd.userlist中明确列出的用户才能被允许登录。
userlist_enable=YES # vsftpd will load a list of usernames, from the filename given by userlist_file
userlist_file=/etc/vsftpd.userlist # stores usernames.
userlist_deny=NO
这不是全部,当用户登录到FTP服务器时,他们被放置在一个chroot的监狱,这是本地根目录,将作为其FTP会话的主目录。
接下来,我们将讨论如何将FTP用户切换到FTP用户的主目录(本地根目录)的两种可能情况,如下所述。
6.现在添加以下两个选项以将FTP用户限制到其主目录。
chroot_local_user=YES
allow_writeable_chroot=YES
chroot_local_user= YES意味着本地用户将被放置在chroot jail中,在默认设置登录后它们的主目录。
并且,默认情况下,vsftpd不允许chroot jail目录因为安全原因而可写,但是,我们可以使用allow_writeable_chroot= YES选项来覆盖此设置。
保存文件并将其关闭。
使用SELinux保护FTP服务器
7.现在,让我们设置下面的SELinux布尔值,允许FTP读取用户主目录中的文件。注意,这是最初使用命令完成:
# setsebool -P ftp_home_dir on
但是, ftp_home_dir指令已默认禁用,如此错误报告中所述: : 。
现在我们将使用semanage命令设置SELinux规则,以允许FTP读/写用户的主目录。
# semanage boolean -m ftpd_full_access --on
在这一点上,我们必须重新启动vsftpd以实现我们迄今为止所做的所有更改:
# systemctl restart vsftpd
第4步:测试FTP服务器
现在我们将使用创建一个FTP用户来测试FTP服务器。
# useradd -m -c “Ravi Saive, CEO” -s /bin/bash ravi
# passwd ravi
之后,我们必须使用将用户ravi添加到文件/etc/vsftpd.userlist,如下所示:
# echo "ravi" | tee -a /etc/vsftpd.userlist
# cat /etc/vsftpd.userlist
9.现在是时候测试我们上面的设置是否正常工作。让我们从测试匿名登录开始,我们可以从下面的屏幕截图中看到,不允许匿名登录:
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220Welcome to HowToing.com FTP service.
Name(192.168.56.10:root): anonymous
530Permission denied.
Login failed.
ftp>
测试匿名FTP登录
我们还要测试未在文件/etc/vsftpd.userlist中列出的用户是否将被授予登录权限,而在下面的屏幕截图中则不是这样:
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220Welcome to HowToing.com FTP service.
Name(192.168.56.10:root): aaronkilik
530Permission denied.
Login failed.
ftp>
FTP用户登录失败
11.现在进行最后检查,如果在/etc/vsftpd.userlist文件中列出的用户在登录后实际上是放在他/她的主目录中:
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220Welcome to HowToing.com FTP service.
Name(192.168.56.10:root): ravi
331Please specify the password.
Password:
230Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
FTP用户登录成功[
警告:使用allow_writeable_chroot=YES具有某些安全含义,特别是如果用户具有上传权限或shell访问权限。
只有在您确切知道您在做什么时才激活此选项。重要的是要注意,这些安全隐患不是vsftpd具体的,它们适用于所有提供将本地用户放在chroot jail的FTP守护进程。
因此,我们将在下一节中查看一种更安全的方法来设置不同的不可写本地根目录。
第5步:配置不同的FTP用户主目录
12.再次打开vsftpd配置文件,首先注释下面的不安全选项:
#allow_writeable_chroot=YES
然后为用户创建备用本地根目录( ravi,yours可能不同),并删除所有用户对此目录的写入权限:
# mkdir /home/ravi/ftp
# chown nobody:nobody /home/ravi/ftp
# chmod a-w /home/ravi/ftp
13.接下来,在本地根目录下创建一个目录,用户将在其中存储他/她的文件:
# mkdir /home/ravi/ftp/files
# chown ravi:ravi /home/ravi/ftp/files
# chmod 0700 /home/ravi/ftp/files/
然后使用这些值在vsftpd配置文件中添加/修改以下选项:
user_sub_token=$USER # inserts the username in the local root directory
local_root=/home/$USER/ftp # defines any users local root directory
保存文件并将其关闭。再次,让我们使用新设置重新启动服务:
# systemctl restart vsftpd
14.现在再做一个最终测试,看到用户本地根目录是我们在他的主目录中创建的FTP目录。
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220Welcome to HowToing.com FTP service.
Name(192.168.56.10:root): ravi
331Please specify the password.
Password:
230Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
FTP用户主目录登录成功