sudo:以其他用户身份运行zoom

用户1876484

我使用 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-terminalor 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环境变量指向的自定义位置)归该用户所有,默认情况下其他任何人都无法读取。

如果您使用sudoroot,这不是问题,因为 root 通常可以读取所有内容(除非用户的主目录位于使用root_squash选项集导出的 NFS 共享上)。您可以export XAUTHORITY=/home/$SUDO_USER/.Xauthority确保DISPLAY从原始会话中保留变量。

但是,当您使用sudo -u daddy切换到另一个非 root 帐户并想要使用 GUI 程序时,您需要使用 GUI 版本的用户切换工具(例如gksuGnome 或kdesudoKDE),它可以自动处理此问题,或者提供第二个用户帐户自己访问会话密钥(或其副本)。

GUI 用户切换工具将是推荐的方式,因为它们可以适当地处理基本 GUI 会话访问之外的其他事情,例如辅助功能所需的环境变量和/或更复杂的字符输入方法,例如中文/例如日文/韩文字符输入。

一些发行版可能还有 PAM 模块或其他预配置,以使其更加自动化。

但是,如果您需要手动执行此操作,则必须执行三件事才能以未执行 GUI 登录的用户身份运行 GUI 程序:

  • 目标用户必须拥有 X 会话密钥文件的可访问副本(~/.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

然后添加daddykiddy的用户组:

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通过sudozoom退出时,Xauthority 文件的副本将随着执行脚本的 shell 退出而自动删除。

现在您可以调整kiddy使用的桌面环境/usr/local/bin/zoom_for_kiddy而不是真正的/usr/bin/zoom任何命令参数都将通过脚本传递到真正的zoom原样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章