為什麼不能使用su
切換到密碼為空的使用者?
創建一個名為
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/su
,su
二進製文件是使用pam
庫 (libpam*
) 編譯的,因此身份驗證、帳戶管理、會話啟動等內容將由pam
.以下是典型 Ubuntu 系統的
su
管理方式pam
,如果您使用的是其他發行版,您應該找到類似的方法。的
pam
規則su
在文件中定義/etc/pam.d/su
。此文件還包括與通用模板相同目錄中的common-auth
、common-passwd
、common-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-*
文件)