看我如何巧妙配置兩款安全工具防范蠻力攻擊
譯文蠻力攻擊簡(jiǎn)介
我們都知道這句流行語(yǔ):“預(yù)防勝過(guò)治療。”如果你是個(gè)Linux系統(tǒng)管理員,可能知道“蠻力攻擊應(yīng)用程序”如何在你的本地或遠(yuǎn)程服務(wù)器引發(fā)問(wèn)題。設(shè)想一下:如果你的服務(wù)器遭到了身份未知的攻擊者的攻擊,服務(wù)器上的數(shù)據(jù)就會(huì)落到壞人手里。這肯定會(huì)讓你和貴公司陷入從未想過(guò)的大麻煩。蠻力攻擊是應(yīng)用程序采用的反復(fù)嘗試方法,以破解你的加密數(shù)據(jù)。加密數(shù)據(jù)可能是任何密碼或密鑰。簡(jiǎn)單來(lái)說(shuō),蠻力攻擊應(yīng)用程序會(huì)嘗試所有可能的密碼或密鑰組合,反復(fù)嘗試,直到找到正確的密碼或密鑰為止。這就需要一段時(shí)間,具體取決于密碼的復(fù)雜性。如果要花過(guò)長(zhǎng)的時(shí)間才能找到密碼,那么可以說(shuō)你的密碼很安全、很強(qiáng)壯。
現(xiàn)在可以使用一些巧妙的工具來(lái)阻止或預(yù)防蠻力攻擊。今天,我們就來(lái)探討下列工具。
1. SSHGuard ; 2. Fail2Ban.
提醒一下:不要將這兩個(gè)工具都安裝在同一個(gè)系統(tǒng)上。你可能無(wú)法獲得正確的結(jié)果。
首先,讓我們看一下SSHGuard,以及如何安裝和配置它,以預(yù)防蠻力攻擊。
1. SSHGuard
SSHGuard(http://www.sshguard.net)是一種快速、輕便的監(jiān)控工具,用C語(yǔ)言編寫而成。它可以使用日志活動(dòng),監(jiān)控服務(wù)器,保護(hù)服務(wù)器遠(yuǎn)離蠻力攻擊。要是有人不斷地試圖通過(guò)SSH訪問(wèn)你的服務(wù)器,多次(可能四次)嘗試訪問(wèn)失敗,SSHGuard就會(huì)將對(duì)方的IP地址放入到iptables,在一段時(shí)間內(nèi)阻止他/她訪問(wèn)。之后,它會(huì)在一段時(shí)間后自動(dòng)解鎖。它幾乎能保護(hù)所有的服務(wù),比如sendmail、exim、dovecot、vsftpd、proftpd及許多服務(wù),而不光光保護(hù)SSH。
安裝SSHGuard
在Ubuntu/Debian上,SSHGuard就在默認(rèn)的軟件庫(kù)中。
于是,我們可以用下列命令來(lái)輕松安裝它:
sudo apt-get install sshguard
在CentOS/RHEL 6.x上:
先下載并添加FlexBox軟件庫(kù),如下所示。
wget http://sourceforge.net/projects/flexbox/files/flexbox-release-1-1.noarch.rpm
使用下列命令更新軟件庫(kù)列表:
yum repolist
最后,使用下列命令安裝sshguard:
yum install sshguard
至于其他發(fā)行版,從官方網(wǎng)站(http://www.sshguard.net/download/)下載各自的二進(jìn)制文件,并自行安裝。
或者,你也可以從這里(http://pkgs.org/download/sshguard)來(lái)下載。
用Iptables/Netfilter配置SSHGuard
SSHGuard沒(méi)有配置文件。你要做的就是在iptables中為SSHGuard創(chuàng)建新的鏈,以插入阻止訪問(wèn)的規(guī)則。
為了支持IPv4,在擁有根權(quán)限的情況下運(yùn)行下列命令:
iptables -N sshguard
為了支持IPv6:
ip6tables -N sshguard
現(xiàn)在更新INPUT鏈,將流量傳輸?shù)絪shguard。指定--dport選項(xiàng),使用sshguard保護(hù)服務(wù)的所有端口。如果你想防止攻擊者將任何流量傳輸?shù)街鳈C(jī),就完全刪除這個(gè)選項(xiàng)。
阻止來(lái)自攻擊者的所有流量
為了支持IPv4:
iptables -A INPUT -j sshguard
為了支持IPv6:
iptables -A INPUT -j sshguard
阻止來(lái)自攻擊者的特定服務(wù),比如SSH、FTP、POP或IMAP
為了支持IPv4:
iptables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143 -j sshguard
為了支持IPv6:
ip6tables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143-j sshguard
最后,保存iptables規(guī)則。
service iptables save
核實(shí)你在鏈中的較高層沒(méi)有傳輸所有ssh流量的default allow(默認(rèn)允許)規(guī)則。核實(shí)你在防火墻中沒(méi)有阻止所有ssh流量的default deny(默認(rèn)拒絕)規(guī)則。不論哪種情況,假設(shè)你已經(jīng)擁有調(diào)整防火墻設(shè)置的技能。
下面是一個(gè)合理的示例規(guī)則集:
iptables -N sshguard
阻止sshguard表明是不良流量的任何流量:
iptables -A INPUT -j sshguard
啟用ssh、dns、http和https:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
阻止之外的所有服務(wù):
iptables -P INPUT DROP
不用Iptables/Netfilter,配置SSHGuard
如果你不用iptables,下列命令可以創(chuàng)建并保存iptables配置;除了讓sshguard可以正常運(yùn)行外,該配置絕對(duì)什么都不做:
iptables -F iptables -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -N sshguard iptables -A INPUT -j sshguard
最后,保存iptables配置:
service iptables save
就是這樣?,F(xiàn)在你已安裝并配置了SSHGuard,可以保護(hù)你的ssh、ftp及其他服務(wù)遠(yuǎn)離蠻力攻擊者。#p#
2. Fail2Ban
Fail2ban(http://www.fail2ban.org/wiki/index.php/Main_Page)是一種開源入侵預(yù)防系統(tǒng),可以用來(lái)預(yù)防蠻力攻擊及其他可疑的惡意攻擊。它可以掃描日志文件(比如/var/log/apache/error_log),禁止表明存在可疑跡象(比如密碼輸錯(cuò)次數(shù)過(guò)多和尋找安全漏洞等)的IP地址。
一般來(lái)說(shuō),F(xiàn)ail2Ban之后被用來(lái)更新防火墻規(guī)則,阻止IP地址在指定的一段時(shí)間內(nèi)訪問(wèn),不過(guò)還可以配置任何隨意性的其他操作(比如發(fā)送電子郵件或彈出CD-ROM托架)。Fail2Ban在默認(rèn)情況下隨帶預(yù)先配置的過(guò)濾器,可用于眾多服務(wù)(Apache、curier和SSH等)。
安裝Fail2Ban
以根用戶身份登錄,輸入下列命令,安裝Fail2Ban:
在Ubuntu/Debian上:
apt-get install fail2ban
在CentOS/RHEL上:
先添加EPEL軟件庫(kù)。
yum install epel-release yum repolist
然后,使用下列命令安裝fail2ban:
yum install fail2ban
啟用并啟動(dòng)fail2ban服務(wù)。
service fail2ban start chkconfig fail2ban on
或者
systemctl enable fail2ban systemctl start fail2ban
這樣就完事了。
備份Fail2Ban主配置文件:
所有配置文件都位于/etc/fail2ban目錄下。主配置文件是/etc/fail2ban/jail.conf。備份主配置文件是個(gè)好主意,以免升級(jí)過(guò)程中合并。創(chuàng)建/etc/fail2ban/jail.conf文件的本地副本,如下所示:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
配置Fail2Ban
使用任何編輯工具,打開/etc/fasil2ban/jail.local文件:
vi /etc/fail2ban/jail.local
找到名為[Default]的部分。該部分含有Fail2Ban將遵循的一套基本的規(guī)則。根據(jù)你的需求來(lái)設(shè)置值。
下面是我的設(shè)置:
[DEFAULT]
# "ignoreip"可能是IP地址、CIDR掩碼或DNS主機(jī)
ignoreip = 127.0.0.1/8 192.168.1.200/24 [...] bantime = 600 [...] maxretry = 3 # "backend"指定了用來(lái)獲得文件修改之處的后端??捎眠x項(xiàng)有"gamin"、"polling"和"auto"。 # yoh:由于某種原因,隨Debian交付的python-gamin沒(méi)有像預(yù)期的那樣運(yùn)行。 # 這個(gè)問(wèn)題有待完成,于是輪詢是現(xiàn)在的默認(rèn)后端 [...] backend = auto # # 完全用于插入到j(luò)ail.{conf,local}配置文件中的目的地電子郵件地址。 destemail = root@localhost [...] #
在這里,
•ignoreip – 將你信任的IP地址列入白名單,防止Fail2Ban阻止。你可以添加空格字符隔開來(lái)的多個(gè)地址。這里,我將IP地址192.168.1.200列入白名單。所以,該IP地址不會(huì)被禁止,即便它發(fā)送了數(shù)量不受限制的失敗登錄嘗試。
•bantime – 如果某主機(jī)被Fail2Ban發(fā)現(xiàn)違規(guī),它被禁止的秒數(shù)。默認(rèn)時(shí)間是600秒(10分鐘)。如果你喜歡,可以延長(zhǎng)這個(gè)時(shí)間值。
•maxretry – 不正確的登錄嘗試次數(shù),之后主機(jī)被Fail2Ban阻止。
服務(wù)配置
默認(rèn)情況下,F(xiàn)ail2Ban含有一套支持各種服務(wù)的預(yù)定義過(guò)濾器。所以你不需要將任何手動(dòng)項(xiàng)輸入到配置文件中。你要做的就是將已啟用的值改成true或false,F(xiàn)ail2Ban就會(huì)自動(dòng)監(jiān)視相應(yīng)的服務(wù)。
下面是jail.local文件中SSH部分的示例輸出:
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
這里不妨看看每一項(xiàng)的簡(jiǎn)要細(xì)節(jié)。
•enabled-這意味著,ssh服務(wù)保護(hù)功能已開啟。如果你想關(guān)閉,只要設(shè)成false。
•port-SSH服務(wù)端口。
•filter-它指含有規(guī)則的配置文件,F(xiàn)ail2Ban使用這些規(guī)則來(lái)找到匹配。默認(rèn)情況下,它被設(shè)成sshd,指代/etc/fail2ban/filter.d/sshd.conf文件。
•logpath―記錄失敗登錄嘗試的日志文件。
•maxretry-Fail2Ban阻止主機(jī)之前不正確的登錄嘗試次數(shù)。
一旦你更改了配置,就要重啟Fail2Ban服務(wù),以便保存變更。
systemctl restart fail2ban 或者 service fail2ban restart
你可以使用下列命令,核實(shí)Fail2Ban在iptables中添加的規(guī)則:
iptables -L
示例輸出:
Chain INPUT (policy ACCEPT) target prot opt source destination f2b-sshd tcp -- anywhere anywhere multiport dports ssh ACCEPT all -- anywhere anywhere ctstate RELATED,ESTA BLISHED ACCEPT all -- anywhere anywhere INPUT_direct all -- anywhere anywhere INPUT_ZONES_SOURCE all -- anywhere anywhere INPUT_ZONES all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-hos t-prohibited [...]
測(cè)試Fail2Ban
我想試幾次隨機(jī)性的失敗嘗試,從本地客戶機(jī)連接到Fail2Ban服務(wù)器。
然后,我核實(shí)/var/log/fail2ban.log文件中的失敗登錄嘗試:
cat /var/log/fail2ban.log
示例輸出:
2015-07-13 15:38:15,480 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,482 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,483 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,485 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,485 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,487 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,488 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,490 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,491 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,492 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,493 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,495 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:15,496 fail2ban.filter [11792]: INFO [sshd] Found 192.168.1.100 2015-07-13 15:38:16,234 fail2ban.actions [11792]: NOTICE [sshd] Ban 192.168.1.100 或者 iptables -L
正如你從上述兩段輸出中可以看出,我的本地IP地址192.168.1.100已被Fail2Ban禁止。
注意:在默認(rèn)情況下,被禁止的IP地址在600秒后會(huì)被解禁。
就是這樣。但愿這兩款工具對(duì)你會(huì)有所幫助。
祝你好運(yùn)!