sudo: starte zoom als anderer benutzer
Ich blockiere den gesamten Internetverkehr für die Linux-Konten meiner Kinder mithilfe von iptables. Manchmal möchte ich ihnen erlauben, das eine oder andere Programm zu verwenden. In solchen Fällen erlaube ich ihnen, diese Programme als einen anderen (unbegrenzten) Benutzer über Sudoer auszuführen. Dieses Mal habe ich versucht, ihnen die Verwendung des Zooms wie folgt zu ermöglichen:
kiddy ALL= (daddy) NOPASSWD: /usr/bin/zoom
Das Ausführen sudo -u daddy /usr/bin/zoomerzeugt jedoch keine Ausgabe (auch keine Fehler), aber der Zoom startet nicht. Durch Ausführen von Zoom über die Befehlszeile wird der GUI-Client gestartet, es kann jedoch offensichtlich keine Verbindung hergestellt werden (was erwartet wird). Was ist hier los?
Wenn ich versuche, dasselbe zu tun, gnome-terminalanstatt zoomin die visudofolgende Zeile einzufügen: kiddy ALL= (daddy) NOPASSWD: /usr/bin/gnome-terminalund dann auszuführen: sudo -u daddy /usr/bin/gnome-terminalIch erhalte folgende Fehlermeldung:
No protocol specified
Unable to init server: Could not connect: Connection refused
# Failed to parse arguments: Cannot open display:
Ich bin mit all den oben genannten Problemen konfrontiert, sobald ich mich als Benutzer bei Gnome angemeldet habe. kiddyWenn ich mich jedoch bei Gnome anmelde daddyund dann im Terminal ausgeführt werde, su kiddygefolgt von sudo -u daddy gnome-terminaloder sudo -u daddy zoom- alles funktioniert.
Sollte ich der sudoersDatei einige zusätzliche Variablen hinzufügen ? Wenn ja - wie bestimme ich, welche Variablen benötigt werden und welche Werte sie haben?
Hier ist die Ausgabe envfür einen typischen Debian 10-Benutzer ( guestin diesem Fall benannt):
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
Antworten
Wenn die erste GUI-Sitzung als Benutzer ausgeführt wird kiddy, gehört die Sitzungsschlüsseldatei (entweder an ~/.Xauthorityoder an einem benutzerdefinierten Speicherort, auf den die XAUTHORITYUmgebungsvariable verweist) diesem Benutzer und kann standardmäßig von niemand anderem gelesen werden.
Wenn Sie sudozu root gehen, ist dies kein Problem, da root normalerweise alles lesen kann (es sei denn, das Home-Verzeichnis des Benutzers befindet sich auf einer NFS-Freigabe, die mit festgelegten root_squashOptionen exportiert wird ). Sie können einfach export XAUTHORITY=/home/$SUDO_USER/.Xauthoritysicherstellen, dass die DISPLAYVariable aus der ursprünglichen Sitzung erhalten bleibt.
Wenn Sie sudo -u daddyjedoch auf ein anderes Nicht-Root-Konto wechseln und GUI-Programme verwenden möchten, müssen Sie entweder GUI-Versionen des Benutzerwechsel-Tools (z. B. gksufür Gnome oder kdesudoKDE) verwenden, die dies automatisch verarbeiten können, oder die Zugriff des zweiten Benutzerkontos auf den Sitzungsschlüssel (oder eine Kopie davon) selbst.
Die Tools zum Wechseln von GUI-Benutzern sind die empfohlene Methode, da sie zusätzliche Dinge, die über den grundlegenden Zugriff auf GUI-Sitzungen hinausgehen, wie die für die Eingabehilfen erforderlichen Umgebungsvariablen und / oder ausgefeiltere Zeicheneingabemethoden, wie sie für Chinesisch / Zum Beispiel japanische / koreanische Zeicheneingabe.
Einige Distributionen verfügen möglicherweise auch über PAM-Module oder eine andere Vorkonfiguration, um dies automatischer zu gestalten.
Wenn Sie dies jedoch manuell tun müssen, müssen Sie drei Dinge tun, um GUI-Programme als Benutzer auszuführen, der die GUI-Anmeldung nicht ausgeführt hat:
- Der Zielbenutzer muss über eine zugängliche Kopie der X-Sitzungsschlüsseldatei verfügen (
~/.Xauthorityoder auf die dieXAUTHORITYVariable in der ursprünglichen Sitzung verweist). Wenn die Sicherheit ein Problem darstellt, sollte auf diese Datei nur der ursprüngliche Benutzer und der Zielbenutzer zugreifen können. - Der Zielbenutzer muss wahrscheinlich eine
XAUTHORITYVariable haben, die auf die zugängliche Kopie der X-Sitzungsschlüsseldatei verweist (es sei denn, die Kopie befindet sich beim~/.XauthorityZielbenutzer). - Der Zielbenutzer muss denselben
DISPLAYVariablenwert wie die ursprüngliche Sitzung haben
Anscheinend gksuwurde entfernt . Um sudodie erforderlichen Umgebungsvariablen beizubehalten, können Sie eine /etc/sudoers.d/zoomforkiddyDatei mit den folgenden Inhalten schreiben (es wird empfohlen, sie visudo -f /etc/sudoers.d/zoomforkiddyzum Erstellen / Bearbeiten zu verwenden):
Defaults:kiddy env_keep += "DISPLAY XAUTHORITY"
kiddy ALL = (daddy) NOPASSWD: /usr/bin/zoom
Dies ermöglicht den Durchgang der erforderlichen Umgebungsvariablen sudound gewährt nur kiddykennwortlosen Zugriff /usr/bin/zoom.
Fügen Sie dann daddyzur kiddyBenutzergruppe hinzu:
sudo usermod -a -G kiddy daddy
Auf diese Weise können Sie daddyauf kiddydie Dateien zugreifen , für die Gruppenzugriffsberechtigungen festgelegt sind. Jetzt kiddykann er seine Xauthority-Datei an einen Speicherort kopieren, auf den zugegriffen werden kann, daddyund Berechtigungen festlegen, damit (nur) darauf zugegriffen werden daddykann.
Erstellen Sie nun ein Skript, z. B. /usr/local/bin/zoom_for_kiddyund legen Sie es ausführbar fest ( 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
Dieses Skript wird eine Kopie machen kiddy‚s Xauthority Datei für daddydie Berechtigungen festgelegt, die XAUTHORITY Umgebungsvariable auf einen Wert festgelegt, der für verwendbar ist daddy, und starten Sie /usr/bin/zoomdurch sudo. Beim zoomBeenden wird die Kopie der Xauthority-Datei automatisch gelöscht, wenn die Shell, die das Skript ausführt, beendet wird.
Jetzt können Sie die kiddyDesktop-Umgebung so anpassen , dass sie /usr/local/bin/zoom_for_kiddyanstelle der realen verwendet wird /usr/bin/zoom. Alle Befehlsargumente werden über das Skript an den tatsächlichen zoomZustand übergeben.
Möglicherweise weiß es nicht, welches Display verwendet werden soll. Wenn Sie es mit sudo starten, wird eine neue Shell erstellt. Wenn diese Shell die Anzeige nicht kennt, kann sie kein Fenster öffnen.
Um dies zu testen, versuchen Sie, ein xterm (/ usr / bin / xterm) auf die gleiche Weise zu sudo. Öffnet es sich? Wenn nicht, könnten wir hier etwas unternehmen.
Es kann so einfach sein, wie der Sudo-Zeile VAR = DISPLAY hinzuzufügen. Weitere Informationen finden Sie in der Sudo-Manpage.