【IT168 专稿】上篇文章中(点击阅读),介绍了Vsftpd服务器的配置及其管理,本文介绍其安全策略。
vsftpd服务器的安全策略
1. 为vsftpd服务器配置SSL
在VSFTPD-2.0.1以后的版本里提供了对SSL套接层的支持,这使得vsftpd变的更加安全了。要实现ftp的安全连接有几个必须的前提是OPENSSL版本必须大于0.9.6,你可以用openssl加密你的vsftpd服务器登录及传输过程。方法是修改builddefs.h文件中的:
#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#undef VSF_BUILD_SSL
为:
#define VSF_BUILD_TCPWRAPPERS
#undef VSF_BUILD_PAM
#define VSF_BUILD_SSL
然后编译即可。
2. 启用tcp_wrappers进行访问控制
tcp_wrapper是这样一套基本系统,它可以用来禁止(或者显式的允许)特定的主机对某些服务的访问。简单的说,它的工作原理是这样的:inetd或xinetd运行很多的服务,其中很多都是由tcpd包装好的。换句话说,tcpd是真正运行这些服务的程序,但是xinetd不知道这些(其实它根本不关心)。tcpd根据/etc/hosts.allow和/etc/hosts.deny来判断是否允许传来的连接请求。tcp_wrapper工作原理见图5。
图5 tcp_wrapper工作原理 |
这里tcp_wrappers的应用思路是“先阻止、后放行”。因此策略是首先禁止所有主机访问FTP服务器(在/etc/hosts.deny文件中设定),然后在/etc/hosts.allow中加入允许访问的主机或IP地址列表,这是最安全的访问策略。使用这项功能需要在安装编译之前构建包含tcp_wrappers的vsftpd。可通过编辑“builddefs.h”文件,将“#undef VSF_BUILD_TCPWRAPPERS”修改为“#define VSF_BUILD_TCPWRAPPERS”,然后重新构建编译,生成可执行代码。其次,要开启在配置文件vsftpd.conf中的选项“tcp_wrappers=YES”。该功能依赖于对文件“/etc/hosts.allow”的配置。tcp_wrapper位于Vsftpd和iptables防火墙之间。如图6 。
图6 tcp_wrapper位于Vsftpd和iptables防火墙之间 |
以下是一个例子:
vsftpd: 192.168.1.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap.conf
vsftpd: 192.168.1.4: DENY
其中,第一行表示如果一个客户端从192.168.1.3连接,那么vsftpd将应用“/etc/vsftpd_tcp_wrap.conf”的vsftpd配置文件给该连接。这些设置被应用在默认的vsftpd.conf之前。这一点十分有用,可用它为一些IP应用不同的访问限制(例如上传的能力);还可以指定某些IP有能力来超越连接限制(max_clients=0);或者为某些IP增减带宽限制。第二行表示拒绝192.168.1.4连接的能力。tcp_wrappers对别有用心的连接者很有用。
给连接服务的客户发送一幅警戒性横幅是掩盖运行服务的系统的好办法,同时,它也让潜在的攻击者知道系统管理员是相当警惕的。要为某服务实现 TCP 会绕程序横幅,请使用 banner 选项。 这个例子为 vsftpd 实现了一个横幅。首先,创建一个横幅文件。它可以位于系统上的任何地方,但是它的名称必须和守护进程相同。在这个例子中,该文件叫做 /etc/banners/vsftpd。该文件的内容如下所示:
220-Hello, %c
220-All activity on ftp.example.com is logged.
220-Act up and you will be banned.
%c 代符提供了各类客户信息,如用户名和主机名,或用户名和 IP 地址,从而使连接更令人生畏。要把这个横幅展示给每个进入连接,把以下行添加到 /etc/hosts.allow 文件中:
vsftpd : ALL : banners /etc/banners/
3. 修改Vsftpd服务器的默认端口和修改其他设置
基于安全考虑,将预设的21端口改为2123。修改配置文件 /etc/vsftpd/vsftpd.conf, 在文件最后增加如下一行内容:
listen_port=2123
ftp_data_port=2020
在实际应用中,为了增加安全性,会将FTP服务器置于防火墙之后。修改Vsftpd服务器的默认端口后要及时修改防火墙的端口设定。现在服务器FTP端口为2123,数据传输端口为2020。
#iptables -A INPUT -p tcp -m multiport --dport 2123,2020 -j ACCEPT
#iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
修改其他设置
ls_recurse_enable=NO #关闭“ls -R"命令,该命令常被用于DoS攻击,非常浪费系统资源# ascii_download_enable=NO #关闭ASCII模式下载,防止被用于DoS攻击,ASCII下载很消耗CPU负担
4.使用BlockHosts软件防范暴力破解
BlockHosts软件就是利用通过分析日志文件帮助tcp_wrappers实现工作自动化。例如在30秒钟内一个IP地址(192.168.1.23)连续30次登录sshd服务器而且全部因为密码错误登录失败。那么这个IP地址无疑是非法或者恶意主机。这时BlockHosts会自动将该IP地址写入/etc/hosts.deny文件。首先编辑你的/etc/syslog.conf文件,一般修改
security.* /var/log/security条目内容如下:
security.*;auth.info /var/log/security
原因很简单,这样syslogd就把连接到sshd的日志信息记录下来。
BlockHosts官方网站: http://www.aczoom.com/cms/blockhosts/ , 最新版本:1.0.3。
下载启动BlockHosts步骤,另外需要Python语言和SSH软件的支持。可以使用下面命令检测。
#rpm -qa|grep Python;rpm -qa|grep ssh
#wget http://www.aczoom.com/tools/blockhosts/BlockHosts-1.0.3.tar.gz
#tar –zxvf BlockHosts-1.0.0.tar.gz “建立一个目录”
python setup.py
BlockHosts是基于命令行模式的,使用非常简单这里就不赘述了。
5.使用xinetd方式运行
Vsftpd能以Stand-alone、xinetd两种模式运行,当用户账号比较少又经常需要连接到Vsftpd服务器时推荐使用xinetd模式运行。使用xinetd方式运行可以有效防范DoS攻击。从传统的守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题,一些Linux引进了“网络守护进程服务程序”的概念。Redhat Linux 8.0以后的版本使用的网络守护进程是xinted(eXtended InterNET daemon)。和stand-alone模式相比xinted模式也称 Internet Super-Server(超级服务器)。xinetd能够同时监听多个指定的端口,在接受用户请求时,他能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。可以把xinetd看做一个管理启动服务的管理服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。xinetd模式工作原理见图7。
图7 xinetd模式网络服务 |
和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销,保护系统资源。但是对于访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。察看系统为Linux服务提供那种模式方法在Linux命令行可以使用pstree命令可以看到两种不同方式启动的网络服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。能有效的防止拒绝服务攻击(Denial of Services):
a、限制同时运行的进程数。
通过设置instances选项设定同时运行的并发进程数:
instances=20
当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。
限制一个IP地址的最大连接数:
通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。
per_source=5
这里每个IP地址可以连接单个IP地址的连接数是5个。
b.限制负载。
xinetd还可以使用限制负载的方法防范拒绝服务攻击。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接:
max_load = 2.8
上面的例子中当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。说明要使用这个选项,编译时要加入--with-loadavg ,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些拒绝服务攻击。 c.限制所有服务器数目(连接速率) 。
xinetd可以使用cps选项设定连接速率,下面的例子:
cps = 25 60
第一个参数表示每秒可以处理的连接数,如果超过了这个连接数之后进入的连接将被暂时停止处理;第二个参数表示停止处理多少秒后继续处理先前暂停处理的连接。即服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。
使用上面指令有助于防止某个 xinetd 服务大量占用系统,从而导致“拒绝服务”情况的出现。
6.关注vsftpd服务器日志
网络管理员应当记录vsftpd服务器所有日志,它记录了系统每天发生的各种各样的事情,包括哪些用户曾经或者正在使用系统,可以通过日志来检查错误发生的原因,更重要的是在系统受到黑客攻击后,日志可以记录下攻击者留下的痕迹,通过查看这些痕迹,系统管理员可以发现黑客攻击的某些手段以及特点,从而能够进行处理工作,为抵御下一次攻击做好准备。这里推荐使用AWStats它是在Sourceforge上发展很快的一个基于Perl的WEB日志分析工具。现今它也可以用来分析多种日志包括:Apache 、proftp、wuftp、vsftp、Postfix, Sendmail, QMail。现在介绍一下用它来分析vsftp日志的安装配置方法。
(1)软件下载安装
#mkdir /var/www/html/syc ;cd /var/www/html/syc;
#wget http://heanet.dl.sourceforge.net/sourceforge/awstats/awstats-6.5.tar.gz
# tar zxvf /usr/local/src/awstats-6.2.tgz ;mv awstats-6.2 awstats
# chmod 755 /var/www/html/syc/awstats ;mkdir -p /var/www/cgi-bin/awstats
#mv /var/www/html/syc/awstats/wwwroot/cgi-bin/* /var/www/cgi-bin/awstats #
说明下载的软件版本一定要大于6.4,之前版本有安全漏洞。
(2)修改配置文件/etc/vsftpd/vsftpd.conf ,添加以下内容:
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
(3)清空旧日志文件内容:
true > /var/log/vsftpd.log
(4)重新啟動 vsftpd 服务器
# /etc/rc.d/init.d/vsftpd restart
(5)建立日志文件目录
# mkdir /etc/awstats
# cp /var/www/cgi-bin/awstats/awstats.model.conf /etc/awstats/awstats.ftp.conf
# mkdir /var/www/html/syc/awstats/data
(6)修改缺省配置文件
LogFile="/var/log/vsftpd.log
LogType=F
#LogFormat=1
LogFormat="%time3 %other %host %bytesd %url %other %other %method %other %logname %other %code %other %other"
LogSeparator="\s"
SiteDomain=" host.cao.net" #主机名称#
HostAliases="localhost 127.0.0.1 192.168.0.254 " #域名、服务器名、别名#
DNSLookup=0 #不逆向解析域名 #
DirData="/var/www/html/syc/awstats/data" #日志文件存放目录#
DirCgi="/cgi-bin/awstats" # CGI统计脚本目录#
DirIcons="/syc/awstats/wwwroot/icon" #图标在Web服务器apache对应目录#
MiscTrackerUrl="/syc/awstats/wwwroot/js/awstats_misc_tracker.js"
LevelForBrowsersDetection=0 # 是否可以用浏览器来执行更新,默认是不可以#
LevelForOSDetection=0 #是否可以通过浏览器频道操作系统默认是不可以#
LevelForRefererAnalyze=0 # 0 disables Origin detection.
LevelForRobotsDetection=0 # 0 disables Robots detection.
LevelForSearchEnginesDetection=0 # 0 disables Search engines detection.
Lang="cn" #设置国家语言类型#
ShowMonthStats=UVHB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=HB
ShowHostsStats=HB
ShowAuthenticatedUsers=HBL
ShowRobotsStats=0
ShowOSStats=0
ShowBrowsersStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
StyleSheet="/syc/awstats/wwwroot/css/awstats_bw.css" #css启示位置#
注意上面粗黑体字部分是笔者服务器的情况,读者在实际操作中要按照你的具体情况设置。
(7)建立awstats.sh批处理文件:
cd /var/www/cgi-bin/awstats
./awstats.pl -config=ftp -update -output > /var/www/html/syc/awstats/ftp.html
chmod 644 /var/www/html/syc/awstats/data/
(8)赋予awstats.sh文件权限
# chmod 700 /var/www/cgi-bin/awstats/awstats.sh
(9)运行批处理文件awstats.sh
# /var/www/cgi-bin/awstats/awstats.sh
(10)重新启动Apache Web服务器,查看日志:
# /etc/rc.d/init.d/httpd restart
在Firefox浏览器的URL栏目输入:http://localhost /syc/awstats/ftp.html ,见图4。
图8 vsftpd日志界面 |
(11)用 crontab命令实现自动更新日志:
在Windows系统中有一个计划任务的功能,它可以根据用户的要求定时完成某项功能,这对网管员十分有用。Linux中也有类似功能,它是由cron来执行的。Crom是一个守护进程(daemon),它提供定时器功能,只要用户必须定时器设置文件,就可以使用的完成计划任务。建立定时器设置文件:
#crontab -e
文件内容:
35 */8 * * * root /var/www/cgi-bin/awstats/awstats.sh > /dev/null 2>&1
用vi或其他编辑器存盘退出。
(12)使用 crontab命令添加到任务列表中:
#crontab -u mytype
这样每隔八个小时更新日志。
7. 安全使用客户端工具
服务器加固后要考虑防范网络嗅探,即客户端向服务器传输数据过程。防范网络嗅探的关键的文件传输过程,使用OpenSSH上传数据到服务器可以把所有传输的数据进行加密,这样即使网络中的黑客能够劫持用户所传输的数据,如果不能解密的话,也不能对数据传输构成真正的威胁。
如果使用Windows的话推荐使用Filezilla ,它是客户端使用SFTP的一款不错的开源软件。最新版本2.2.16,官方网址:http://filezilla.sourceforge.net/ 。Filezilla是一款非常值得推荐的FTP客户端,尽管它的功能丰富,但却非常方便好用。它的界面采用了多窗格设计,可以同时显示本地硬盘的内容和远端服务器上的目录,此外还列出了常用的ftp命令。Filezilla支持断点续传(下载和上传均支持),同时也支持SSL加密传输方式。你可以通过编辑它的传输任务队列来选择所要传输的文件或安排传输顺序。在站点管理器(Site Manager)中选择好一个服务器之后就可以开始上传或下载文件了。使用它可以安全方便的向服务器上传下载数据。对中文支持很好,配置界面如图9所示。
图9 Filezilla配置界面 |
总结:
在众多网络应用中,FTP(文件传输协议)有着非常重要的地位。互联网一个十分重要的资源就是软件资源,而各种各样的软件资源大多数都放在FTP服务器中。在网站的建设中,FTP是一项重要的服务,利用它可以更容易分享有限的软件资源。以上实例均在RHEL 4.0系统上试验通过,如遇到问题请仔细检查每个细节的正确性。上面的内容可以根据具体环境进行增减、修改。相信通过自己的努力可以打造出一个高效、安全的FTP服务器。