阻擋 SSH brute force
架好 FreeBSD 或 Linux 之後,常常見到的一個現象就是 SSH 持續的遭受攻擊。在 security run output 會看到這樣的訊息:
ns.hs.ntnu.edu.tw login failures: Oct 30 02:25:01 ns sshd[12801]: Invalid user master from 140.124.62.197 Oct 30 07:13:22 ns sshd[14529]: Invalid user globus from 213.99.38.3 Oct 30 07:13:31 ns sshd[14535]: Invalid user condor from 213.99.38.3 Oct 30 07:13:32 ns sshd[14534]: Invalid user cadi from 213.99.38.3 Oct 30 07:26:44 ns sshd[14591]: Invalid user simoni from 124.193.106.107
看到就覺得很煩,因為每天都有,而且若不阻檔的話,可能會有數千比,系統也有機會遭到入侵。
為了阻擋 SSH brute force,我在 FreeBSD 上裝了 security/sshguard-pf,sshguard 的好處是他可以判別很多種紀錄檔,也支援許多種防火牆。另外,也可以調整多久時間內登入失敗幾次,還有要擋掉多久。
目前可以判讀這些軟體的紀錄檔:
支援的防火牆包含:
- PF(FreeBSD、OpenBSD、NetBSD、DragonFly BSD)
- IPFW(FreeBSD、Mac OS X)
- iptables(Linux)
目前我是使用 FreeBSD 和 PF,所以選擇安裝 security/sshguard-pf:
# cd /usr/ports/security/sshguard-pf && make install clean
裝完就可以開始設定了。首先,編輯 /etc/syslog.conf。應該可以看到這一行被 security/sshguard-pf 加進來了:
#auth.info;authpriv.info |exec /usr/local/sbin/sshguard
功用是把紀錄檔餵給 sshguard,這樣才會知道是否有人登入失敗。要將此行的註解拿掉,然後看是否要調整設定。-a 設失敗多少次、-p 是被檔多久(阻擋時間是 n 與 1.5 * n 之間),單位是秒、-s 是多少秒將攻擊忘記(即每 n 秒嘗試登入就不會被擋)。含有其他參數和功能(如 whitelisting),請 # man sshguard。
-a 預設為 4、-p 預設 420、-s 預設為 1200。
我把他改成這樣:
auth.info;authpriv.info |exec /usr/local/sbin/sshguard -a 6 -p 86400 -s 7200
如此,失敗 6 次會被阻擋,檔 86400 到 1.5 * 86400 秒,每次登入間距不到 3600 秒(2 小時)。在 production 的機器上,我都將 authentication 方式改成 SSH keys,然後停用 PAM,或者把 -a 改成 2。
若已經啟動 PF,可以繼續下面的步驟,若沒有的話,先啟動一下。
PF 通常是直接編入核心中(static),或者利用模組載入。
核心的設定(加入後請重新編譯核心,參見 Building and Installing a Custom Kernel):
device pf device pflog device pfsync
PF 也可以配合 ALTQ 做頻寬管理,不過 ALTQ 必須編入核心,無法用模組載入。
用模組的話可以手動載入,pflog 功能是 log(其實這步是多餘的,因為用到 PF 的時候系統會自動載入):
# kldload pf # kldload pflog
下 # pfctl -e 就可以啟動 PF,設定預設檔位置為 /etc/pf.conf。
另外,若要開機時啟動 PF,請將這幾行加入 /etc/pf.conf(pflog 沒用到可以不必加):
pf_enable="YES" pflog_enable="YES"
接下來還要設定 PF(防火牆),否則他不會擋掉任何攻擊。把這幾行加進 /etc/pf.conf:
table <sshguard> persist block in quick proto tcp from <sshguard> to any port ssh
也可以調整成這樣:
table <sshguard> persist block drop in quick proto tcp from <sshguard> to any port ssh block out quick proto tcp from any to <sshguard>
這樣就設定完了,把 PF 的規則重新載入 # pfctl -f /etc/pf.conf 然後重新啟動 syslogd 就可以了 # /etc/rc.d/syslogd restart。
若要設檔 IMAP、FTP,則改一下 /etc/syslog.conf 裡餵給 sshguard 的 log,然後調整防火牆阻擋的 port 就可以了。
其他設定除了 man page 以外,可以參考 sshguard 的 documentation。
每次在google上讀你的文章就會覺得我之前都在亂學
學弟加油:D
對了要記得跟我拿bbs講義,給陳永禎
amariel
2009/11/01 at 6:31 下午
嗯。
dennylin93
2009/11/01 at 7:27 下午
[...] 若覺得密碼容易被破解的話,可以考慮用 SSH keys 來登入。簡單來說,就是需要一個特殊檔案再加上一組密碼才能登入(密碼可有可無)。如此一來,就幾乎不可能破解。說實話,只要密碼合理(不要設 1234 之類),然後有阻擋 SSH 攻擊的話(可以參考阻擋 SSH brute force),應該就不必擔心帳號被駭。 [...]
OpenSSH « 藍天浮雲
2009/11/05 at 9:08 下午