переадресація ssh-агента та sudo іншому користувачеві


153

Якщо у мене є сервер A, на який я можу ввійти за допомогою свого ключа ssh і маю можливість "sudo su - otheruser", я втрачаю переадресацію ключів, оскільки змінні env видаляються, а сокет читається тільки моїм оригінальним користувачем. Чи є спосіб перемотати переадресацію ключа через "sudo su - otheruser", щоб я міг робити речі на сервері B за допомогою мого перенаправленого ключа (git clone та rsync у моєму випадку)?

Єдиний спосіб, що я можу придумати, - це додати свій ключ до дозволених ключів otheruser та "ssh otheruser @ localhost", але це громіздко робити для кожної комбінації користувачів та серверів.

Коротко:

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

Відповіді:


182

Як ви вже згадували, змінні оточення видаляються з sudoміркувань безпеки.

Але, на щастя, sudoце цілком настроюється: ви можете точно вказати, які змінні середовища потрібно зберегти завдяки env_keepопції конфігурації /etc/sudoers.

Для переадресації агента потрібно тримати SSH_AUTH_SOCKзмінну середовища. Для цього просто відредагуйте /etc/sudoersфайл конфігурації (завжди використовуючи visudo) та встановіть env_keepпараметр для відповідних користувачів. Якщо ви хочете, щоб ця опція була встановлена ​​для всіх користувачів, використовуйте такий Defaultsрядок:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers для отримання детальної інформації.

Тепер ви повинні бути в змозі зробити що - щось на зразок цього ( при умови user1«s відкритого ключа присутній ~/.ssh/authorized_keysв user1@serverAі user2@serverB, і serverA" s /etc/sudoersфайл установка , як зазначено вище):

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

1
Це правильна відповідь, має бути позначена.
Xealot

41
Це працює лише , якщо user2вище root! В іншому випадку user2буде встановлено SSH_AUTH_SOCK правильно, але до нього user2не вдасться отримати доступ, наприклад / tmp / ssh-GjglIJ9337 /. rootмає такий доступ. Таким чином, це може вирішити частину проблеми, але не ОЗ: " і сокет читається тільки моїм оригінальним користувачем"
Peter V. Mørch

6
Defaults>root env_keep+=SSH_AUTH_SOCKПереконайтеся, що це лише вперед під час набору на root. Ви не хочете цього робити іншим користувачам з міркувань безпеки. Краще запустити окремий ssh-агент для іншого та додати відповідні клавіші.
Пол Шиска

1
sudo su -не працює для мене, імовірно, він не може зберегти навколишнє середовище, оскільки це не sudoпід час запуску оболонки. sudo suздається, працює.
Алекс Фортуна

3
Я ніколи не розумів, чому люди так sudo suчи інакше користуються . Якщо вам потрібна коренева оболонка, це те, що sudo -sі sudo -iдля.
ей

68
sudo -E -s
  • -Е збереже довкілля
  • -s виконує команду, за замовчуванням оболонку

Це дасть вам кореневу оболонку з ще завантаженими оригінальними ключами.


2
Як і у коментарі вище, це стосується лише питання, якщо ви стаєте root, оскільки в цьому випадку root може обійти звичайні дозволи доступу на $ SSH_AUTH_SOCK.
doshea

35

Дозвольте другому користувачеві отримати доступ до $SSH_AUTH_SOCKфайлу та його каталогу, наприклад правильним ACL, перш ніж переходити до них. У прикладі передбачається , Defaults:user env_keep += SSH_AUTH_SOCKв /etc/sudoersна хост - машині:

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

Більш безпечний і працює і для некоріальних користувачів ;-)


6
Пам'ятайте, що при використанні цього методу інші люди, які ввійшли в систему, також otheruserможуть використовувати вашу аутентифікацію ssh.
gitaarik

Це працює для мене, за винятком того, що мені довелося змінити "sudo su - otheruser" на "sudo su otheruser" (видалення -).
Чарльз Фінкель

1
Чому rwxі ні rw(або rвзагалі)?
anatoly techtonik

3
@anatolytechtonik Від man 7 unix- для підключення Linux до сокета Linux вимагає дозволу на читання та запис у цьому сокеті. Також вам потрібен пошук (виконання) та запис дозволу в каталог, де ви створюєте сокет, або лише дозвіл на пошук (виконання) під час підключення до цього сокета. Отже, у наведеній вище відповіді дозвіл на виконання на сокет є зайвим.
міксель

замість того, щоб редагувати / etc / sudoers ви можете використовуватиsudo -u otheruser --preserve-env=HOME -s
Секція

14

Я виявив, що це також працює.

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

Як зазначали інші, це не спрацює, якщо користувач, на якого ви переходите, не має дозволу на читання в $ SSH_AUTH_SOCK (що майже будь-який користувач, крім root). Ви можете обійти це, встановивши $ SSH_AUTH_SOCK та каталог, у якому він знаходиться, щоб мати дозволи 777.

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

Це досить ризиковано, хоча. Ви в основному даєте кожному іншому користувачеві системи дозвіл на використання вашого агента SSH (поки ви не вийдете). Ви також можете встановити групу та змінити дозволи на 770, що може бути більш безпечним. Однак, коли я спробував змінити групу, я отримав "Операція заборонена".


6
Це надзвичайно ризиковано. Надання кожному іншому користувачеві дозволу на використання вашого агента SSH рівнозначне наданню їм усіх ваших даних (і якщо ви коли-небудь користуєтеся sudo або su, надаючи їм кореневу владу над усіма іншими користувачами в системі, а також над усіма іншими системами, на які ви схибите!) . Це НІКОЛИ НЕ БУДЕ робити!
Матія Наліс

4
Я не погоджуюся з твердженням, що "ЦІ НІКОЛИ НІКОЛИ не робити!" Є багато випадків, коли цей ризик є прийнятним. Наприклад, невелика команда, де всі мають однакові дозволи та ви довіряєте всім іншим користувачам. Це ніколи не слід робити, не розуміючи ризиків, які він пов’язаний. Але як тільки ці ризики зрозуміли, є ризики прийнятні.
філаї

6

Якщо ви маєте право на це sudo su - $USER, ви, мабуть, матимете хороший аргумент щодо того, що вам дозволяється робити ssh -AY $USER@localhostзамість цього ваш дійсний відкритий ключ у домашній директорії $ USER. Тоді ваше переадресація аутентифікації здійснюватиметься з вами.


Він зазначив, що внизу свого питання, і сказав, що це буде важко зробити.
Фахад Сада

Це, мабуть, найкраще рішення, але воно стає волохатим, якщо $ USER є справжньою особою (тм) - вони можуть видалити ключ SA з дозволених_колій або змінити свій пароль ...
voretaq7

Ви можете видалити доступ до запису до санкціонованих_кейсів (хоча якщо вони дійсно налаштовані на заборону доступу до Флоріана, вони можуть видалити та відтворити його, перебуваючи у власному каталозі)
Fahad Sadah

4

Ви завжди можете просто ssh до localhost за допомогою переадресації агента замість використання sudo:

ssh -A otheruser@localhost

Недоліком є ​​те, що вам потрібно знову увійти в систему, але якщо ви використовуєте його на вкладці екран / tmux, це лише один раз зусилля, однак, якщо ви від'єднаєтесь від сервера, сокет (звичайно) буде зламаний знову . Тому це не ідеально, якщо ви не можете постійно тримати відкритий сеанс екрана / tmux (однак, ви можете вручну оновити SSH_AUTH_SOCKenv var, якщо ви круті).

Також зауважте, що при використанні переадресації ssh, root завжди може отримати доступ до вашого сокету та використовувати вашу аутентифікацію ssh (до тих пір, поки ви ввійшли в систему за допомогою переадресації ssh). Тому переконайтеся, що ви можете довіряти root.


Це не спрацьовує, якщо у вас є лише доступ otheruserчерез через sudoзамість SSH (наприклад, ви хочете, щоб SCP речі як www-data)
Герт ван ден Берг,

3

Не використовуйте sudo su - USER, а скоріше sudo -i -u USER. Для мене працює!


Яку версію судо ви маєте? У шахти (1.6.7p5, CentOS 4.8) немає -i на своїй довідковій сторінці.
Девід Макінтош

Sudo version 1.6.9p17працює на Дебіана Ленні. Спробуйте sudo -s?
Фахад Сада

6
Не працює для мене.

У Ubuntu, використовуючи Sudo 1.8.9p5, ні для мене , sudo -sні sudo -iробота ...
Джон Л.,

2

Поєднуючи інформацію з інших відповідей, я придумав це:

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

Мені це подобається, тому що мені не потрібно редагувати sudoersфайл.

Тестовано на Ubuntu 14.04 (довелося встановити aclпакет).


1

Я думаю, що у вашій команді є проблема з параметром -(тире) su:

sudo su - otheruser

Якщо ви прочитаєте сторінку man від su , ви можете виявити, що параметр -, -l, --loginзапускає середовище оболонки як оболонку для входу. Це створить середовище otheruserнезалежно від змінних env, де ви працюєте su.

Простіше кажучи, тире підірве все, від чого ти перейшов sudo.

Натомість слід спробувати цю команду:

sudo -E su otheruser

Як зазначав @ joao-costa, -Eзбереже всі змінні в середовищі, де ви бігли sudo. Тоді без тире suбуде використовувати це середовище безпосередньо.


0

На жаль, коли ви подаєте інший користувач (або навіть користуєтеся судо), ви втратите можливість користуватися переадресованими клавішами. Це функція безпеки: Ви не хочете, щоб випадкові користувачі підключалися до вашого ssh-агента та використовували ваші ключі :)

Метод "ssh -Ay $ {USER} @localhost" трохи громіздкий (і як зазначалося в моєму коментарі до відповіді Девіда, схильного до поломки), але це, мабуть, найкраще, що ви можете зробити.


1
Хм, але якщо я це роблю з ssh, то мій агент все одно доступний цьому користувачеві, чи я помиляюся?

Якщо ви SSH націлите на цільового користувача з переадресацією агента, ваші запити агента підскакують ланцюгом туди, де знаходиться "справжній" агент. Якщо ви не користуєтесь оригінальним користувачем, ваш SSH-агент не буде (або не повинен) бути доступним - Каталог, в якому він перебуває, перебуває в режимі 700 і належить оригінальному користувачеві. (Очевидний Caveat: Якщо ви переходите на root та скидаєте середовище SSH_AUTH_SOCK, це може працювати, але я б на нього не покладався)
voretaq7

1
На моєму сервері (Ubuntu 12.04, ssh версія OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 березня 2012), ssh має -aі -Aаргументи. -aробить прямо протилежне тому, що призначено, він відключає переадресацію агента! Отже, в останній (і, можливо, всій) версії Ubuntu використовуйте -Aдля включення переадресації агента.
knite

@knite Ви праві - це моя (3-річна!) помилка в моїй відповіді. Виправлено зараз :-)
voretaq7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.