为什么 hostnamectl 不需要密码来更改主机名?

为什么 hostnamectl 不需要密码来更改主机名?

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

hostnamectl set-hostname NEWNAME

但是,当以具有管理员权限的用户身份登录时(不确定哪个组算在内),这不需要密码。对于非管理员用户,它会弹出一个对话框,要求其中一位特权用户输入密码。

我认为“shutdown -h now”甚至适用于非管理员用户。

我认为这些都是与 systemd 相关的新命令。

他们如何检查提交命令的用户是否有权运行它们?我怎样才能让他们要求输入密码或需要 sudo?

答案1

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操作,意味着“只要询问过程继续运行,就记住结果”。

相关内容