Users

為什麼不能使用su切換到密碼為空的使用者?

  • February 13, 2018

創建一個名為test

$ sudo useradd test

test現在沒有密碼。所以

$ su test

不起作用。如果您嘗試,系統會要求您輸入test的密碼。它沒有一個。這與它的密碼為空不同,因此如果您按 Enter 輸入空密碼,則會收到消息“su:身份驗證失敗”。

如果您切換到 tty 並嘗試以以下身份登錄,情況也是如此test:不接受空密碼。

現在分配test一個空密碼:

$ sudo passwd -d test

您現在可以test通過提供空字元串作為密碼在 tty 上登錄。但是,如果您嘗試

$ su test

同樣,您仍然會收到消息“su: Authentication failure”會話沒有切換到使用者test

為什麼是這樣?

從 的輸出來看ldd /bin/susu二進製文件是使用pam庫 ( libpam*) 編譯的,因此身份驗證、帳戶管理、會話啟動等內容將由pam.

以下是典型 Ubuntu 系統的su管理方式pam,如果您使用的是其他發行版,您應該找到類似的方法。

pam 規則su在文件中定義/etc/pam.d/su。此文件還包括與通用模板相同目錄中的common-authcommon-passwdcommon-session文件,用於涵蓋其名稱建議的任務(並用於其他pam啟用的服務)。

在我的系統上,在我的底部/etc/pam.d/su有:

@include common-auth
@include common-account
@include common-session

前面幾行沒有處理空密碼檢查,主要是pam_unix模組的工作。

現在/etc/pam.d/common-auth有:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure

來自man pam_unix

空蕩蕩的

如果使用者的官方密碼為空,則此模組的預設操作是不允許使用者訪問服務。nullok 參數會覆蓋此預設值,並允許任何密碼為空的使用者訪問該服務。

nullok_secure

如果使用者的官方密碼為空,則此模組的預設操作是不允許使用者訪問服務。只要 PAM_TTY 的值設置為 /etc/securetty 中的值之一,nullok_secure 參數將覆蓋此預設值並允許任何密碼為空的使用者訪問服務。

如您所見,如果nullok_secure設置了該選項,除非以PAM_TTY上述方式設置環境變數,否則將不允許密碼為空的使用者使用su.

因此,要允許任何密碼為空的使用者執行操作su,您需要為模組提供nullok參數pam_unix

auth    [success=1 default=ignore]      pam_unix.so nullok

這是不安全的,因為該common-auth文件被許多其他服務使用,即使只是su這樣做也不應該這樣做。(為了測試,你可以設置一次,然後恢復到原來的。雖然如果你想做測試,最好將所有邏輯合併到/etc/pam.d/su文件中,然後修改任何更改,而不是弄亂任何common-*文件)

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