Ssh

使用 SSH 的無密碼帳戶的一致且安全的方法

  • January 26, 2019

我必須承認,在某些情況下我喜歡沒有密碼的伺服器。一個典型的伺服器容易受到任何可以物理訪問它的人的攻擊。因此,在某些情況下,將其物理鎖定並從那時起信任任何物理訪問是切實可行的。

基本概念

理論上,當我實際到達這樣的伺服器時,我應該能夠通過簡單地輸入root登錄名來執行沒有密碼的管理任務,並且不應該要求我輸入密碼。這同樣適用於使用者帳戶,但不會真正實際訪問它們。因此,(偶爾的)本地訪問不需要係統密碼。

在遠端訪問伺服器時,無論是為了管理還是使用者帳戶,我都希望始終使用 SSH 私鑰。為剛剛創建的帳戶設置 SSH 密鑰非常容易,因此(正常)遠端訪問不需要係統密碼。

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

結論是,理論上,對於這樣的案例,我們不需要任何系統密碼。所以問題是,我們如何配置系統和使用者帳戶以使其以一致和安全的方式發生。

本地訪問詳細資訊

我們如何確保無需密碼即可在本地訪問root帳戶?我不認為我們可以使用passwd -d它,因為這會使 root 訪問權限過於寬鬆,並且無特權的使用者可以免費切換到 root,這是錯誤的。我們不能使用passwd -l,因為它會阻止我們登錄。

請注意,本地訪問完全是關於使用本地鍵盤的訪問。因此,一個有效的解決方案必須不允許任何使用者切換(無論是使用su還是sudo)。

遠端訪問詳細資訊

直到最近,上述解決方案才有效,但現在 SSH 開始檢查鎖定的使用者帳戶。passwd -d出於同樣的原因,我們可能無法使用。我們不能使用passwd -u它,因為它只是抱怨它會導致什麼passwd -d

這部分有一個使用虛擬密碼的解決方法。

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

也可以完全關閉 SSH 中的鎖定帳戶檢查,但保留對鎖定帳戶的支持並能夠解鎖它們會更好。

最後的筆記

我感興趣的是一種解決方案,它允許您在本地登錄 root 帳戶以及遠端登錄包括 root 在內的所有帳戶,而無需任何密碼。另一方面,解決方案不得影響安全性,除非以明確描述的方式,尤其是不允許遠端使用者訪問 root 帳戶或其他使用者的帳戶。該解決方案應該足夠健壯,以免間接導致安全問題。

一個接受和獎勵的答案可能會或可能不會描述單個工具的詳細配置,但必須包含實現既定目標的關鍵點。請注意,這可能無法通過使用 、 、 等工具的正常passwd使用sshsu解決sudo

閱讀第一個答案後的更多想法

只是一個想法——可以通過啟動 root shell 而不是登錄程序來實現本地 root 訪問。但是仍然需要只鎖定密碼認證,而不是公鑰認證。

我將提供解決方案的要求,作為要點:

  1. 無密碼根控制台登錄
  2. 來自預授權使用者的無密碼根遠端登錄
  3. 來自預授權使用者的指定帳戶的無密碼遠端登錄
  4. 來自預授權使用者的任何帳戶的無密碼遠端登錄

以下範例基於 Debian,因為這是我在這裡進行測試的內容。但是,我看不出為什麼這些原則不能應用於任何發行版(或者實際上任何基於 PAM 的 *ix 派生詞)。

無密碼根控制台登錄

我認為我解決這個問題的方法是利用 PAM 和/etc/securetty配置文件。

作為先決條件,必須設置“足夠安全”的根密碼。這不是控制台登錄所必需的,但存在使暴力破解嘗試不切實際。該帳戶是一個完全正常的根帳戶。

/etc/pam.d/login我有以下用於身份驗證的標準行集(以關鍵字開頭的行auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

引用common-auth的包含文件包含以下相關行:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

如果“UNIX 登錄”成功,該common-auth文件指示 PAM 跳過一條規則(拒絕)。通常這意味著/etc/shadow.

auth ... pam_securetty.so行配置為防止 root 登錄,但/etc/securetty. (此文件已包含所有控制台設備。)

通過稍微修改這一auth行,可以定義一個規則,該規則允許 root 使用者在沒有密碼的情況下從/etc/securetty. success=ok需要修改該參數,以便在成功匹配的情況下將ok其替換auth為要跳過的行數。在此處顯示的情況下,該數字是3,它跳到以下auth ... pam_permit.so行:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

來自預授權使用者的無密碼根遠端登錄

這是為那些被添加到根authorized_keys文件的授權使用者直接包含 ssh 密鑰。

來自預授權使用者的指定帳戶的無密碼遠端登錄

這也是將授權使用者的 ssh 密鑰直接包含到適當和相應使用者的.ssh/authorized_keys文件中。(典型的遠端使用者 chris 想要無密碼登錄到本地使用者 chris場景。)

請注意,帳戶在創建後可以保持預設鎖定狀態(即僅!在密碼欄位中/etc/shadow),但允許基於 SSH 密鑰的登錄。這需要 root 將密鑰放在新使用者的.ssh/authorized_keys文件中。不太明顯的是,這種方法僅在UsePAM Yes設置為時可用/etc/ssh/sshd_config。PAM 區!分為“帳戶鎖定密碼,但可能允許其他訪問方法”和!...“帳戶鎖定。期間”。(如果UsePAM No設置了,那麼 OpenSSH 會認為任何!啟動密碼欄位的存在都代表一個鎖定的帳戶。)

來自預授權使用者的任何帳戶的無密碼遠端登錄

我不完全清楚你是否想要這個設施。即,某些授權使用者無需密碼即可通過 ssh 登錄任何每個本地帳戶。

我無法測試這種情況,但我相信這可以通過 OpenSSH 5.9 或更高版本來實現,它允許authorized_keys/etc/ssh/sshd_config. 編輯配置文件以包含另一個名為/etc/ssh/authorized_keys. 將您選擇的授權使用者的公鑰添加到此文件中,確保權限為 root 擁有並且只有 root (0644) 具有寫訪問權限。

引用自:https://unix.stackexchange.com/questions/184486