Frage ssh-agent Weiterleitung und sudo an einen anderen Benutzer


Wenn ich einen Server A habe, in den ich mich mit meinem ssh-Schlüssel einloggen kann und ich habe die Fähigkeit "sudo su - otheruser", verliere ich die Schlüsselweiterleitung, weil die env-Variablen entfernt werden und Der Socket ist nur für meinen ursprünglichen Benutzer lesbar. Gibt es eine Möglichkeit, die Schlüsselweiterleitung durch den "sudo su - otheruser" zu überbrücken, so dass ich mit meinem weitergeleiteten Schlüssel (git clone und rsync in meinem Fall) Sachen auf einem Server B machen kann?

Die einzige Möglichkeit, die ich mir vorstellen kann, ist das Hinzufügen meines Schlüssels zu authorized_keys von otheruser und "ssh otheruser @ localhost", aber das ist mühsam für jede Benutzer- und Server-Kombination, die ich habe.

Zusamenfassend:

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

144
2018-01-28 13:52


Ursprung




Antworten:


Wie Sie bereits erwähnt haben, werden die Umgebungsvariablen durch entfernt sudo, aus Sicherheitsgründen.

Aber glücklicherweise sudo ist durchaus konfigurierbar: Sie können genau sagen, welche Umgebungsvariablen Sie dank der env_keep Konfigurationsmöglichkeit in /etc/sudoers.

Für die Weiterleitung von Agenten müssen Sie die SSH_AUTH_SOCK Umgebungsvariable. Um dies zu tun, bearbeiten Sie einfach Ihre /etc/sudoers Konfigurationsdatei (immer mit visudo) und setze die env_keep Option für die entsprechenden Benutzer. Wenn diese Option für alle Benutzer festgelegt werden soll, verwenden Sie die Option Defaults Linie wie folgt:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers für mehr Details.

Sie sollten nun in der Lage sein, so etwas zu tun (zur Verfügung gestellt user1Der öffentliche Schlüssel ist in vorhanden ~/.ssh/authorized_keys im user1@serverA und user2@serverB, und serverAist es /etc/sudoers Datei wird wie oben beschrieben 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

168
2018-03-03 21:24



Dies ist die richtige Antwort, sollte markiert werden. - Xealot
Diese nur funktioniert, wenn user2 oben ist root! Andernfalls, user2 wird SSH_AUTH_SOCK korrekt eingerichtet haben, aber der user2 kann nicht auf z.B. / tmp / ssh-GjglIJ9337 /. root hat diesen Zugang. Das mag 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
Defaults>root env_keep+=SSH_AUTH_SOCK Sollte dafür sorgen, dass es nur beim sudoing weiterleitet zu Wurzel. Das möchten Sie aus Sicherheitsgründen sowieso nicht mit anderen Benutzern tun. Führen Sie besser einen separaten ssh-agent für andere aus und fügen Sie die entsprechenden Schlüssel hinzu. - Paul Schyska
sudo su - funktioniert nicht für mich, vermutlich kann es die Umwelt nicht erhalten, weil es nicht ist sudo zur Startzeit der Shell. sudo su scheint zu funktionieren. - Alex Fortuna
Ich habe nie verstanden, warum Leute benutzen sudo su sowieso. Wenn Sie eine Root-Shell brauchen, ist das was sudo -s oder sudo -i ist für. - eaj


sudo -E -s
  • -E wird die Umwelt erhalten
  • -s führt einen Befehl aus, standardmäßig eine Shell

Dadurch erhalten Sie eine Root-Shell mit den ursprünglichen Schlüsseln noch geladen.


54
2018-01-01 15:31



Wie beim obigen Kommentar, wird hier nur auf die Frage eingegangen, ob Sie root werden, denn in diesem Fall kann root die üblichen Zugriffsberechtigungen für $ SSH_AUTH_SOCK umgehen. - doshea


ermöglichen anderer Benutzer zugreifen $SSH_AUTH_SOCK Datei und ihr Verzeichnis, zum Beispiel durch korrekte ACL, bevor Sie zu ihnen wechseln. Das Beispiel geht davon aus Defaults:user env_keep += SSH_AUTH_SOCK im /etc/sudoers auf dem Host-Rechner:

$ 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 ;-)


33
2017-11-15 10:58



Erinnern Sie sich, wenn Sie diese Methode verwenden, haben sich andere Personen angemeldet otheruser kann auch Ihre ssh-Authentifizierung verwenden. - gitaarik
Dies funktioniert für mich, außer dass ich "sudo su - otheruser" in "sudo su otheruser" ändern musste (Entfernen der -). - Charles Finkel
Warum rwx und nicht rw (oder r überhaupt)? - anatoly techtonik
@anatolytechtonik Von man 7 unix - Unter Linux erfordert das Herstellen einer Verbindung zum Socket Lese- und Schreibberechtigungen für diesen Socket. Außerdem müssen Sie für das Verzeichnis, in dem Sie eine Socket- oder nur Suchberechtigung (execute) erstellen, eine Suchberechtigung ("Ausführen") und eine Schreibberechtigung eingeben, wenn Sie eine Verbindung mit diesem Socket herstellen. Also in der obigen Antwort ist die Ausführungsberechtigung für Socket redundant. - mixel


Ich habe festgestellt, dass dies auch funktioniert.

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

Wie andere bemerkt haben, funktioniert dies nicht, wenn der Benutzer, zu dem Sie wechseln, keine Leseberechtigungen für $ SSH_AUTH_SOCK hat (was so gut wie jeder Benutzer außer root ist). Sie können dies umgehen, indem Sie $ SSH_AUTH_SOCK und das Verzeichnis, in dem es sich befindet, auf die Berechtigungen 777 setzen.

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

Das ist jedoch ziemlich riskant. Sie geben grundsätzlich jedem anderen Benutzer auf dem System die Erlaubnis, Ihren SSH-Agenten zu verwenden (bis Sie sich abmelden). Möglicherweise können Sie die Gruppe auch festlegen und die Berechtigungen für 770 ändern, was möglicherweise sicherer ist. Als ich jedoch versuchte, die Gruppe zu wechseln, bekam ich "Operation nicht erlaubt".


16
2018-03-21 00:01



Das ist extrem riskant. Jedem anderen Benutzer die Erlaubnis zu geben, Ihren SSH-Agenten zu benutzen, ist gleichbedeutend damit, alle Ihre Zugangsdaten zu geben (und wenn Sie sudo oder su verwenden und allen anderen Benutzern des Systems sowie allen anderen Systemen, auf die Sie Zugriff haben, Root-Rechte einräumen!) . Das muss NIEMALS getan werden! - Matija Nalis
Ich stimme der Aussage nicht zu, dass "das niemals getan werden muss!" Es gibt viele Fälle, in denen dieses Risiko akzeptabel ist. Zum Beispiel ein kleines Team, in dem jeder die gleichen Berechtigungen hat und Sie allen anderen Benutzern vertrauen. Es sollte nie getan werden, ohne die damit verbundenen Risiken zu verstehen. Aber sobald diese Risiken verstanden sind, gibt es Zeiten, in denen das Risiko akzeptabel ist. - phylae


Wenn Sie dazu berechtigt sind sudo su - $USER, dann hättest du wahrscheinlich ein gutes Argument dafür, dass du es tun darfst ssh -AY $USER@localhost stattdessen mit Ihrem gültigen öffentlichen Schlüssel im Home-Verzeichnis von $ USER. Dann würde Ihre Authentifizierungsweiterleitung mit Ihnen durchgeführt werden.


6
2018-01-28 14:08



Er erwähnte dies am Ende seiner Frage und sagte, es wäre schwer zu tun. - Fahad Sadah
Dies ist wahrscheinlich die beste Lösung, aber es wird haarig, wenn $ USER eine Real Person (tm) ist - 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 jedoch wirklich darauf eingestellt sind, Florian den Zugriff zu verweigern, können sie ihn löschen und neu erstellen, da sie sich in einem Verzeichnis befinden, das ihnen gehört) - Fahad Sadah


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

ssh -A otheruser@localhost

Nachteil ist, dass Sie sich erneut anmelden müssen, aber wenn Sie es auf einem Bildschirm / tmux-Tab verwenden, ist das nur ein einmaliger Aufwand, wenn Sie jedoch die Verbindung zum Server trennen, wird der Socket (natürlich) wieder unterbrochen . Es ist also nicht ideal, wenn Sie Ihre screen / tmux-Sitzung nicht immer offen halten können (Sie könnten jedoch Ihre .mux-Sitzung manuell aktualisieren SSH_AUTH_SOCKenv var wenn du cool bist).

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


4
2017-11-27 14:56





Benutze es nicht sudo su - USERaber eher sudo -i -u USER. Funktioniert bei mir!


3
2018-01-28 16:51



Welche Version von Sudo hast du? Meine (1.6.7p5, CentOS 4.8) hat auf seiner Manpage keine -i. - David Mackintosh
Sudo version 1.6.9p17 läuft auf Debian Lenny. Versuchen sudo -s? - Fahad Sadah
Funktioniert nicht für mich.
Auf Ubuntu, unter Verwendung von Sudo 1.8.9p5, keines sudo -s Noch sudo -i arbeite für mich... - Jon L.


Ich habe die Informationen aus den anderen Antworten kombiniert:

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 nicht bearbeiten muss sudoers Datei.

Getestet auf Ubuntu 14.04 (musste installieren acl Paket).


2
2018-06-10 17:39