跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 安全和强化指南 / 本地安全性 / 使用 PolKit 进行授权
适用范围 SUSE Linux Enterprise Server 15 SP4

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 的值调整为 restrictivestandard。然后以 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 表示用户需要输入通行口令。

注意
注意:SUSE Linux Enterprise Server 上使用的 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>

1

策略文件的根元素。

2

仅包含一个操作。

3

defaults 元素包含多个权限,这些权限在 SSH、VNC 等远程会话中使用(allow_inactive 元素)、在通过 TTY 或 X 显示器直接登录到计算机时使用(allow_active 元素),或者在这两种情况下均可使用(allow_any 元素)。值 auth_admin 指示需要以管理用户的身份进行身份验证。

4

annotate 元素包含有关 PolKit 如何执行操作的具体信息。在本例中,它包含可执行文件的路径,并指出是否允许 GUI 打开 X 显示器。

要添加您自己的策略,请创建采用上述结构的 .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 中定义。此处定义的特权始终优先于其他配置文件中定义的特权。要定义您的自定义特权集,请执行以下操作:

  1. 打开 /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 的口令进行一次身份验证,会向其授予对当前及将来的会话的特权

  2. root 身份运行,以使更改生效:

    # /sbin/set_polkit_default_privs
  3. (可选)使用 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 只会重设置已设为上游默认设置的策略。

过程 19.1︰ 恢复 SUSE Linux Enterprise Server 默认设置
  1. 确保 /etc/polkit-default-privs.local 不包含默认策略的任何覆盖操作。

    重要
    重要:自定义策略配置

    在执行下一步骤期间,将在默认设置的最前面应用 /etc/polkit-default-privs.local 中定义的策略。

  2. 要先将所有策略重设置为上游默认设置,然后再应用 SUSE Linux Enterprise Server 默认设置,请执行以下命令:

    > sudo rm -f /var/lib/polkit/* && set_polkit_default_privs