Как стать автором
Обновить

Как пробросить ключ через ssh агента через судо до нужного пользователя?

Зачем?
Допустим у вас есть сервис, который дергает определенные скрипты. Эти скрипты необходимо поддерживать в актуальном состоянии. Для этого вы используете какую-либо систему контроля версий, с доступом по ключу, однако этот ключ на сервере вы хранить не хотите. Для того, чтобы временно «принести» с собой ключ со своей машины — обычно используют ssh-agent.
Делается это следующим образом:

Сначала запускаем сам ssh-agent
eval `ssh-agent`

Затем добавляем необходимый нам ключик
ssh-add /path/to/key

Затем входим на нужную нам машинку с этим ключиком
ssh -A username@hostname.any

А теперь, допустим, что пользователь, от которого запускаются ваши скрипты не совпадает с тем пользователем, под которым вы входите на сервер. Давайте назовем их script_user и deployment_user: первый запускает скрипты и владеет файлами скрипта но по нему нельзя войти на сервер, второй — пользователь по которым вы входите на сервер, но он не владеет файлами которые нужно поддерживать, однако имеет возможность залогиниться в script_user через sudo.
При обновлении скриптов в вашей системе контроля версий — их было бы хорошо обновить и на сервере. С первого взгляда ничего нетривиального в этом нет. Заходим на сервер вместе с агентом, переходим в пользователя — владельца скриптов и пытаемся сделать git pull или svn up. Оказывается, что вы не можете этого сделать т.к. при переходе в sudo вы потеряли доступ к ключику, с которым вы пришли на сервер. И вот мы пришли к основной теме этого топика. Как пробросить ключ из ssh-агента через sudo.

Шаг 1:

Идем в файл /etc/sudoers:
sudo visudo

и дополняем переменную
Defaults   env_keep += "SSH_AUTH_SOCK SSH_AGENT SSH_CLIENT SSH_TTY SSH_CONNECTION"

Теперь у пользователя, в которого мы входим — есть все переменные, необходимые для того, чтобы «подцепить» наш ключик, однако нет прав на сокет файл.

Шаг 2:

Дописываем в конец файла ~/.bashrc следующие строки:
sudo chown `whoami`:script_user -R "`dirname $SSH_AUTH_SOCK`"
sudo chmod 770 -R "`dirname $SSH_AUTH_SOCK`"

Таким образом, при каждом входе в систему у нас автоматически будет даваться полный доступ на сокет для группы пользователя script_user.
Теперь можно делать sudo script_user и ваши ключи, принесенные через ssh-agent не потеряются.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.