Polkit 是图形 Linux 桌面环境使用的身份验证框架,用于对系统上的访问权限进行细粒度管理。传统上,在 Linux 中,在完全授权的管理员帐户 root 用户和系统上的所有其他帐户和组之间存在很强的权限分离。这些非管理员帐户可能具有某些额外的权限,例如通过 audio 组访问声音硬件。但是,这种权限是固定的,无法在特定情况下或特定持续时间内授予。
与其完全切换到 root 用户(使用诸如 sudo 之类的程序)以获取更高的权限,不如 Polkit 根据需要向用户或组授予特定的权限。这由配置文件控制,这些配置文件描述了需要在动态上下文中授权的单个操作。
Polkit 由多个组件组成。 polkitd 是一个具有特权的中央后台服务,它基于现有的 Polkit 配置执行身份验证检查。启用 Polkit 的应用程序将特定的身份验证请求转发到 polkitd 守护进程。在非特权用户上下文中运行的 Polkit 身份验证代理负责代表 polkitd 守护进程显示身份验证请求,并提供用户交互式输入凭据。
Polkit 操作 代表一个受 Polkit 授权规则约束的单个活动。例如,重新启动计算机的意图可以建模为 Polkit 中的单个操作。每个操作都有一个唯一的标识符,对于重新启动示例,该操作称为 org.freedesktop.login1.reboot。
当用户在功能齐全的桌面环境中启动图形会话时,通常会自动启动身份验证代理,在后台运行。当应用程序请求对某个操作的授权时,您会注意到出现身份验证提示。在文本模式或通过 SSH 使用 Polkit 并非易事,因此本文档重点介绍其在图形会话环境中的使用。
Polkit 的配置由 操作 和 授权规则 组成
*.policy)操作在位于 /usr/share/polkit-1/actions 的 XML 文件中定义。每个文件定义了某个应用程序域的一个或多个操作,每个操作包含人类可读的描述及其默认授权设置。虽然系统管理员可以编写自己的规则,但这些默认策略文件不得直接编辑。
*.rules)规则是用 JavaScript 编程语言编写的,位于两个位置:/usr/share/polkit-1/rules.d 由系统软件包使用,而 /etc/polkit-1/rules.d 用于本地管理的配置。规则文件包含在默认操作授权设置之上的更复杂的逻辑。例如,规则文件可以推翻限制性操作,并允许某些用户在无需授权的情况下使用它。
Polkit 提供了用于特定任务的工具(有关更多详细信息,请参阅各自的手册页)
pkaction
获取有关已定义操作的详细信息。有关更多信息,请参阅 第 18.3 节,“查询权限”。
pkcheck
检查进程是否被授权执行特定的 Polkit 操作。
pkexec
允许程序根据 Polkit 授权设置以不同的用户身份执行。这类似于 su 或 sudo。
pkttyagent
启动文本身份验证代理。如果桌面环境没有自己的身份验证代理,则使用此代理。
每次启用 Polkit 的应用程序执行特权操作时,Polkit 都会被询问用户是否有权这样做。答案可以是 yes、no 或 authentication needed。在后一种情况下,将显示身份验证对话框,供用户输入必要的凭据。
如果不存在针对给定操作的专用 Polkit JavaScript 规则,则结果取决于 Polkit 策略文件中为每个操作定义的隐式授权设置。有三个授权类别:allow_active、allow_inactive 和 allow_any。 allow_active 适用于处于活动会话中的用户。活动会话是在文本模式控制台或图形用户环境中进行的本地登录。当您切换到另一个控制台时,会话变为非活动状态,此时类别 allow_inactive 变为相关。 allow_any 用于所有其他上下文,例如通过 SSH 或 VNC 登录的远程用户。每个类别都分配了以下授权设置之一
用户永远不会被授予所需操作的授权。
用户始终被授予授权,无需输入任何凭据。
用户需要输入自己的密码才能授权该操作。
类似于 auth_self,但授权会缓存一段时间,例如,如果同一应用程序再次执行相同的操作,则无需重新输入密码。
用户需要输入管理员 (root) 密码才能授权该操作。
类似于 auth_self_keep,需要管理员 (root) 密码。
到目前为止在 Polkit 策略文件中找到的隐式授权设置来自各个应用程序的开发人员。我们称这些设置为 上游默认值。这些上游默认值不一定与 SUSE 系统上使用的默认值相同。 openSUSE Leap 附带了一组预定义的权限,这些权限会覆盖上游默认值。这些设置有三种不同的风格(配置文件),其中一次只能激活一种
/etc/polkit-default-privs.easy
授权设置专为单用户桌面系统而设计,其中管理员也是活动的交互式用户。它以牺牲安全性为代价来提高用户体验。
/etc/polkit-default-privs.standard
适用于大多数系统的平衡设置。
/etc/polkit-default-privs.restrictive
更保守的授权设置,可以减少潜在的攻击面,但会牺牲某些领域的用户体验。
要切换活动的 polkit 配置文件,请编辑 /etc/sysconfig/security 并调整 POLKIT_DEFAULT_PRIVS 的值,设置为 easy、standard 或 restrictive 中的一个。然后以 root 身份运行命令 set_polkit_default_privs。
不要修改上述文件中配置文件设置。要定义自己的自定义 Polkit 设置,请使用 /etc/polkit-default-privs.local。有关详细信息,请参阅 第 18.4.3 节,“修改 SUSE 默认权限”。
要查询权限,请使用 Polkit 中包含的命令 pkaction。
Polkit 带有用于更改权限和以另一个用户身份执行命令的命令行工具(有关简要概述,请参阅 第 18.1.3 节,“Polkit 工具”)。每个现有的策略都有一个唯一的名称,可以使用该名称来识别它。使用命令 pkaction 列出所有可用的策略。有关更多信息,请参阅 man pkaction。
要显示给定策略所需的授权(例如,org.freedesktop.login1.reboot),请按如下所示使用 pkaction
>pkaction -v --action-id=org.freedesktop.login1.rebootorg.freedesktop.login1.reboot: description: Reboot the system message: Authentication is required to allow rebooting the system 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: yes
pkaction 的限制
pkaction 仅考虑上游默认值。它不知道覆盖上游默认值的 SUSE 默认权限。因此,请小心解释此输出。
调整 Polkit 设置在您希望将相同的策略集部署到不同的机器时很有用,例如,部署到特定团队的计算机。自定义 Polkit 授权设置也可用于加强特定操作的安全性,或通过减少频繁使用的操作的密码提示来改善用户体验。但是,授予某些 Polkit 操作而无需身份验证可能会带来安全隐患,从而授予普通用户完全的 root 权限。在确定这不会违反您特定环境中的系统安全的情况下,降低 Polkit 身份验证要求。
可用 Polkit 操作的列表取决于您在系统上安装的软件包。要快速概述,请使用 pkaction 列出 Polkit 知道的所有操作。
为了便于说明,我们展示了命令 gparted(“GNOME 分区编辑器”)如何集成到 Polkit 中。
文件 /usr/share/polkit-1/actions/org.opensuse.policykit.gparted.policy 具有以下内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd"> <policyconfig> 1 <action id="org-opensuse-polkit-gparted"> 2 <message>Authentication is required to run the GParted Partition Editor</message> <icon_name>gparted</icon_name> <defaults> 3 <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> < allow_active>auth_admin</allow_active> </defaults> <annotate 4 key="org.freedesktop.policykit.exec.path">/usr/sbin/gparted</annotate> <annotate 4 key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
策略文件的根 XML 元素。 | |
开始定义此策略中的唯一操作。 | |
此处找到了上面描述的隐式授权设置。 | |
|
要添加自己的策略,请创建一个具有上述结构的 .policy 文件,将适当的操作名称添加到 id 属性中,并定义所需的覆盖隐式授权设置。
Polkit 授权框架以前名为 PolicyKit。在某些地方,例如上面的 XML 文档序言中,此旧名称仍然出现。
授权规则优先于隐式授权设置。要添加自己的规则,请将文件存储在 /etc/polkit-1/rules.d/ 下。
此目录中的文件以一个两位数字开头,后跟一个破折号、一个描述性名称,并以 .rules 结尾。这些文件中的函数将按照目录中文件名的词法顺序执行。例如,00-foo.rules 的执行顺序(因此执行时间)在 60-bar.rules 甚至 90-default-privs.rules 之前。
在规则文件中,脚本通常会检查要授权的动作 ID。例如,要允许任何 admin 组的成员执行 gparted 命令,请检查动作 ID org.opensuse.policykit.gparted
/* Allow users in admin group to run GParted without authentication */
polkit.addRule(function(action, subject) {
if (action.id == "org.opensuse.policykit.gparted" &&
subject.isInGroup("admin")) {
return polkit.Result.YES;
}
});在 Polkit API 文档中查找所有类和函数的描述,请访问 https://www.freedesktop.org/software/polkit/docs/latest/ref-api.html。
如 第 18.2.2 节,“SUSE 默认权限” 中所述,SUSE 为 Polkit 隐式授权设置提供了不同的覆盖配置文件,这些配置文件由上游开发者定义。可以在 /etc/polkit-default-privs.local 中定义自定义权限。此处定义的权限始终优先于预定义的配置文件设置。要添加自定义权限设置,请执行以下操作
编辑 /etc/polkit-default-privs.local。要定义权限,请为每个动作添加如下格式的行
<action-id> <auth_any>:<auth_inactive>:<auth_active>
或者,如果所有三个类别接收到相同的值,也可以指定单个值
<action-id> <auth_all>
例如
org.freedesktop.color-manager.modify-profile auth_admin_keep
以 root 用户身份运行此工具,以使更改生效
#/sbin/set_polkit_default_privs
有关 SUSE Polkit 默认权限的完整文档,请参阅 man polkit-default-privs。
要恢复 SUSE 默认授权设置,请按照以下步骤操作
如 第 18.2.2 节,“SUSE 默认权限” 中所述,选择所需的配置文件
删除 /etc/polkit-default-privs.local 中的任何覆盖。
运行 set_polkit_default_privs 以重新生成默认规则。