selinux 开启导致 Linux 无法登录
登录提示:/bin/login: error while loading shared libraries: libaudit.so.1: failed to map segment from shared object: Permission denied
开始排障
使用的操作系统是centos 7,登录时提示 /etc/sysctl.conf 和 /etc/sysctl.d/99-sysctl.conf 都是Permission denied
进入救援模式:
1. grub2界面有两个入口,正常系统入口和救援模式
2.修改grub2引导:
在正常系统入口按下“e”(有提示),会进入到edit模式,搜寻ro那一行,以linux16开头的
把ro改成rw,(把只读改成可写)
把rhgb quiet删除
增加init=/bin/sh
按下ctrl+X来启动系统
查看提示的文件权限没有问题,登录日志/var/log/secure也没发现问题,上图中提示的动态库文件也都存在,/etc/ld.so.conf中我也加上了 include /usr/lib64,还是不行
重启了一遍,看了一下服务启动情况
报错
Failed to start Create Volatile Files and Directories.
Failed to start Authorization Manager.
Failed to start Login Service.
解决办法
这时候想起了记文档的时候改过selinux,将 /etc/selinux/config 的SELINUX=enforcing 改为 SELINUX=disabled 之后就可以了。
其实这里的报错都是因为 polkit.service 这个服务没启动导致的,可以看一下这个服务的运行信息:
正好与报错吻合。真他妈巧是吧,还加载俩规则文件。
关于polkit这个服务的作用( 此部分摘自:https://wiki.archlinux.org/title/polkit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) )
说明
polkit 是一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯:控制决策集中在统一的框架之中,决定低优先级进程是否有权访问高优先级进程。
Polkit 在系统层级进行权限控制,提供了一个低优先级进程和高优先级进程进行通讯的系统。和 sudo 等程序不同,Polkit 并没有赋予进程完全的 root 权限,而是通过一个集中的策略系统进行更精细的授权。
Polkit 定义出一系列操作,例如运行 GParted, 并将用户按照群组或用户名进行划分,例如 wheel 群组用户。然后定义每个操作是否可以由某些用户执行,执行操作前是否需要一些额外的确认,例如通过输入密码确认用户是不是属于某个群组。
身份认证
Polkit 的权限管理是基于用户或群组进行配置,而身份认证组件的作用就是让会话用户证明自己是某个用户或属于某个群组。 图形化环境Cinnamon、Deepin、GNOME、GNOME Flashback、KDE、LXDE、LXQt、MATE、theShell 和 Xfce 各自都已有认证组件。请按照下列清单确认安装了对应的身份认证组件,并且在登录时 自动启动 它。 其他桌面环境需要从下列实现中选用一种,polkit 软件包提供了一个名为“pkttyagent”的基于文本方式的认证代理,作为后备方案。 lxqt-policykit,提供了 /usr/bin/lxqt-policykit-agent lxsession,提供了 /usr/bin/lxpolkit mate-polkit,提供了 /usr/lib/mate-polkit/polkit-mate-authentication-agent-1 polkit-efl-gitAUR,提供了 /usr/bin/polkit-efl-authentication-agent-1 polkit-gnome,提供了 /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 polkit-kde-agent,提供了 /usr/lib/polkit-kde-authentication-agent-1 ts-polkitagentAUR, 提供了 /usr/lib/ts-polkitagent xfce-polkit-gitAUR,提供了 /usr/lib/xfce-polkit/xfce-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 申请权限,比如通过命令行直接以 root 权限执行,这里的禁止设定就无法起作用。所以应该用 polkit 给低权限用户更高的权限,而不应该用 polkit 限制高权限用户可以执行的操作。出于安全考虑,sudoers仍然是一种方法。
操作
polkit 中的可用操作是安装的软件包决定的。有些在多种桌面环境下都可以使用,文件命名为 (org.freedesktop.*),有些只能在特定桌面下使用,文件命名类似 (org.gnome.*),有些操作是单个程序特有的,命名类类似 (org.archlinux.pkexec.gparted.policy)。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 文件的 <action> 标签中。例如 org.archlinux.pkexec.gparted.policy 包含一个操作: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN" "http://www.freedesktop.org/software/polkit/policyconfig-1.dtd"> <policyconfig> <action id="org.archlinux.pkexec.gparted"> <message>Authentication is required to run the GParted Partition Editor</message> <icon_name>gparted</icon_name> <defaults> <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> <allow_active>auth_admin</allow_active> </defaults> <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gparted</annotate> <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate> </action> </policyconfig>
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 类似,认证状态会保持一段时间。 这些设置是默认设置,只要没有被配置规则覆盖,适用于所有用户。 从上面的 Gparted 操作示例可以看出,不管用户是本地还是远程,都需要先认证为管理员之后才能使用 GParted。
posted on 2022-05-27 01:51 hopeless-dream 阅读(2367) 评论(1) 编辑 收藏 举报