图形应用程序的权限提升
本文提供了使用图形应用程序执行特权任务(如挂载文件系统、对驱动器进行分区以及编辑系统文件)的方法。应避免将整个图形应用程序作为 root 运行,因为
- 它可能会在不经意间修改您主目录中的文件权限。
- 大多数图形代码尚未经过审计以确保其在高权限下运行是安全的。
在 GUI 应用程序中执行特权操作
使用 polkit 提升权限
polkit 允许非特权 GUI 应用程序执行某些预先安排的需要特殊权限的操作。如果应用程序支持 polkit,且系统中有一个正在运行的 polkit 代理,那么在必要时系统应自动提示您输入凭据。
要查找系统中支持 polkit 的应用程序,您可以先通过 pacman -Qi polkit 查看哪些软件包依赖它。此外,每个支持的应用程序都会在 /usr/share/polkit-1/actions/ 中安装一个或多个策略。一些 polkit 程序是面向用户的应用程序,例如 gparted,而另一些则是被其他应用程序使用的共享实用程序。例如,许多 文件管理器 使用 udisks2 或 gvfs 来根据请求挂载文件系统。
文件编辑
这些是不依赖于具体应用程序的编辑文件的方法,用于编辑通常无法访问和/或无法写入的文件。
sudoedit
对于对系统文件的单次编辑,可以使用 sudoedit 在您的编辑器中编辑一个临时的非特权副本。
GVFS
可以通过 GVFS 访问特权文件和目录,方法是在 URI 方案中指定 admin 后端[1][2],例如:
$ nautilus admin:///root/
或者
$ gedit admin:///etc/fstab
Ctrl+l,然后在资源路径前加上 admin:// 方案。通过 其他位置 服务器地址栏也可以达到同样的效果。kio-admin
KIO Admin Worker 在支持 KIO 的应用程序(如 Dolphin)中提供 admin:// URI,从而允许特权文件操作。
以 root 身份运行 GUI 应用程序
- [...] 没有任何*真实*的、有据可查的技术理由让任何人以 root 身份运行 GUI 应用程序。通过以管理员用户运行 GUI 应用程序,您实际上是在运行数百万行未经妥善审计即可在提升权限下运行的代码;您还在运行会接触您 $HOME 内部文件并可能更改其文件系统所有权的代码;通过 IPC 连接到更多正在运行的代码,等等。
- 您正在打开一个巨大的、 gaping 的安全漏洞 [...]。
Xorg
出于安全原因,默认情况下 root 将无法连接到非 root 用户的 X 服务器。但是,如果有必要,有多种方法可以允许 root 这样做。
Polkit
在 X 环境下以提升权限运行 GUI 应用程序的正确且推荐的方法是创建 Polkit 策略,如这个论坛帖子所示。
然而,正如 pkexec(1) 所提醒的,这“仅应在旧程序中使用”。应用程序应该“将特权操作交给一个可审计的、独立的、最小化的代码片段,该片段在执行权限提升后运行,并在不再需要时被丢弃”[3]。这可以作为向原项目提交 Bug 报告的理由。
临时方法
这些方法将应用程序包装在提升权限框架中,并在应用程序退出后丢弃获取的权限:
$ kdesu application
$ sudo application
- suxAUR(su 的包装器,将传输您的 X 凭据)
$ sux root application
替代方法
这些方法允许 root 连接到非 root 用户的 X 服务器,但会带来不同程度的安全风险,尤其是如果您运行 ssh 的话。如果您处于防火墙之后,您可以认为它们对于您的需求足够安全。
Xhost
Xhost 可用于临时允许 root 访问。
永久允许 root 访问
- 方法 1:将该行
session optional pam_xauth.so
添加到 /etc/pam.d/su 和 /etc/pam.d/su-l 中。然后使用 su 或 su - 切换到 root 用户。
- 方法 2:在
/etc/profile中全局设置
将以下行添加到 /etc/profile
/etc/profile
export XAUTHORITY=/home/username/.Xauthority
这将永久允许 root 连接到非 root 用户的 X 服务器。
或者,仅指定某个特定应用程序
# XAUTHORITY=/home/username/.Xauthority appname
其中 appname 是该特定应用程序的名称(例如 kwrite)。
Wayland
尝试在 Wayland 会话中通过 su、sudo 或 pkexec 以 root 用户身份运行图形应用程序(例如 GParted 或 Gedit)将失败,并出现类似以下错误的提示:
# gedit
No protocol specified Unable to init server: Could not connect: Connection refused (gedit:2349): Gtk-WARNING **: cannot open display: :0
Wayland 应用程序
本节仅适用于并非在 XWayland 下运行的原生 Wayland 应用程序。
使用 sudo -E
您可以使用以下命令启动应用程序:
$ sudo -E program
这会保留如 WAYLAND_DISPLAY 之类的环境变量。
如果您希望 HOME 环境变量被设置为目标用户,请使用:
$ sudo -EH program
参见 sudo(8)。
使用 pkexec
您可以使用以下命令启动 GUI 应用程序:
$ pkexec env WAYLAND_DISPLAY="$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" XDG_RUNTIME_DIR=/run/user/0 program
这会保留 WAYLAND_DISPLAY 环境变量。
XWayland
在 XWayland 下,Xorg 权宜之计不再起作用,因为默认设置已改为仅允许启动 X 服务器的用户连接客户端(参见相关的 Bug 报告以及它提到的 upstream commits 和 commits)。
一种权宜之计是使用 xhost 临时允许 root 用户访问本地用户的 X 会话[4]。为此,请以当前(非特权)用户执行以下命令:
$ xhost si:localuser:root
在应用程序关闭后移除此访问权限:
$ xhost -si:localuser:root