Зачем?
Допустим у вас есть сервис, который дергает определенные скрипты. Эти скрипты необходимо поддерживать в актуальном состоянии. Для этого вы используете какую-либо систему контроля версий, с доступом по ключу, однако этот ключ на сервере вы хранить не хотите. Для того, чтобы временно «принести» с собой ключ со своей машины — обычно используют ssh-agent.
Делается это следующим образом:
Сначала запускаем сам ssh-agent
Затем добавляем необходимый нам ключик
Затем входим на нужную нам машинку с этим ключиком
А теперь, допустим, что пользователь, от которого запускаются ваши скрипты не совпадает с тем пользователем, под которым вы входите на сервер. Давайте назовем их script_user и deployment_user: первый запускает скрипты и владеет файлами скрипта но по нему нельзя войти на сервер, второй — пользователь по которым вы входите на сервер, но он не владеет файлами которые нужно поддерживать, однако имеет возможность залогиниться в script_user через sudo.
При обновлении скриптов в вашей системе контроля версий — их было бы хорошо обновить и на сервере. С первого взгляда ничего нетривиального в этом нет. Заходим на сервер вместе с агентом, переходим в пользователя — владельца скриптов и пытаемся сделать git pull или svn up. Оказывается, что вы не можете этого сделать т.к. при переходе в sudo вы потеряли доступ к ключику, с которым вы пришли на сервер. И вот мы пришли к основной теме этого топика. Как пробросить ключ из ssh-агента через sudo.
Шаг 1:
Идем в файл /etc/sudoers:
и дополняем переменную
Теперь у пользователя, в которого мы входим — есть все переменные, необходимые для того, чтобы «подцепить» наш ключик, однако нет прав на сокет файл.
Шаг 2:
Дописываем в конец файла ~/.bashrc следующие строки:
Таким образом, при каждом входе в систему у нас автоматически будет даваться полный доступ на сокет для группы пользователя script_user.
Теперь можно делать sudo script_user и ваши ключи, принесенные через ssh-agent не потеряются.
Допустим у вас есть сервис, который дергает определенные скрипты. Эти скрипты необходимо поддерживать в актуальном состоянии. Для этого вы используете какую-либо систему контроля версий, с доступом по ключу, однако этот ключ на сервере вы хранить не хотите. Для того, чтобы временно «принести» с собой ключ со своей машины — обычно используют 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 не потеряются.