Linux停止某个服务时报错Authorization not available. Check if polkit service is running

问题现象

两个类似案例:服务启动失败和smb服务启动失败

启动polkit服务也报相同错误

解决方案

https://access.redhat.com/solutions/1543343

1) Ensure the existence of a polkitd  system  user & group

getent group polkitd >/dev/null && echo -e "\e[1;32mpolkitd group already exists\e[0m" || { groupadd -r polkitd && echo -e "\e[1;33mAdded missing polkitd group\e[0m" || echo -e "\e[1;31mAdding polkitd group FAILED\e[0m"; }

getent passwd polkitd >/dev/null && echo -e "\e[1;32mpolkitd user already exists\e[0m" || { useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd && echo -e "\e[1;33mAdded missing polkitd user\e[0m" || echo -e "\e[1;31mAdding polkitd user FAILED\e[0m"; }

2) Reset the permissions and user/group ownership for all files provided by the polkit and polkit-pkla-compat packages

rpm -Va polkit\* && echo -e "\e[1;32mpolkit* rpm verification passed\e[0m"  || { echo -e "\e[1;33mResetting polkit* rpm user/group ownership & perms\e[0m"; rpm --setugids polkit polkit-pkla-compat; rpm --setperms polkit polkit-pkla-compat; }

3) Reboot

A reboot of the machine will be required to make sure that all changes take affect and that polkit has reconnected to the dbus

shutdown -r now

4) Open a support case if there are still issues

Polkit中文介绍:Authorization  Manager

polkit中文介绍

https://wiki.archlinux.org/index.php/Polkit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

polkit使用手册

https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

polkit为特权程序(“ MECHANISMS”)提供了一个授权API,使得该特权程序为非特权程序(“ SUBJECTS”)提供这样的服务:以某种形式的进程间通信机制。

在这种情况下,该机制通常将非特权程序视为不可信。对于来自非特权程序的每个请求,该机制需要确定该请求是否已被授权或是否应拒绝为该非特权程序提供服务。

使用polkit API:将该决定转移给受信任的一方:polkit授权。

polkit授权以系统守护程序polkitd实现的,该守护程序本身以polkitd系统用户身份运行时几乎没有特权。特权程序Mechanisms,非特权程序subjects以及认证代理authentication agents使用系统消息总线和polkit授权机构进行通信。

除充当授权机构外,polkit还允许用户通过管理用户或客户端所属会话的所有者来获得临时授权。对于需要特权程序来验证系统操作员确实是用户还是管理用户的场景,这很有用。

系统架构

polkit系统架构由认证Authority (消息总线上的一个服务) 和每个会话一个认证代理组成。操作Actions由应用定义。运营商,站点和系统管理员可以通过认证规则来控制认证策略。

另外一番介绍

polkit 是一个应用程序级别的工具集通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。

Polkit 在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和 sudo 等程序不同,Polkit 并没有赋予进程完全的 root 权限,而是通过一个集中的策略系统进行更精细的授权

Polkit定义出一系列操作,例如运行GParted, 并将用户按照群组或用户名进行划分,例如 wheel 群组用户。然后定义每个操作是否可以由某些用户执行执行操作前是否需要一些额外的确认,例如通过输入密码确认用户是不是属于某个群组。

1) 身份认证组件

Polkit 的权限管理是基于用户或群组进行配置,而身份认证组件的作用就是让会话用户证明自己是某个用户或属于某个群组。

2) 配置

Polkit 定义了两种不同的内容:

操作(Actions):在 /usr/share/polkit-1/actions中定义,文件是 XML 格式,以 .policy 结尾。每个操作都有一个默认的权限集合(例如,你需要标识为管理员以使用 GParted 操作)。默认值是可以修改的,但是不应该通过修改操作文件实现。

认证规则(Authorization rules):用JavaScript语法定义,文件以 .rules 结尾。有两个目录可放置规则文件:第三方的包将文件放置在 /usr/share/polkit-1/rules.d(尽管很少见),本地配置应该放置在 /etc/polkit-1/rules.d。

Polkit 没有取代系统已有的权限系统,而是在已有的群组和管理员上进行管控。.rules 文件指定了一个用户的子集合,涉及到一个或多个操作文件中指定的操作,并规定这些用户可以执行哪些操作,需要满足哪些限制。举例来说,GParted 默认规则要求所有用户认证为管理员之后才能使用,可以用规则文件修改默认规则,规定某个用户不需要管理员身份认证就可以执行操作,也可以完全禁止某个用户使用 GParted。

注意: 如果用户不是通过 polkit 申请权限,比如通过命令行直接以 root 权限执行,这里的禁止设定就无法起作用。所以应该用 polkit 给低权限用户更高的权限,而不应该用 polkit 限制高权限用户可以执行的操作。出于安全考虑,sudoers仍然是一种方法。

2.1) 操作

pkaction 命令会显示所有定义在 /usr/share/polkit-1/actions 操作。

通过下面几个常用的操作类型,可以了解 polkit 到底能做什么:

systemd-logind (org.freedesktop.login1.policy) 定义用户是否有权限进行关机、重启、挂起、休眠等操作,即使有其它用户登录时, polkit 也能管控某个用户的上述权限。

udisks (org.freedesktop.udisks2.policy) 定义文件系统挂载、加密磁盘打开等操作。

NetworkManager (org.freedesktop.NetworkManager.policy) 定义网络打开和关闭, wifi 和移动网络间的切换。

每个操作都定义在 .policy 文件的 标签中。例如 org.archlinux.pkexec.gparted.policy 包含一个操作:

id 属性是发送给 D-Bus 的命令,message 属性用来在身份认证时向用户解释当前动作,icon_name 是图标。

defaults 标签下定义权限。包含三种设置:allow_any、allow_inactive和allow_active。Inactive 会话是远程会话(例如 SSH、VNC 等。)active 会话是本地终端或图形界面直接登录机器的会话。allow_any 同时包含两种会话。

对每个设置,都有如下选项:

no:不允许用户执行操作不需要身份认证。

yes:用户可以不进行认证就执行操作。

auth_self:需要认证,但是用户可以只输入自己的密码,不需要属于管理员。

auth_admin:需要用户认证为管理员。

auth_self_keep:和 auth_self 类似,认证状态会保持一段时间。

auth_admin_keep:和 auth_admin 类似,认证状态会保持一段时间。

2.2) 认证规则

认证规则可以覆盖默认的设置,个人使用的单个系统设置,应该放到 /etc/polkit-1/rules.d 目录。

addRule() 方法可以增加一个函数,输入操作和用户,只要进行权限检查,这个函数就会被调用。所有函数会按添加顺序依次调用,只要遇到第一个 return 返回。所以,要将规则放到其它规则前,需要将规则文件放到 /etc/polkit-1/rules.d 的其它规则之前,最早的检查是 00-early-checks.rules。

.rules 文件的层级是完全自解释的:

上面函数检查操作 ID (是否 org.archlinux.pkexec.gparted),再确认用户群组(是否属于 admin ),如果是,返回 "yes"。

2.3) 管理员身份认证

addAdminRule() 方法会添加一个在每个管理员认证时被执行的函数。此函数用来规定什么用户可被视作系统管理员。函数的输入是操作和用户,函数按顺序依次执行,直到第一个return。

系统默认的配置位于 50-default.rules,如果要修改这个值,需要把自定义的身份确认函数加到 50 之前,比如 40-default.rules。

需要配置的是 return 返回值:输入谁的密码之后就被认为是系统管理员。如果用户自己属于管理员群组,只需要输入自己的密码。如果只有 root 是管理员,需要输入 root 密码。

你可能感兴趣的:(Linux停止某个服务时报错Authorization not available. Check if polkit service is running)