Pull to refresh

Как пробросить ключ через 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 не потеряются.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.