sudo: ejecuta zoom como otro usuario
Bloqueo todo el tráfico de Internet para las cuentas de Linux de mis hijos usando iptables. A veces quiero permitirles usar un programa u otro. En tales casos, les permito ejecutar esos programas como otro usuario (ilimitado) a través de sudoers. Esta vez traté de permitirles usar el zoom, de la siguiente manera:
kiddy ALL= (daddy) NOPASSWD: /usr/bin/zoom
Sin embargo, la ejecución sudo -u daddy /usr/bin/zoomno produce salida (tampoco errores), pero el zoom no se inicia. La ejecución de zoom desde la línea de comandos inicia el cliente GUI, pero obviamente no puede conectarse (lo que se espera). ¿Qué pasa aquí?
Si trato de hacer lo mismo con en gnome-terminallugar de zoomagregar a la visudosiguiente línea: kiddy ALL= (daddy) NOPASSWD: /usr/bin/gnome-terminaly luego ejecutar: sudo -u daddy /usr/bin/gnome-terminalobtengo este error:
No protocol specified
Unable to init server: Could not connect: Connection refused
# Failed to parse arguments: Cannot open display:
Me enfrento a todo lo anterior una vez que inicié sesión en Gnome como usuario kiddy, sin embargo, si inicio sesión en Gnome como daddyy luego en la ejecución de terminal su kiddyseguido de sudo -u daddy gnome-terminalo sudo -u daddy zoom, todo funciona.
¿Debo agregar algunas variables adicionales al sudoersarchivo? En caso afirmativo, ¿cómo puedo determinar qué variables se necesitan y cuáles son sus valores?
Aquí está la salida de envun usuario típico de Debian 10 (llamado guesten este caso):
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
Respuestas
Si la sesión inicial de la GUI se ejecuta como usuario kiddy, entonces el archivo de clave de sesión (ya sea ~/.Xauthorityen una ubicación personalizada señalada por la XAUTHORITYvariable de entorno) es propiedad de ese usuario y nadie más lo puede leer de forma predeterminada.
Si está sudoingresando a root, esto no es un problema ya que root normalmente puede leer todo (a menos que, por ejemplo, el directorio de inicio del usuario esté en un recurso compartido NFS que se exporta con el root_squashconjunto de opciones). Puede simplemente export XAUTHORITY=/home/$SUDO_USER/.Xauthorityasegurarse de que la DISPLAYvariable se conserve de la sesión original.
Pero cuando use sudo -u daddypara cambiar a otra cuenta que no sea root y quiera usar programas GUI, necesitará usar versiones GUI de la herramienta de cambio de usuario (por ejemplo, gksupara Gnome o kdesudopara KDE) que pueden manejar esto automáticamente, o dar el segundo acceso de cuenta de usuario a la clave de sesión (o una copia de la misma) usted mismo.
Las herramientas de cambio de usuario de la GUI serían la forma recomendada, ya que pueden manejar adecuadamente cosas adicionales más allá del acceso básico a la sesión de la GUI, como las variables de entorno requeridas para las funciones de accesibilidad y / o métodos de entrada de caracteres más elaborados, como los requeridos para chino / Entrada de caracteres japoneses / coreanos, por ejemplo.
Algunas distribuciones también pueden tener módulos PAM u otra configuración previa para que esto sea más automático.
Pero si necesita hacerlo manualmente, hay tres cosas que debe hacer para tener la capacidad básica de ejecutar programas de GUI como un usuario que no realizó el inicio de sesión de GUI:
- el usuario de destino debe tener una copia accesible del archivo de clave de sesión X (
~/.Xauthorityo al que apunta laXAUTHORITYvariable en la sesión original). Si la seguridad es un problema, este archivo debe ser accesible solo por el usuario original y el de destino. - el usuario de destino probablemente necesitará tener una
XAUTHORITYvariable que apunte a la copia accesible del archivo de clave de sesión X (a menos que la copia se coloque en~/.Xauthorityel usuario de destino) - el usuario de destino debe tener el mismo
DISPLAYvalor de variable que la sesión original
Al parecer gksuse ha eliminado . Para permitir sudoconservar las variables de entorno necesarias, puede escribir un /etc/sudoers.d/zoomforkiddyarchivo con el siguiente contenido (se recomienda usarlo visudo -f /etc/sudoers.d/zoomforkiddypara crearlo / editarlo):
Defaults:kiddy env_keep += "DISPLAY XAUTHORITY"
kiddy ALL = (daddy) NOPASSWD: /usr/bin/zoom
Esto permite el paso de las variables de entorno necesarias sudoy otorga kiddyacceso sin contraseña /usr/bin/zoomsolo a.
Luego agregue daddyal kiddygrupo de usuarios:
sudo usermod -a -G kiddy daddy
Esto permitirá daddyacceder a kiddylos archivos si tienen configurados permisos de acceso de grupo. Así que ahora kiddypodrá copiar su archivo Xauthority a alguna ubicación a la que pueda acceder daddyy establecer permisos para que (solo) daddypueda acceder a él.
Ahora cree un script, por ejemplo, /usr/local/bin/zoom_for_kiddyy configúrelo como ejecutable ( 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
Este script hará una copia del kiddyarchivo 's para Xauthority daddy, establecer los permisos, establecer la variable de entorno XAUTHORITY a un valor que es utilizable para daddy, a continuación, iniciar /usr/bin/zooma través sudo. Cuando zoomsale, la copia del archivo Xauthority se eliminará automáticamente cuando salga el shell que ejecuta el script.
Ahora puede ajustar kiddyel entorno de escritorio para usarlo en /usr/local/bin/zoom_for_kiddylugar del real /usr/bin/zoom. Cualquier argumento de comando se pasará a través del script al real zoomtal cual.
Posiblemente no sepa qué pantalla usar. Cuando lo inicia con sudo, está creando un nuevo shell. Si ese shell no está al tanto de la pantalla, no podrá abrir una ventana.
Para probar esto, intente sudo an xterm (/ usr / bin / xterm) de la misma manera. ¿Se abre? Si no, es posible que estemos en algo aquí.
Puede ser tan simple como agregar VAR = DISPLAY a la línea sudo. Consulte la página de manual de sudo para obtener detalles específicos.