前幾天幫朋友弄主機,看到/etc/hosts 被加入許多筆127.0.0.1 對應到不同的domain name,接著看登入紀錄發現,只留下當天下午之後的紀錄,其他的都不見了‵,個人的主機通常不會把log 丟到syslog server 上,系統上的帳號也被新增一個帳號,UID 還是0…,看來是被黑了…,最後發現,他沒把root 帳號SSH 連線的設定關掉,密碼也太過簡單。
給了朋友以下建議,順便寫出來。
關閉root 從SSH 登入
root 是整個系統的管理帳號,擁有控制系統的權限,所以要禁止root 從SSH 登入,需要以一般使用者帳號登入後再使用su 切換成root 或 sudo 以root 身分執行,當然root 也是要記得設定密碼。
編輯/etc/ssh/sshd_config,加入以下設定:
PermitRootLogin no
最後記得把sshd restart,才會從讀設定。
只開啟SSH 第2版
SSH v2在對稱式金鑰交換不像v1 由client 產生出,利用server 的公鑰加密傳回去,降低被攔截的機率,而且對稱式金鑰會定期重新產生,加密方法也增加AES 等,也加入公鑰驗證的機制防止中間人攻擊。
一樣在/etc/ssh/sshd_config,加入:
Protocol 2
防止暴力破解
想到的可以有4 個方式可以解決,
- 最基本的就是增加密碼的複雜度,不只是長度,也要避免使用鍵盤上連續的順序當作密碼,如果覺得密碼複雜度不足,建議快下passwd 改密碼。
- 限制最大登入失敗次數,把登入失敗次數過多的IP 給封鎖,可以利用fail2ban 或者sshguard 來實做,這些套件都是分析auth.log 利用iptables或 TCP Wrappers 來阻擋。
- 只允許特定IP 登入,這對一般只有單一主機的人有點不可行,不過如果主機是放在學校可以利用TCP Wrappers (hosts.*) 或iptables 設定白名單,但是會想到那我不是就要在學校才能登入,現在大部分學校都有VPN 服務,也可以利用VPN 連回學校。
- 關閉密碼驗證功能,利用公私鑰驗證登入,可以在常用的主機產生出公私鑰或者把私鑰安全的放到網路空間,在不同主機時,只要將私鑰下載下來,因為私鑰要被竊取相對於密碼較低,但是放到網路空間,像Dropbox 上,安全一點可以在進行加密又或者在產生公私鑰時,可以設定密碼(passphrase),但是這樣利用公私鑰驗證登入時,需要輸入金鑰的密碼。
順便一提,最近常見的雙因素驗證 (Two-factor authentication) 也可以被用在SSH 上,除了使用者密碼外,也要輸入一個動態數值,利用Google Authenticator App 每30 秒動態產生值,現在已經有相關的套件實做。
發佈留言