0 - 前言
處于公網的服務器,好比在海上游泳,水底下大白鯊虎視眈眈,
伺機上攻,一口吞下。
一般我們都要使用遠程登錄。
1 - 文件傳輸
不害怕,就來明文, FTP,用著還行。雖然速度沒那么理想。
也可以使用 SCP,RSYNC 加密傳輸。
可是,都用 SSL 了,為什么不用 SSH 登錄操作呢?
于是,SSH 服務也就打開了。
2 - SSH
默認root 是不允許訪問的。可是系統管理員太懶了,sudo 敲來敲去,
文件權限翻來覆去,煩人不煩人。于是
PermitRootLogin yes
好了,每次登錄服務器都要輸
ssh -p 22 root@romte_host
還要輸入密碼,太凌亂了。
3 - 公鑰、私鑰
于是,個人電腦上
ssh-keygen -t rsa
創建公鑰私鑰,使用
ssh-copy-id -p 22 root@remote_host,
把公鑰拷貝到遠程主機。
這下方便多了,再次使用
ssh -p 22 root@romte_host
登錄,不用輸!密!碼!
瞬間清潔了不少。
4 - 端口!端口!
服務器上好多舊系統的任務,
不能全部重寫吧。
萬一改錯哪個地方,
不是得卷鋪蓋滾回寨子里去?
所以,端口 22 堅決不改。
5 - 來自世界各地的問候
有時候,登到服務器,
systemctl status sshd
看到服務無間斷運行了128天,心里無比高興。
可是列出來的幾行紅色字體,
總是那么煩人,不過應該沒事兒,應該沒事兒。
6 - 日志里的端倪
學習了一些 systemd 的知識,
知道這老兄有個二進制日志工具 journalctl。
嘗試著打印一下日志:
journalctl --unit="sshd" --since="-1 day"
這篩選條件,是不是高端多了,
特別是那個 “-1 day”,
有沒有一種敲代碼的感覺。
烏泱泱一大片,間隔 1-2 秒,
就有一條類似
Failed password for user root ……
紅色字體,分外扎眼。
好像我的服務被攻擊了。
7 - 找出元兇
于是拼命在網上搜索關鍵詞找答案,
有了下面這樣的篩選項,
讓我看到攻擊源來自哪里。
journalctl --unit="sshd" --since="-30 minutes"
接著管道符,篩選字段。
注意,journalctl 不提供 grep 相似的正則選項,
非不能也,不為也。
awk '/Failed/{print $(NF-3)}'
倒數第三個字段就是那個試圖攻擊服務器的IP。
接著管道符,排序,篩選統計。
sort | uniq -c
注意,一定是先排序,后統計去重,
不能反過來,無效的哦。
接著管道符,篩選出來明顯輸錯次數多的IP記錄。
awk '{if($1 >= 3){print$2;}}'
于是,我們通過上述幾條命令,
成功篩選出了,在過去30分鐘內,
至少輸錯過3次密碼的 IP 列表。
此處應有掌聲。bravo!
把 IP 關進小黑屋
找到不正常 IP 之后,
該把這些不法分子關進小黑屋了。
直接生效的,iptables 把丫的封了。
iptables -I INPUT -s 8.8.8.8 -j DROP
連骨頭渣都沒留,
甭管什么請求,你這兒來的,我一概不收。
當時加,當時就生效了,
那孫子再沒來煩過我。
還有一個不是當時生效的法子,
寫入 /etc/hosts.deny,
可是得
systemctl restart sshd
麻煩,不能起到即時防護的作用。
有閑工夫的,可以試試。
簡單加一條
sshd:8.8.8.8
就搞定了。
寫在最后
夠了嗎?
上面的是最好的解決方案嗎?
顯然不是。
那什么才是更好的:
- SSH 默認端口太危險,立馬換掉;
- PermitRootLogin = no 堅決執行;
- 使用檢測腳本,crontab 內調度運行,實時封禁;
- 使用專業工具如 Fail2Ban 進行防控。