Weiterleitung von ssh-agent und sudo an einen anderen Benutzer

153

Wenn ich einen Server A habe, in den ich mich mit meinem SSH-Schlüssel einloggen kann und die Fähigkeit habe, "sudo su-otheruser" zu verwenden, verliere ich die Schlüsselweiterleitung, da die env-Variablen entfernt werden und der Socket nur von meinem ursprünglichen Benutzer gelesen werden kann . Gibt es eine Möglichkeit, die Schlüsselweiterleitung über den "sudo su - otheruser" zu überbrücken, damit ich mit meinem weitergeleiteten Schlüssel (in meinem Fall git clone und rsync) Dinge auf einem Server B erledigen kann?

Ich kann mir nur vorstellen, meinen Schlüssel zu authorized_keys von otheruser und "ssh otheruser @ localhost" hinzuzufügen, aber das ist umständlich für jede Benutzer- und Serverkombination, die ich habe.

Zusamenfassend:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 
kolypto
quelle

Antworten:

182

Wie Sie bereits erwähnt haben, werden die Umgebungsvariablen sudoaus Sicherheitsgründen von entfernt.

Aber zum Glück sudoist es durchaus konfigurierbar: Sie können ihm dank der env_keepKonfigurationsoption in genau mitteilen, welche Umgebungsvariablen Sie behalten möchten /etc/sudoers.

Für die Agentenweiterleitung müssen Sie die SSH_AUTH_SOCKUmgebungsvariable beibehalten. Bearbeiten Sie dazu einfach Ihre /etc/sudoersKonfigurationsdatei (immer verwenden visudo) und stellen Sie die env_keepOption auf die entsprechenden Benutzer ein. Wenn Sie möchten, dass diese Option für alle Benutzer festgelegt wird, verwenden Sie die folgende DefaultsZeile:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers für mehr Details.

Sie sollten nun in der Lage sein, so etwas zu tun (vorausgesetzt user1, der öffentliche Schlüssel ist ~/.ssh/authorized_keysin user1@serverAund vorhanden user2@serverBund serverAdie /etc/sudoersDatei ist wie oben angegeben eingerichtet):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works
MiniQuark
quelle
1
Dies ist die richtige Antwort, sollte markiert werden.
Xealot
41
Dies funktioniert nur , wenn user2oben steht root! Andernfalls user2wird SSH_AUTH_SOCK korrekt eingerichtet, aber der user2kann nicht auf zB / tmp / ssh-GjglIJ9337 / zugreifen. roothat diesen Zugang. Das kann also einen Teil des Problems lösen, aber nicht die OPs: " und der Socket ist nur für meinen ursprünglichen Benutzer lesbar"
Peter V. Mørch
6
Defaults>root env_keep+=SSH_AUTH_SOCKSollte sicherstellen, dass es nur beim Sudoing an root weitergeleitet wird. Sie möchten dies aus Sicherheitsgründen nicht für andere Benutzer tun. Führen Sie besser einen separaten ssh-agent für andere aus und fügen Sie die entsprechenden Schlüssel hinzu.
Paul Schyska
1
sudo su -funktioniert bei mir nicht, vermutlich kann die Umgebung nicht erhalten werden, da dies nicht sudozum Zeitpunkt des Shell-Starts erfolgt. sudo suscheint zu funktionieren.
Alex Fortuna
3
Ich habe nie verstanden, warum die Leute sudo susowieso verwenden. Wenn Sie eine Root-Shell benötigen, ist das, was sudo -soder sudo -iist für.
EAJ
68
sudo -E -s
  • -E schont die Umwelt
  • -s führt einen Befehl aus, standardmäßig eine Shell

Dadurch erhalten Sie eine Root-Shell, in der die Originalschlüssel noch geladen sind.

Joao Costa
quelle
2
Wie im obigen Kommentar wird hier nur die Frage beantwortet, ob Sie root werden, da root in diesem Fall die üblichen Zugriffsberechtigungen für $ SSH_AUTH_SOCK umgehen kann.
Doshea
35

Ermöglichen Sie anderen Benutzern den Zugriff auf $SSH_AUTH_SOCKDateien und deren Verzeichnis, z. B. durch korrekte Zugriffssteuerungsliste , bevor Sie zu ihnen wechseln. Das Beispiel geht davon Defaults:user env_keep += SSH_AUTH_SOCKin /etc/sudoersauf dem Host - Maschine:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

Sicherer und funktioniert auch für Nicht-Root-Benutzer ;-)

Viliam Pucik
quelle
6
Denken Sie daran, dass bei Verwendung dieser Methode auch andere als angemeldete Personen otheruserIhre ssh-Authentifizierung verwenden können.
Gitaarik
Dies funktioniert für mich, außer dass ich "sudo su - otheruser" in "sudo su otheruser" ändern musste (Entfernen des -).
Charles Finkel
1
Warum rwxund nicht rw(oder rüberhaupt nicht)?
Anatoly Techtonik
3
@anatolytechtonik Ab man 7 unix- Linux, das eine Verbindung zum Socket herstellt, benötigt Lese- und Schreibberechtigungen für diesen Socket. Außerdem benötigen Sie die Berechtigung zum Suchen (Ausführen) und Schreiben in dem Verzeichnis, in dem Sie einen Socket erstellen, oder nur die Berechtigung zum Suchen (Ausführen), wenn Sie eine Verbindung zu diesem Socket herstellen. In der obigen Antwort ist die Ausführungsberechtigung für den Socket überflüssig.
Mixel
Anstatt / etc / sudoers bearbeiten zu müssen, können Siesudo -u otheruser --preserve-env=HOME -s
Sec
14

Ich habe festgestellt, dass das auch funktioniert.

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Wie andere angemerkt haben, funktioniert dies nicht, wenn der Benutzer, zu dem Sie wechseln, keine Leseberechtigung für $ SSH_AUTH_SOCK hat (was so ziemlich jeder Benutzer außer root ist). Sie können dies umgehen, indem Sie $ SSH_AUTH_SOCK und das Verzeichnis festlegen, in dem es die Berechtigungen 777 haben soll.

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

Das ist allerdings ziemlich riskant. Grundsätzlich erteilen Sie jedem anderen Benutzer im System die Erlaubnis, Ihren SSH-Agenten zu verwenden (bis Sie sich abmelden). Möglicherweise können Sie auch die Gruppe festlegen und die Berechtigungen auf 770 ändern, was möglicherweise sicherer ist. Als ich jedoch versuchte, die Gruppe zu wechseln, wurde die Meldung "Operation nicht zulässig" angezeigt.

Phylae
quelle
6
Das ist extrem riskant. Wenn Sie jedem anderen Benutzer die Erlaubnis geben, Ihren SSH-Agenten zu verwenden, erhalten Sie alle Ihre Anmeldeinformationen (und wenn Sie jemals sudo oder su verwenden, erhalten Sie Rootberechtigung für alle anderen Benutzer auf dem System sowie für alle anderen Systeme, auf denen Sie SSH ausführen!). . Das darf NIEMALS gemacht werden!
Matija Nalis
4
Ich bin mit der Aussage nicht einverstanden, dass "das NIEMALS getan werden darf!" In vielen Fällen ist dieses Risiko akzeptabel. Zum Beispiel ein kleines Team, in dem jeder die gleichen Berechtigungen hat und Sie allen anderen Benutzern vertrauen. Dies sollte niemals ohne Verständnis der damit verbundenen Risiken geschehen. Aber sobald diese Risiken verstanden sind, gibt es Zeiten, in denen diese Risiken akzeptabel sind.
Phylae
6

Wenn Sie dazu berechtigt sind sudo su - $USER, haben Sie wahrscheinlich ein gutes Argument dafür, ssh -AY $USER@localhoststattdessen einen mit Ihrem gültigen öffentlichen Schlüssel im Home-Verzeichnis von $ USER ausführen zu dürfen. Dann wird Ihre Authentifizierungsweiterleitung mit Ihnen durchgeführt.

David Mackintosh
quelle
Er erwähnte dies am Ende seiner Frage und sagte, dass es schwierig sein würde, dies zu tun.
Fahad Sadah
Dies ist wahrscheinlich die beste Lösung, aber es wird haarig, wenn $ USER eine echte Person ist (tm) - sie könnten den SA-Schlüssel von authorized_keys löschen oder ihr Passwort ändern ...
voretaq7
Sie können ihren Schreibzugriff auf authorized_keys entfernen (wenn sie tatsächlich den Florian-Zugriff verweigern, können sie ihn löschen und neu erstellen, und zwar in einem Verzeichnis, das sie besitzen)
Fahad Sadah
4

Sie können immer nur ssh an localhost mit Agent-Weiterleitung senden, anstatt sudo zu verwenden:

ssh -A otheruser@localhost

Nachteil ist, dass Sie sich erneut anmelden müssen, aber wenn Sie es in einem Screen / TMUX-Tab verwenden, ist dies nur ein einmaliger Aufwand. Wenn Sie jedoch die Verbindung zum Server trennen, wird der Socket (natürlich) wieder unterbrochen . Daher ist es nicht ideal, wenn Sie Ihren Bildschirm / Ihre tmux-Sitzung nicht immer offen halten können (Sie können jedoch Ihre SSH_AUTH_SOCKenv var manuell aktualisieren, wenn Sie cool sind).

Beachten Sie auch, dass Root bei Verwendung der SSH-Weiterleitung immer auf Ihren Socket zugreifen und Ihre SSH-Authentifizierung verwenden kann (sofern Sie mit SSH-Weiterleitung angemeldet sind). Stellen Sie also sicher, dass Sie root vertrauen können.

gitaarik
quelle
Dies funktioniert nicht, wenn Sie nur Zugriff auf otheruservia sudoanstatt über SSH haben (z. B. möchten Sie Sachen als SCP www-data)
Gert van den Berg
3

Verwenden Sie nicht sudo su - USER, sondern sudo -i -u USER. Funktioniert bei mir!

Fahad Sadah
quelle
Welche Sudo-Version hast du? In Mine (1.6.7p5, CentOS 4.8) ist -i nicht in der Manpage enthalten.
David Mackintosh
Sudo version 1.6.9p17läuft auf Debian Lenny. Versuchen sudo -s?
Fahad Sadah
6
Funktioniert bei mir nicht.
Auf Ubuntu mit Sudo 1.8.9p5, weder für mich sudo -snoch sudo -ifür mich arbeiten ...
Jon L.
2

Kombiniere Informationen aus den anderen Antworten, die mir eingefallen sind:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

Ich mag das, weil ich keine sudoersDatei bearbeiten muss .

Getestet auf Ubuntu 14.04 (musste aclPaket installieren ).

warvariuc
quelle
1

Ich denke, es gibt ein Problem mit der -(Bindestrich) -Option nach suin Ihrem Befehl:

sudo su - otheruser

Wenn Sie die Manpage von su lesen , werden Sie möglicherweise feststellen, dass die Option -, -l, --logindie Shell-Umgebung als Login-Shell startet. Dies wird die Umgebung für otheruserunabhängig von den Umgebungsvariablen , in denen Sie ausgeführt werden su.

Einfach ausgedrückt, untergräbt der Strich alles, was Sie passiert haben sudo.

Versuchen Sie stattdessen diesen Befehl:

sudo -E su otheruser

Wie @ joao-costa hervorhob, -Ewerden alle Variablen in der Umgebung, in der Sie ausgeführt haben, beibehalten sudo. Dann ohne den Bindestrich suwird diese Umgebung direkt verwendet.

Koala Yeung
quelle
0

Wenn Sie sich an einen anderen Benutzer wenden (oder sogar sudo verwenden), verlieren Sie leider die Möglichkeit, Ihre weitergeleiteten Schlüssel zu verwenden. Dies ist eine Sicherheitsfunktion: Sie möchten nicht, dass zufällige Benutzer eine Verbindung zu Ihrem ssh-agent herstellen und Ihre Schlüssel verwenden :)

Die Methode "ssh-Ay $ {USER} @localhost" ist etwas umständlich (und wie in meinem Kommentar zu Davids Antwort erwähnt, die zu Brüchen neigt), aber wahrscheinlich die beste, die Sie tun können.

voretaq7
quelle
1
Hmm, aber wenn ich das mit ssh mache, ist mein Agent trotzdem für diesen Benutzer zugänglich, oder irre ich mich?
Wenn Sie SSH in den Zielbenutzer mit Agentenweiterleitung einbinden, werden Ihre Agentenanforderungen die Kette hochspringen lassen, wo immer sich der "echte" Agent befindet. Wenn Sie sich vom ursprünglichen Benutzer entfernen, ist Ihr SSH-Agent-Socket nicht verfügbar (oder sollte nicht verfügbar sein) - Das Verzeichnis, in dem er sich befindet, befindet sich im Modus 700 und gehört dem ursprünglichen Benutzer. (Offensichtliche Einschränkung: Wenn Sie zu root wechseln und die SSH_AUTH_SOCK-Umgebung zurücksetzen, funktioniert dies möglicherweise, aber ich würde mich nicht darauf verlassen)
voretaq7
1
Auf meinem Server (Ubuntu 12.04, SSH-Version OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1, 14. März 2012) hat SSH -aund -AArgumente. -aUm genau das Gegenteil von dem zu erreichen, was beabsichtigt ist, wird die Agentenweiterleitung deaktiviert. Verwenden Sie daher unter der neuesten (und möglicherweise allen) Version von Ubuntu, um -Adie Agentenweiterleitung zu aktivieren.
Knite
@knite Du hast recht - das ist ein (3 Jahre alter!) Tippfehler in meiner Antwort.
Behoben