2017年4月8日 星期六

設定密不透水的 ssh 服務

瓶中船 從遠端管理 linux 伺服器, 一定要開 ssh 服務。 但是開了 ssh 服務, 又怕被攻擊。 所以網管們一定要學會 用 fail2ban 保護 ssh。 在此同時, 另外還可以用白名單及強制要求使用非對稱式加密的方式, 把 ssh 服務的開口設得非常緊密, 近乎滴水不漏, 更多一層保障。 [2018/2/3] 更厲害的另一個招術是 SPA: 連鑰匙孔都藏起來的 ssh 完全防禦

[2018/1/30] 後來從經驗發現: 改 port 最簡單、 效果最好。 在 /etc/ssh/sshd_config 裡面設定 Port 54321 (之類的)。 必須重新啟動: systemctrl restart ssh, 後續的登入才會生效。 從客戶端要登入時, 必須改用 ssh -p 54321 ...scp -P 54321 ... 才能登入。 自從改用一個沒人知道的 port 之後, fail2ban 就閒到快要失業了 :-)

以下一樣, 每次改過設定檔之後, 都要重新啟動 ssh, 不再贅述。 又, 最好是自己 (或朋友) 人就坐在伺服器旁邊, 或至少同一棟大樓裡, 才做以下設定。 否則不小心把自己鎖在伺服器外面你就哭了。

在 /etc/ssh/sshd_config 裡面, 設定以下幾個參數可以把 ssh 的開口關得很窄很緊。

PermitRootLogin no: 禁止 root 登入。 外面的人要取得 root 權限, 必須通過兩關: 先用 (具有 sudo 權限的) 普通帳號登入, 再用 sudo 變身成 root。 當然, 你必須先確認已成功幫你常用的那個普通帳號 設定好 sudo 權限, 然後才啟用 PermitRootLogin no

AllowUsers ckhung greg chaokuei: 這個更嚴格了, 設定白名單, 只允許用戶從遠端登入 ckhung greg chaokuei 等三個本地 (伺服器上的) 帳號。 當然, 像學校的教學機必須服務幾百位同學, 就不適合這樣設。 另一方面, 如果這部伺服器只有你自己或少數幾個朋友在用, 那麼這個設定可以避免做實驗時臨時創建的帳號 (guest、 test 之類的) 不小心成為資安漏洞。

多人共用一個 teamA 的帳號 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 服務就安全多了。

如果這部機器不是伺服器, 而是桌機或筆電, 那麼最好下 update-rc.d ssh disable 叫系統每次開機時不要自動啟動 ssh 服務。 有臨時需要時才手動 systemctl start ssh 這樣最安全了。

1 則留言:

  1. 最近發現二步驗證也可以做為密碼或是第二密碼,至少對於沒有金鑰的帳號也可以用

    回覆刪除