Systemd

為什麼 hostnamectl 不需要密碼來更改主機名?

  • July 25, 2018

似乎用 systemd 更改主機名的新方法是:

hostnamectl set-hostname NEWNAME

但是,當以具有管理員權限的使用者身份登錄時(不確定哪個組計數),這不需要密碼。對於非管理員使用者,它會彈出一個對話框,要求其中一位特權使用者輸入密碼。

我認為“shutdown -h now”甚至適用於非管理員使用者。

我假設這些都是與 systemd 相關的新命令。

他們如何檢查送出命令的使用者是否有權執行它們?我怎樣才能讓他們要求輸入密碼或要求 sudo?

systemd相關實用程序中,可能需要特權訪問的操作通過 PolicyKit 進行路由。pkaction不帶任何參數執行以查看 PolicyKit 處理的所有可能操作的列表。要查看特定操作的目前策略,請使用pkaction --verbose --action-id <action identifier。例如,更改主機名:

# pkaction | grep host
org.freedesktop.hostname1.set-hostname
org.freedesktop.hostname1.set-machine-info
org.freedesktop.hostname1.set-static-hostname

# pkaction --verbose --action-id org.freedesktop.hostname1.set-hostname
org.freedesktop.hostname1.set-hostname:
 description:       Set host name
 message:           Authentication is required to set the local host name.
 vendor:            The systemd Project
 vendor_url:        http://www.freedesktop.org/wiki/Software/systemd
 icon:              
 implicit any:      auth_admin_keep
 implicit inactive: auth_admin_keep
 implicit active:   auth_admin_keep

因此,我係統上用於更改主機名的目前策略是auth_admin_keep- 也就是說,需要管理員的密碼,除非使用者最近成功通過了類似的檢查(就像sudo它可以避免連續的密碼請求一樣)。

誰是管理員,其密碼可以授權這些操作?在我的 Debian 9 系統上,這是由目錄中的文件決定的/etc/polkit-1/localauthority.conf.d/- 預設情況下,只有 root 和sudo使用者組的成員才有資格。

如果您不喜歡這個策略,您可以通過編寫一些自定義 PolicyKit 配置文件來輕鬆更改它。

PolicyKit 可以配置為對它管理的任何操作要求以下任何“安全級別”:

  • yes- 使用者可以隨時做到,不問任何問題
  • auth_self_keep- 如果使用者最近沒有做任何需要密碼檢查的事情,請求使用者的密碼以確保它真的是他/她。如果在幾分鐘的視窗內執行了此級別的多個連續操作,則可以跳過第一個之後的檢查。
  • auth_self- 總是要求使用者的密碼檢查
  • auth_admin_keep- 需要管理員使用者的密碼。就像auth_self_keep,在輸入一次密碼(以及可選的管理員使用者名)後,使用者可以在短暫的時間視窗內執行此級別的多個操作,而無需進一步的密碼請求
  • auth_admin- 始終需要密碼檢查,響應密碼檢查的使用者必須是管理使用者之一
  • no- 該行動被拒絕,沒有任何進一步的問題。

維護結果的時間..._keep顯然是在 PolicyKit 上游程式碼中硬編碼的:這裡是 PolicyKit Git 的連結。

/* TODO: right now the time the temporary authorization is kept is hard-coded - we
*       could make it a propery on the PolkitBackendInteractiveAuthority class (so
*       the local authority could read it from a config file) or a vfunc
*       (so the local authority could read it from an annotation on the action).
*/
expiration_seconds = 5 * 60;

目前似乎沒有任何規定可以在執行時配置此值,也沒有在設置後擴展身份驗證時間戳。

OpenSuSE 似乎已經擴展了這一點...keep_session並取得了...keep_always成果。顯然,他們還重新解釋了這些...keep動作,以表示“只要詢問過程繼續執行,就記住結果”。

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