從遠端管理 linux 伺服器, 一定要開 ssh 服務。 但是開了 ssh 服務, 又怕被攻擊。 所以網管們一定要學會 用 fail2ban 保護 ssh。 在此同時, 另外還可以用白名單及強制要求使用非對稱式加密的方式, 把 ssh 服務的開口設得非常緊密, 近乎滴水不漏, 更多一層保障。 [2018/2/3] 更厲害的另一個招術是 SPA: 連鑰匙孔都藏起來的 ssh 完全防禦。
[2018/1/30] 後來從經驗發現:
伺服器用新的 ip 剛剛上線的時候
改 port 最簡單、 效果最好。
在 /etc/ssh/sshd_config 裡面設定
Port 54321
(之類的)。
必須重新啟動: systemctrl restart ssh
,
後續的登入才會生效。
從客戶端要登入時, 必須改用
ssh -p 54321 ...
或 scp -P 54321 ...
才能登入。
自從改用一個沒人知道的 port 之後,
fail2ban 就閒到快要失業了 :-)
不過固定的 ip 用了一陣子之後, 還是會有不辭辛勞逐 port
嚐試的潰客發現你的隱匿的 port,
所以光靠這個是不夠的。
以下一樣, 每次改過設定檔之後, 都要重新啟動 ssh, 不再贅述。 又, 最好是自己 (或朋友) 人就坐在伺服器旁邊, 或至少同一棟大樓裡, 才做以下設定。 否則不小心把自己鎖在伺服器外面你就哭了。
在 /etc/ssh/sshd_config 裡面, 設定以下幾個參數可以把 ssh 的開口關得很窄很緊。
PermitRootLogin no
: 禁止 root 登入。
外面的人要取得 root 權限, 必須通過兩關:
先用 (具有 sudo 權限的) 普通帳號登入, 再用 sudo 變身成 root。
當然, 你必須先確認已成功幫你常用的那個普通帳號 設定好 sudo 權限,
然後才啟用 PermitRootLogin no
。
AllowUsers ckhung greg chaokuei
:
這個更嚴格了, 設定白名單, 只允許你自己或少數幾個朋友從遠端登入
ckhung greg chaokuei 等三個帳號。
當然, 像學校的教學機必須服務幾百位同學, 就不適合這樣設。
以下的用戶名稱不要用,
這是我的某部機器上面潰客嚐試過最多次的 id (及嚐試次數):
156 admin 87 test 85 user 61 postgres 58 ubuntu 42 oracle 35 git 30 ftpuser 29 www 25 mysql 23 deploy 22 web 18 guest 17 demo 15 user1 15 support 14 info 14 administrator 13 hadoop
PasswordAuthentication no
:
禁止用密碼登入。 蝦密? 禁止用密碼登入, 那要怎麼連線操作?
客戶端跟伺服器端直接用
非對稱式加解密 的方式互傳訊息:
伺服器用客戶端的公鑰 (例如 ~/.ssh/id_rsa.pub)
把訊息加密、 傳到客戶端。
實際上你還是要敲密碼, 但是這個密碼並不透過網路傳到遠方,
而是當你從伺服器那邊收到一堆亂碼時,
可以用這個密碼加上你的私鑰 (例如 ~/.ssh/id_rsa) 來解密還原。
如果有好幾位朋友 (例如 ckhung 跟 greg)
共用伺服器上同一個帳號 (例如 teamA),
那麼只需要把大家各自的公鑰 (~/.ssh/id_rsa.pub)
都收錄到伺服器上的 /home/teamA/.ssh/authorized_keys
裡面去, 之後每個人就都能夠登入這個帳號,
但是又不必分享私鑰或密碼給對方。
「在公共澡堂共浴卻又還能保有隱私」 的神奇概念。
觀念解釋詳見
ssh 的信任機制與身份識別;
實際操作詳見
關閉sshd的登入密碼認證 及那篇文章最後面的幾個連結。
當你做了這幾個設定之後, 其他人想要登入你的機器, 必須同時握有其中一人的私鑰與密碼才能成功。 如果沒有公私鑰的話, 他連嘗試密碼的機會都沒有。 登入之後, 又還要有另一個密碼才能變身成 root。 這樣, 你的 ssh 服務就安全多了。
如果這部機器不是伺服器, 而是桌機或筆電,
那麼最好下 systemctl disable ssh
(較舊的系統: update-rc.d ssh disable
)
叫系統每次開機時不要自動啟動 ssh 服務。
有臨時需要時才手動 systemctl start ssh
這樣最安全了。
最近發現二步驗證也可以做為密碼或是第二密碼,至少對於沒有金鑰的帳號也可以用
回覆刪除