以 root 身份运行 GUI 应用程序
- [...] 没有 *真正*、确凿的、技术上的理由说明任何人应该以 root 身份运行 GUI 应用程序。通过以管理员用户身份运行 GUI 应用程序,您实际上是在运行数百万行未经适当审计以在提升的权限下运行的代码;您还在运行会触及您 $HOME 中文件的代码,并可能更改它们在文件系统上的所有权;通过 IPC 连接到更多正在运行的代码等等。
- 您正在打开一个巨大的、骇人的安全漏洞 [...].
如果可能,请避免以 root 身份运行图形应用程序,请参阅 #规避以 root 身份运行图形应用程序。
规避以 root 身份运行图形应用程序
sudoedit
要以 root 身份编辑文件,请使用 sudoedit。
GVFS
通过在 URI 方案中指定 admin
后端,可以通过 GVFS 访问特权文件和目录[1][2],例如:
$ nautilus admin:///root/
或
$ gedit admin:///etc/fstab
Ctrl+l
,然后将 admin://
方案添加到资源路径。同样的效果可以通过 其他位置 服务器地址栏实现。Xorg
默认情况下,出于安全原因,root 用户将无法连接到非 root 用户的 X 服务器。但是,如有必要,有多种方法允许 root 用户这样做。
在 X 下以提升的权限运行 GUI 应用程序的正确、推荐的方法是创建 Polkit 策略,如 此论坛帖子 中所示。然而,正如 pkexec(1) 提醒的那样,这“仅应用于遗留程序”。应用程序应该“将特权操作推迟到一个可审计的、自包含的、最小的代码片段,该代码片段在执行权限提升后执行,并在不需要时被丢弃”[3]。这可能是向上游项目提交错误报告的对象。
临时方法
这些方法将应用程序包装在权限提升框架中,并在应用程序退出后丢弃获得的权限
$ 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 会话(例如 GParted 或 Gedit)中通过 su、sudo 或 pkexec 以 root 身份运行图形应用程序将失败,并出现类似于此的错误
# gedit
No protocol specified Unable to init server: Could not connect: Connection refused (gedit:2349): Gtk-WARNING **: cannot open display: :0
在 Wayland 之前,通过创建 Polkit 策略可以正确实现以提升的权限运行 GUI 应用程序,或者更危险地通过在终端中运行命令并在命令前加上 sudo
来完成;但在 (X)Wayland 下,这不再起作用,因为默认设置已更改为仅允许启动 X 服务器的用户连接客户端到它(参见 错误报告 和 the 上游 提交 它指的是)。
如果可能,请避免以 root 身份运行图形应用程序,请参阅 #规避以 root 身份运行图形应用程序。
一种更通用的但更不安全的方法允许以 root 身份运行任何图形应用程序 #使用 xhost。
使用 xhost
一种更通用的——虽然安全性差得多——的解决方法是使用 xhost 临时允许 root 用户访问本地用户的 X 会话[4]。为此,以当前(非特权)用户身份执行以下命令
$ xhost si:localuser:root
要在应用程序关闭后删除此访问权限
$ xhost -si:localuser:root
使用 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。