19 使用 PolKit 进行授权 #
PolKit(以前称为 PolicyKit)是一个应用程序框架,充当非特权用户会话与特权系统环境之间的协商者。每当用户会话中的某个进程尝试在系统环境中执行操作时,系统就会查询 PolKit。根据配置(在所谓的“策略”中指定)的不同,回答可能为“是”、“否”或“需要身份验证”。与 sudo 等传统的特权授权程序不同,PolKit 不会向整个会话授予 root
权限,而只向相关的操作授予该权限。
19.1 概念概述 #
PolKit 会按用户、组或名称限制特定的操作。然后,它会定义允许这些用户如何执行此操作。
19.1.1 可用的身份验证代理 #
当用户使用图形环境或通过控制台启动会话时,每个会话由授权和身份验证代理构成。授权以系统消息总线上的一个服务的形式来实现,而身份验证代理用于对启动会话的用户进行身份验证。当前用户需要证明其真实性(例如,使用通行口令)。
每个桌面环境都有自己的身份验证代理。通常,无论您选择哪个环境,都会自动启动该代理。
19.1.2 PolKit 的结构 #
PolKit 的配置取决于操作和授权规则:
- 操作(文件扩展名
*.policy
) 以 XML 文件形式编写,位于
/usr/share/polkit-1/actions
中。每个文件定义一个或多个操作,每个操作都包含说明和默认权限。尽管系统管理员可以编写自己的规则,但 PolKit 的文件不可编辑。- 授权规则(文件扩展名
*.rules
) 以 JavaScript 文件形式编写,位于以下两个位置:
/usr/share/polkit-1/rules.d
(用于第三方软件包)和/etc/polkit-1/rules.d
(用于本地配置)。每个规则文件都会引用操作文件中指定的操作。规则确定允许对用户子集实施哪些限制。例如,某个规则文件可能会否决某个限制性权限,并且允许某些用户允许该权限。
19.1.3 可用的命令 #
PolKit 包含若干用于特定任务的命令(有关更多细节,另请参见特定的手册页):
pkaction
获取有关所定义操作的细节。有关更多信息,请参见第 19.3 节 “查询特权”。
pkcheck
检查
--process
或--system-bus-name
所指定的进程是否获得授权。pkexec
允许获得授权的用户以另一用户的身份执行特定程序。
pkttyagent
启动文本身份验证代理。如果桌面环境没有自己的身份验证代理,将使用此代理。
19.1.4 可用的策略和支持的应用程序 #
目前,并非所有需要特权的应用程序都使用 PolKit。下面列出了 SUSE® Linux Enterprise Server 上提供的最重要的策略,这些策略按其使用场合类别排序。
- PulseAudio
设置 PulseAudio 守护程序的调度优先级 - CUPS
添加、去除、编辑、启用或禁用打印机 - GNOME
使用 GConf 修改系统和必需的值 更改系统时间 - libvirt
管理和监视本地虚拟化系统 - PolKit
读取和更改其他用户的特权 修改默认值 - PackageKit
更新和去除软件包 更改和刷新软件源 安装本地文件 回滚 导入软件源密钥 接受 EULA 设置网络代理 - 系统
网络唤醒 挂载或卸载固定、可热插拔和加密的设备 弹出和解密可移动媒体 启用或禁用 WLAN 启用或禁用蓝牙 设备访问 停止、挂起、休眠和重启动系统 移除扩展坞 更改电源管理设置 - YaST
注册产品 更改系统时间和语言
19.2 授权类型 #
每当支持 PolKit 的进程执行特权操作时,系统都会询问 PolKit 此进程是否有权这样做。PolKit 根据针对此进程定义的策略做出回答。回答可能为是
、否
或需要身份验证
。默认情况下,策略包含自动应用于所有用户的隐式
特权。您也可以指定应用于特定用户的显式
特权。
19.2.1 隐式特权 #
可以针对任何活动和非活动的会话定义隐式特权。活动会话是您当前正在使用的会话,例如,当您切换到另一个控制台后,它就会变成非活动会话。如果将隐式特权设置为“否”,则不会为任何用户授权;设置为“是”则会为所有用户授权。不过,隐式特权通常用于请求身份验证。
用户可以通过以 root
身份或者以本身的身份进行身份验证来授权。这两种身份验证方法存在四种变体:
- 身份验证
用户始终需要进行身份验证。
- 一次性身份验证
身份验证绑定到当前运行的程序实例。重启动该程序后,用户需要再次进行身份验证。
- 保留会话身份验证
身份验证对话框会提供一个勾选按钮
。如果选中此项,身份验证将一直有效,直至用户注销。- 无限期保留身份验证
身份验证对话框会提供一个勾选按钮
。如果选中此项,用户只需进行一次身份验证。
19.2.2 显式特权 #
显式特权可向特定用户授予。可以不受限制地授予特权,或者,在使用约束时,将特权限制为仅对活动会话和/或本地控制台有效。
不仅可以向用户授予特权,而且还可以阻止用户。阻止的用户无法执行需要授权的操作,即使默认的隐式策略允许通过身份验证授权也不例外。
19.2.3 默认特权 #
支持 PolKit 的每个应用程序都随附了由应用程序开发人员定义的一组默认隐式策略。这些策略就是所谓的“上游默认设置”。上游默认设置定义的特权不一定是在 SUSE 系统上默认激活的特权。SUSE Linux Enterprise Server 随附了一组可以覆盖上游默认设置的预定义特权:
/etc/polkit-default-privs.standard
定义适合大多数桌面系统的特权
/etc/polkit-default-privs.restrictive
设计用于集中管理的计算机。默认处于活动状态。
要在两组默认特权之间切换,请在 /etc/sysconfig/security
中将 POLKIT_DEFAULT_PRIVS
的值调整为 restrictive
或 standard
。然后以 root
身份运行 set_polkit_default_privs
命令。
请勿修改上述列表中的两个文件。要定义您自己的自定义特权集,请使用 /etc/polkit-default-privs.local
。有关详细信息,请参考 第 19.4.3 节 “修改隐式特权的配置文件”。
19.3 查询特权 #
要查询特权,请使用 PolKit 中包含的 pkaction
命令。
PolKit 随附了用于更改特权以及以另一用户身份执行命令的命令行工具(有关简要概述,请参见第 19.1.3 节 “可用的命令”)。每个现有策略都有一个自述性的唯一名称用于标识自身。使用 pkaction
命令可列出所有可用策略。有关详细信息,请参见 man pkaction
。
如果您要显示给定策略(例如 org.freedesktop.login1.reboot
)所需的授权,请按如下方式使用 pkaction
:
>
pkaction -v --action-id=org.freedesktop.login1.reboot
org.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
关键字 auth_admin_keep
表示用户需要输入通行口令。
pkaction
限制
pkaction
始终针对上游默认设置运行。因此,无法使用它来列出或恢复 SUSE Linux Enterprise Server 随附的默认设置。要执行此操作,请参见第 19.5 节 “恢复默认特权”。
19.4 修改配置文件 #
当您想要在不同的计算机上部署相同的策略集(例如,部署到特定团队的计算机)时,可以采用通过修改配置文件来调整特权的做法。您可以通过修改配置文件来更改隐式和显式特权。
19.4.1 添加操作规则 #
可用的操作取决于您在系统上安装了哪些附加软件包。如需简要概述,请使用 pkaction
列出定义的所有规则。
如要了解如何将 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-policykit-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>
策略文件的根元素。 | |
仅包含一个操作。 | |
| |
|
要添加您自己的策略,请创建采用上述结构的 .policy
文件,将适当的值添加到 id
属性,并定义默认权限。
19.4.2 添加授权规则 #
您自己的授权规则会否决默认设置。要添加您自己的设置,请将您的文件储存在 /etc/polkit-1/rules.d/
下。
此目录中的文件名以两位数开头,后接一个描述性名称,以 .rules
结尾。这些文件中的函数按其排序顺序执行。例如,00-foo.rules
排在 60-bar.rules
甚至 90-default-privs.rules
的前面(因而也会在它们的前面执行)。
在文件中,脚本会检查 .policy
文件中定义的指定操作 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; } });
http://www.freedesktop.org/software/polkit/docs/latest/ref-api.html 上提供了 PolKit API 中各函数的所有类和方法的说明。
19.4.3 修改隐式特权的配置文件 #
SUSE Linux Enterprise Server 随附了两组默认授权,分别位于 /etc/polkit-default-privs.standard
和 /etc/polkit-default-privs.restrictive
中。有关更多信息,请参见第 19.2.3 节 “默认特权”。
自定义特权在 /etc/polkit-default-privs.local
中定义。此处定义的特权始终优先于其他配置文件中定义的特权。要定义您的自定义特权集,请执行以下操作:
打开
/etc/polkit-default-privs.local
。要定义特权,请使用以下格式为每个策略添加一行:<privilege_identifier> <any session>:<inactive session>:<active session>
例如:
org.freedesktop.policykit.modify-defaults auth_admin_keep_always
下面是对 SESSION 占位符有效的值:
yes
授予特权
no
拦截
auth_self
用户每次请求特权时都需要使用自己的口令进行身份验证
auth_self_keep_session
用户需要为每个会话使用自己的口令进行一次身份验证,会向其授予对整个会话的特权
auth_self_keep_always
用户需要使用自己的口令进行一次身份验证,会向其授予对当前及将来的会话的特权
auth_admin
用户每次请求特权时都需要使用
root
的口令进行身份验证auth_admin_keep_session
用户需要为每个会话使用
root
的口令进行一次身份验证,会向其授予对整个会话的特权auth_admin_keep_always
用户需要使用
root
的口令进行一次身份验证,会向其授予对当前及将来的会话的特权
以
root
身份运行,以使更改生效:# /sbin/set_polkit_default_privs
(可选)使用
pkaction
命令检查所有特权标识符的列表。
19.5 恢复默认特权 #
SUSE Linux Enterprise Server 随附了一组默认已激活因而会覆盖上游默认设置的预定义特权。有关详细信息,请参考 第 19.2.3 节 “默认特权”。
由于 PolKit 图形工具和命令行工具始终针对上游默认设置运行,SUSE Linux Enterprise Server 另外提供了命令行工具 set_polkit_default_privs
。此工具可将特权重设置为 /etc/polkit-default-privs.*
中定义的值,但 set_polkit_default_privs
只会重设置已设为上游默认设置的策略。
确保
/etc/polkit-default-privs.local
不包含默认策略的任何覆盖操作。重要:自定义策略配置在执行下一步骤期间,将在默认设置的最前面应用
/etc/polkit-default-privs.local
中定义的策略。要先将所有策略重设置为上游默认设置,然后再应用 SUSE Linux Enterprise Server 默认设置,请执行以下命令:
>
sudo
rm -f /var/lib/polkit/* && set_polkit_default_privs