我使用 iptables 阻止我孩子的 Linux 帐户的所有 Internet 流量。有时我想让他们使用一个或另一个程序。在这种情况下,我使他们能够通过 sudoers 作为另一个(无限制)用户运行该程序。这次我尝试让他们使用zoom,如下:
kiddy ALL= (daddy) NOPASSWD: /usr/bin/zoom
然而,运行sudo -u daddy /usr/bin/zoom
不会产生任何输出(也没有错误),但不会启动缩放。从命令行运行zoom会启动GUI客户端,但是显然无法连接(这是预期的)。这里有什么问题?
如果我尝试使用gnome-terminal
而不是zoom
添加到visudo
以下行来执行相同的操作:kiddy ALL= (daddy) NOPASSWD: /usr/bin/gnome-terminal
然后运行:sudo -u daddy /usr/bin/gnome-terminal
我收到此错误:
No protocol specified
Unable to init server: Could not connect: Connection refused
# Failed to parse arguments: Cannot open display:
一旦以用户身份登录 Gnome,我就会面临上述所有问题kiddy
,但是,如果我以用户身份登录 Gnome daddy
,然后在终端运行,su kiddy
然后是sudo -u daddy gnome-terminal
or sudo -u daddy zoom
- 一切正常。
我应该在sudoers
文件中添加一些额外的变量吗?如果是,我如何确定需要哪些变量以及它们的值是多少?
以下是env
典型 Debian 10 用户(guest
在本例中命名)的输出:
SHELL=/bin/bash
SESSION_MANAGER=local/debox:@/tmp/.ICE-unix/2055,unix/debox:/tmp/.ICE-unix/2055
QT_ACCESSIBILITY=1
COLORTERM=truecolor
XDG_MENU_PREFIX=gnome-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LANGUAGE=en_IL:en
SSH_AUTH_SOCK=/run/user/1001/keyring/ssh
DESKTOP_SESSION=gnome
GTK_MODULES=gail:atk-bridge
XDG_SEAT=seat0
PWD=/home/guest
XDG_SESSION_DESKTOP=gnome
LOGNAME=guest
XDG_SESSION_TYPE=wayland
GJS_DEBUG_TOPICS=JS ERROR;JS LOG
GDM_LANG=en_IL
HOME=/home/guest
USERNAME=guest
LANG=en_IL
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
XDG_CURRENT_DESKTOP=GNOME
VTE_VERSION=5402
WAYLAND_DISPLAY=wayland-0
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/a2088f04_0308_4c60_9882_a758f7d883b8
GJS_DEBUG_OUTPUT=stderr
XDG_SESSION_CLASS=user
TERM=xterm-256color
USER=guest
GNOME_TERMINAL_SERVICE=:1.59
DISPLAY=:0
SHLVL=1
XDG_VTNR=2
XDG_SESSION_ID=4
XDG_RUNTIME_DIR=/run/user/1001
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
GDMSESSION=gnome
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus
_=/usr/bin/env
如果初始 GUI 会话以 user 身份运行kiddy
,则会话密钥文件(位于~/.Xauthority
或位于XAUTHORITY
环境变量指向的自定义位置)归该用户所有,默认情况下其他任何人都无法读取。
如果您使用sudo
root,这不是问题,因为 root 通常可以读取所有内容(除非用户的主目录位于使用root_squash
选项集导出的 NFS 共享上)。您可以export XAUTHORITY=/home/$SUDO_USER/.Xauthority
确保DISPLAY
从原始会话中保留该变量。
但是,当您使用sudo -u daddy
切换到另一个非 root 帐户并想要使用 GUI 程序时,您需要使用 GUI 版本的用户切换工具(例如gksu
Gnome 或kdesudo
KDE),它可以自动处理此问题,或者提供第二个用户帐户自己访问会话密钥(或其副本)。
GUI 用户切换工具将是推荐的方式,因为它们可以适当地处理基本 GUI 会话访问之外的其他事情,例如辅助功能所需的环境变量和/或更复杂的字符输入方法,例如中文/例如日文/韩文字符输入。
一些发行版可能还有 PAM 模块或其他预配置,以使其更加自动化。
但是,如果您需要手动执行此操作,则必须执行三件事才能以未执行 GUI 登录的用户身份运行 GUI 程序:
~/.Xauthority
,或由XAUTHORITY
原始会话中的变量指向)。如果需要考虑安全性,则此文件应该只能由原始用户和目标用户访问。XAUTHORITY
变量指向 X 会话密钥文件的可访问副本(除非该副本位于~/.Xauthority
目标用户的位置)DISPLAY
与原始会话具有相同的变量值显然gksu
已经被删除了。为了允许sudo
保留必要的环境变量,您可以编写一个/etc/sudoers.d/zoomforkiddy
包含以下内容的文件(建议使用visudo -f /etc/sudoers.d/zoomforkiddy
创建/编辑它):
Defaults:kiddy env_keep += "DISPLAY XAUTHORITY"
kiddy ALL = (daddy) NOPASSWD: /usr/bin/zoom
这允许必要的环境变量通过sudo
,并仅授予无kiddy
密码访问权限/usr/bin/zoom
。
然后添加daddy
到kiddy
的用户组:
sudo usermod -a -G kiddy daddy
如果他们设置了组访问权限,这将允许daddy
访问kiddy
的文件。所以现在kiddy
将能够将他的 Xauthority 文件复制到某个可以访问的位置daddy
并设置权限,以便(仅)daddy
可以访问它。
现在创建一个脚本,例如/usr/local/bin/zoom_for_kiddy
,将其设置为可执行文件(chmod a+rx /usr/local/bin/zoom_for_kiddy
):
#!/bin/sh
if [ "$XAUTHORITY" = "" ]
then
XAUTHORITY="$HOME/.Xauthority"
fi
if [ -f "$XAUTHORITY" ]
then
cp "$XAUTHORITY" /tmp/zoom_for_kiddy_xauth
trap "rm -f /tmp/zoom_for_kiddy_xauth" EXIT
chmod 640 /tmp/zoom_for_kiddy_xauth
export XAUTHORITY=/tmp/zoom_for_kiddy_xauth
sudo -u daddy /usr/bin/zoom "$@"
else
echo "ERROR: cannot find the Xauthority file" >&2
fi
该脚本将副本kiddy
的XAUTHORITY文件daddy
,设置权限,在XAUTHORITY环境变量设置为这对可用的值daddy
,然后开始/usr/bin/zoom
通过sudo
。当zoom
退出时,Xauthority 文件的副本将随着执行脚本的 shell 退出而自动删除。
现在您可以调整kiddy
使用的桌面环境/usr/local/bin/zoom_for_kiddy
而不是真正的/usr/bin/zoom
。任何命令参数都将通过脚本传递到真正的zoom
原样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句