Linux polkit!
2022年2月1日 Qualys警告主要 Linux 发行版存在”Polkit“漏洞
Polkit简介.
polkit是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程.
Polkit在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统.和sudo等程序不同,Polkit 并没有赋予进程完全的 root 权限,而是通过一个集中的策略系统进行更精细的授权.Polkit定义出一系列操作,例如运行GParted,并将用户按照群组或用户名进行划分,例如wheel群组用户.然后定义每个操作是否可以由某些用户执行,执行操作前是否需要一些额外的确认,例如通过输入密码确认用户是不是属于某个群组.
https://gitlab.freedesktop.org/polkit/polkit
配置Polkit文件.
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认证规则.
认证规则可以覆盖默认的设置,个人使用的单个系统设置,应该放到/etc/polkit-1/rules.d目录.
addRule() 方法可以增加一个函数,输入操作和用户,只要进行权限检查,这个函数就会被调用。所有函数会按添加顺序依次调用,只要遇到第一个 return 返回。所以,要将规则放到其它规则前,需要将规则文件放到 /etc/polkit-1/rules.d 的其它规则之前,最早的检查是 00-early-checks.rules。
.rules 文件的层级是完全自解释的:
/* Allow users in admin group to run GParted without authentication */
polkit.addRule(function(action, subject) {
if (action.id == "org.archlinux.pkexec.gparted" &&
subject.isInGroup("admin")) {
return polkit.Result.YES;
}
});Polkit配置范例.
禁用挂起和休眠.
- 下面规则禁止所有用户通过Polkit进行挂起和休眠.
/etc/polkit-1/rules.d/10-disable-suspend.rules
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.login1.suspend" ||
action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
action.id == "org.freedesktop.login1.hibernate" ||
action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
{
return polkit.Result.NO;
}
});跳过口令提示.
- 要模拟sudo的NOPASSWD选项,完全根据
user/group身份进行认证,可以在/etc/polkit-1/rules.d/中创建规则进行设置.参考:示例.
/etc/polkit-1/rules.d/49-nopasswd_global.rules
/* Allow members of the wheel group to execute any actions
* without password authentication, similar to "sudo NOPASSWD:"
*/
polkit.addRule(function(action, subject) {
if (subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});允许一般用户管理某个systemd单元.
/etc/polkit-1/rules.d/10-wifimanagement.rules
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
if (action.lookup("unit") == "wpa_supplicant.service") {
var verb = action.lookup("verb");
if (verb == "start" || verb == "stop" || verb == "restart") {
return polkit.Result.YES;
}
}
}
});

