使用 SSH 的無密碼帳戶的一致且安全的方法
我必須承認,在某些情況下我喜歡沒有密碼的伺服器。一個典型的伺服器容易受到任何可以物理訪問它的人的攻擊。因此,在某些情況下,將其物理鎖定並從那時起信任任何物理訪問是切實可行的。
基本概念
理論上,當我實際到達這樣的伺服器時,我應該能夠通過簡單地輸入
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
使用ssh
來su
解決sudo
。閱讀第一個答案後的更多想法
只是一個想法——可以通過啟動 root shell 而不是登錄程序來實現本地 root 訪問。但是仍然需要只鎖定密碼認證,而不是公鑰認證。
我將提供解決方案的要求,作為要點:
- 無密碼根控制台登錄
- 來自預授權使用者的無密碼根遠端登錄
- 來自預授權使用者的指定帳戶的無密碼遠端登錄
- 來自預授權使用者的任何帳戶的無密碼遠端登錄
以下範例基於 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) 具有寫訪問權限。