藍天浮雲

This is our world… Nothing changes. It’s here, that we are going to live on…

阻擋 SSH brute force

with 3 comments

架好 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-pfsshguard 的好處是他可以判別很多種紀錄檔,也支援許多種防火牆。另外,也可以調整多久時間內登入失敗幾次,還有要擋掉多久。

目前可以判讀這些軟體的紀錄檔:

支援的防火牆包含:

  • 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.confpflog 沒用到可以不必加):

    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


作者為dennylin93

2009/11/01 於 9:20 AM

3 回應

RSS訂閱留言。

  1. 每次在google上讀你的文章就會覺得我之前都在亂學

    學弟加油:D

    對了要記得跟我拿bbs講義,給陳永禎

    amariel

    2009/11/01 at 6:31 下午

  2. 嗯。

    dennylin93

    2009/11/01 at 7:27 下午

  3. [...] 若覺得密碼容易被破解的話,可以考慮用 SSH keys 來登入。簡單來說,就是需要一個特殊檔案再加上一組密碼才能登入(密碼可有可無)。如此一來,就幾乎不可能破解。說實話,只要密碼合理(不要設 1234 之類),然後有阻擋 SSH 攻擊的話(可以參考阻擋 SSH brute force),應該就不必擔心帳號被駭。 [...]


留言