2017年4月8日 星期六

設定密不透水的 ssh 服務

瓶中船 從遠端管理 linux 伺服器, 一定要開 ssh 服務。 但是開了 ssh 服務, 又怕被攻擊。 所以網管們一定要學會 用 fail2ban 保護 ssh。 在此同時, 另外還可以用白名單及強制要求使用非對稱式加密的方式, 把 ssh 服務的開口設得非常緊密, 近乎滴水不漏, 更多一層保障。

最好是人就坐在伺服器旁邊或同一棟大樓裡才做以下設定。 否則不小心把自己鎖在伺服器外面你就哭了。 改好設定檔之後, 必須 systemctrl restart 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. 最近發現二步驗證也可以做為密碼或是第二密碼,至少對於沒有金鑰的帳號也可以用

    回覆刪除