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