Vraag ssh-agent doorsturen en sudo naar een andere gebruiker


Als ik een server A heb waarin ik kan inloggen met mijn ssh-sleutel en ik de mogelijkheid heb om sudo su - otheruser te gebruiken, verlies ik sleutel doorsturen, omdat de env-variabelen zijn verwijderd en de socket is alleen leesbaar door mijn oorspronkelijke gebruiker. Is er een manier waarop ik de sleuteloverdracht kan overbruggen via de "sudo su - otheruser", zodat ik dingen op een server B kan doen met mijn doorgestuurde sleutel (git clone en rsync in mijn geval)?

De enige manier die ik kan bedenken is het toevoegen van mijn sleutel aan authorized_keys van otheruser en "ssh otheruser @ localhost", maar dat is omslachtig om te doen voor elke gebruikers- en servercombinatie die ik misschien heb.

Kortom:

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

144
2018-01-28 13:52


oorsprong




antwoorden:


Zoals je al zei, worden de omgevingsvariabelen verwijderd door sudo, om veiligheidsredenen.

Maar gelukkig sudo is vrij configureerbaar: je kunt precies aangeven welke omgevingsvariabelen je wilt behouden dankzij de env_keep configuratieoptie in /etc/sudoers.

Voor agent doorsturen, moet u de SSH_AUTH_SOCK omgevingsvariabele. Om dit te doen, bewerkt u uw /etc/sudoers configuratiebestand (altijd gebruiken visudo) en stel de env_keep optie voor de juiste gebruikers. Als u wilt dat deze optie voor alle gebruikers wordt ingesteld, gebruikt u de Defaults regel als volgt:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers voor meer details.

Je zou nu in staat moeten zijn om zoiets te doen (mits user1De publieke sleutel is aanwezig in ~/.ssh/authorized_keys in user1@serverA en user2@serverB, en serverA's /etc/sudoers bestand is ingesteld zoals hierboven aangegeven):

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



Dit is het juiste antwoord, moet worden gemarkeerd. - Xealot
Deze enkel en alleen werkt, als user2 hierboven is root! Anders, user2 zal SSH_AUTH_SOCK correct ingesteld hebben, maar de user2 kan geen toegang krijgen tot b.v. / Tmp / ssh-GjglIJ9337 /. root heeft die toegang. Dus dit kan een deel van het probleem oplossen, maar niet de OP's: "en de socket is alleen leesbaar door mijn originele gebruiker " - Peter V. Mørch
Defaults>root env_keep+=SSH_AUTH_SOCK Moet ervoor zorgen dat het alleen maar doorgeeft als het wordt gesjoemeld naar wortel. U wilt dat om veiligheidsredenen sowieso niet doen aan andere gebruikers. Beter een aparte ssh-agent uitvoeren voor otherother, en de juiste sleutels toevoegen. - Paul Schyska
sudo su - werkt niet voor mij, vermoedelijk kan het de omgeving niet behouden omdat het dat niet is sudo bij shell opstarttijd. sudo su lijkt te werken. - Alex Fortuna
Ik heb nooit begrepen waarom mensen het gebruiken sudo su hoe dan ook. Als je een root-shell nodig hebt, dat is wat sudo -s of sudo -i is voor. - eaj


sudo -E -s
  • -E zal het milieu behouden
  • -s voert een commando uit, standaard naar een shell

Dit geeft je een root-shell met de originele sleutels nog steeds geladen.


54
2018-01-01 15:31



Net als bij de bovenstaande opmerking, wordt hiermee alleen de vraag behandeld of u root wordt, omdat in dat geval root de gebruikelijke toegangsmachtigingen op $ SSH_AUTH_SOCK kan omzeilen. - doshea


Toestaan otheruser om toegang te krijgen $SSH_AUTH_SOCK bestand en de map, bijvoorbeeld door de juiste ACL, voordat u er naar overschakelt. Het voorbeeld gaat ervan uit Defaults:user env_keep += SSH_AUTH_SOCK in /etc/sudoers op hostcomputer:

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

Veiliger en werkt ook voor niet-rootgebruikers ;-)


33
2017-11-15 10:58



Onthoud dat bij het gebruik van deze methode andere mensen zijn aangemeld als de otheruser kan ook je ssh-authenticatie gebruiken. - gitaarik
Dit werkt voor mij, behalve dat ik "sudo su - otheruser" moest veranderen in "sudo su otheruser" (de - verwijderen). - Charles Finkel
Waarom rwx en niet rw (of r helemaal)? - anatoly techtonik
@anatolytechtonik From man 7 unix - voor Linux verbinding met socket vereist lees- en schrijfrechten op die socket. Ook moet je zoeken (uitvoeren) en schrijfrechten op de map waar je socket of alleen toestemming voor zoeken (uitvoeren) kunt maken wanneer je verbinding maakt met deze socket. Dus in het bovenstaande antwoord is de toestemming voor socket uitvoeren overbodig. - mixel


Ik heb ontdekt dat dit ook werkt.

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

Zoals anderen hebben opgemerkt, zal dit niet werken als de gebruiker waarnaar u overschakelt geen leesrechten heeft voor $ SSH_AUTH_SOCK (wat vrijwel elke gebruiker is behalve root). Je kunt dit omzeilen door $ SSH_AUTH_SOCK in te stellen en de map waarin het zich bevindt om de rechten 777 te hebben.

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

Dit is echter behoorlijk riskant. U geeft in principe elke andere gebruiker op het systeem toestemming om uw SSH Agent te gebruiken (totdat u uitlogt). U kunt ook de groep instellen en de machtigingen wijzigen naar 770, wat veiliger zou kunnen zijn. Toen ik echter probeerde de groep te veranderen, kreeg ik "Operation niet toegestaan".


16
2018-03-21 00:01



Dit is extreem riskant. Elke andere gebruiker toestemming geven om je SSH-agent te gebruiken, staat gelijk aan het geven van al je inloggegevens (en als je ooit sudo of su gebruikt, en hen root-power geeft over alle andere gebruikers op systeem, evenals alle andere systemen waar je naartoe gaat!) . Dit mag NOOIT OOIT gedaan worden! - Matija Nalis
Ik ben het niet eens met de stelling dat "Dit mag NOOIT OOIT gedaan worden!" Er zijn veel gevallen waarin dit risico aanvaardbaar is. Bijvoorbeeld een klein team waar iedereen dezelfde rechten heeft en u alle andere gebruikers vertrouwt. Het mag nooit worden gedaan zonder inzicht in de risico's die het met zich meebrengt. Maar zodra die risico's worden begrepen, zijn er momenten dat het risico aanvaardbaar is. - phylae


Als u gemachtigd bent om sudo su - $USER, dan zou je waarschijnlijk een goed argument hebben om toegelaten te worden om een ​​a te doen ssh -AY $USER@localhost in plaats daarvan, met uw geldige openbare sleutel in de thuismap van $ USER. Dan zou uw authenticatie-forwarding met u worden uitgevoerd.


6
2018-01-28 14:08



Hij zei dat onderaan zijn vraag, en zei dat het moeilijk zou zijn om te doen. - Fahad Sadah
Dit is waarschijnlijk de beste oplossing, maar het wordt behaard als $ USER een echte persoon is (tm) - ze kunnen de sleutel van de SA verwijderen van authorized_keys of hun wachtwoord wijzigen ... - voretaq7
Je kunt hun schrijftoegang verwijderen naar authorized_keys (maar als ze echt zijn ingesteld op het weigeren van Florian-toegang, kunnen ze deze verwijderen en opnieuw maken, in een map waarvan ze de eigenaar zijn) - Fahad Sadah


Je kunt altijd ssh naar localhost sturen met agent doorsturen in plaats van sudo te gebruiken:

ssh -A otheruser@localhost

Nadeel is dat je opnieuw moet inloggen, maar als je het op een scherm / tmux-tabblad gebruikt, is dat slechts een eenmalige inspanning, maar als je de verbinding met de server verbreekt, wordt de socket (natuurlijk) opnieuw verbroken . Het is dus niet ideaal als je je scherm / tmux-sessie niet te allen tijde open kunt houden (je zou je echter wel handmatig kunnen bijwerken SSH_AUTH_SOCKenv var als je cool bent).

Merk ook op dat bij gebruik van SSH forwarding, root altijd toegang heeft tot je socket en je SSH-authenticatie kan gebruiken (zolang je ingelogd bent met SSH forwarding). Zorg er dus voor dat je root kunt vertrouwen.


4
2017-11-27 14:56





Niet gebruiken sudo su - USER, maar liever sudo -i -u USER. Werkt voor mij!


3
2018-01-28 16:51



Welke versie van sudo heb je? Mine (1.6.7p5, CentOS 4.8) heeft -i niet in zijn man-pagina. - David Mackintosh
Sudo version 1.6.9p17 draaien op Debian Lenny. Proberen sudo -s? - Fahad Sadah
Werkt niet voor mij.
Op Ubuntu, met Sudo 1.8.9p5, geen van beide sudo -s noch sudo -i werk voor mij... - Jon L.


Door informatie uit de andere antwoorden te combineren, bedacht ik dit:

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

Ik vind dit leuk omdat ik het niet hoef te bewerken sudoers het dossier.

Getest op Ubuntu 14.04 (moest installeren acl pakket).


2
2018-06-10 17:39





Helaas verlies je de mogelijkheid om je doorgestuurde sleutels te gebruiken wanneer je su naar een andere gebruiker (of zelfs sudo) gebruikt. Dit is een beveiligingsfunctie: u wilt niet dat willekeurige gebruikers verbinding maken met uw ssh-agent en uw sleutels gebruiken :)

De "ssh -Ay $ {USER} @localhost" -methode is een beetje omslachtig (en zoals opgemerkt in mijn commentaar op David's antwoord vatbaar voor breuk), maar het is waarschijnlijk het beste wat je kunt doen.


1
2018-01-28 16:52



Hmm, maar als ik dit met ssh doe, dan is mijn agent sowieso toegankelijk voor die gebruiker, of heb ik ongelijk?
Als u SSH invoert in de doelgebruiker met agentdoorschakeling, zullen uw agentverzoeken de keten stuiteren naar waar de "echte" agent zich ook bevindt. Wanneer u su of sudo weg van de originele gebruiker bent, zal uw SSH agent socket niet (of zou niet) toegankelijk moeten zijn - De directory waarin het leeft is mode 700 en is eigendom van de oorspronkelijke gebruiker. (Voor de hand liggende waarschuwing: als u overschakelt naar root en de SSH_AUTH_SOCK-omgeving reset, zou het kunnen werken, maar ik zou er niet op vertrouwen) - voretaq7
Op mijn server (Ubuntu 12.04, ssh-versie OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 maart 2012) heeft ssh -a en -A argumenten. -a doet precies het tegenovergestelde van wat is bedoeld, het schakelt het doorsturen van agents uit! Dus, gebruik onder recente (en mogelijk alle) versies van Ubuntu -A om doorsturen van agents in te schakelen. - knite
@knite Je hebt gelijk - dat is een typfout (3 jaar oud!) in mijn antwoord. Nu opgelost :-) - voretaq7


Ik denk dat er een probleem is met de - (streepje) optie na su in jouw opdracht:

sudo su - otheruser

Als je de man-pagina leest van su, misschien vindt u dat de optie -, -l, --login start de shell-omgeving als login-shell. Dit zal de omgeving voor otheruser ongeacht de env-variabelen waar u werkt su.

Simpel gezegd, het dashboard ondermijnt alles wat je hebt gepasseerd sudo.

In plaats daarvan zou je deze opdracht moeten proberen:

sudo -E su otheruser

Zoals @ joao-costa opmerkt, -E behoudt alle variabelen in de omgeving waarin u rende sudo. Dan zonder het dashboard, su zal die omgeving direct gebruiken.


0
2018-04-05 10:03