Назад | Перейти на главную страницу

Как можно использовать динамический SSH на основе ключей, аналогичный GitHub?

Я не хочу предоставлять пользователям своего приложения функции, подобные SSH / RSYNC. Я бы хотел, чтобы они просто могли вставить / сохранить ключ SSH в мое приложение аналогично тому, как это делает GitHub:

Итак, у меня вопрос, как только я разрешаю пользователям сохранять свой ключ (желательно в базе данных):

Есть ли способ предоставить / имитировать функции SSH / RSYNC без фактического создания учетных записей пользователей Linux? Я бы хотел иметь возможность авторизоваться на основе открытого ключа, хранящегося в их базе данных, и позволить им RSYNC входить / выходить из определенной папки (например, на основе их имени пользователя в приложении).

(если это важно, это будет приложение Rails, развернутое на сервере Ubuntu)

Взгляните на command-опция для SSH-файла authorized_keys. Таким образом, вы можете принудительно вводить команду для определенных пользователей, получающих доступ к вашему компьютеру, в зависимости от их SSH-ключа.

Представьте себе пользователя с именем «git» на вашем сервере. У этого пользователя в качестве примера есть следующий файл authorized_keys:

command="/path/to/script user1",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa [public key of user1]
command="/path/to/script user2",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa [public key of user2]

Итак, когда user1 запускается ssh git@yourserver.com "/execute/command --with --parameter", /path/to/script вызывается (как пользователь git). Этот сценарий может получить доступ к исходной команде (/execute/command --with --parameter) в переменной окружения $ SSH_ORIGINAL_COMMAND (подробнее см. в документации по SSH).

Таким образом, остается только ввести правильные строки в файл authorized_keys (вы можете динамически создавать файл из ключей, хранящихся в вашей базе данных).

Оттуда вы можете написать свою собственную оболочку или делать все, что захотите, с исходной командой.

По сути, это то, как gitolite и gitosis управляют разрешениями репозитория git (я думаю, Github использует один из них).

Надеюсь, это немного поможет - с уважением!

OP конкретно говорит, что он хочет назначить ключи нескольким пользователям и что он хочет, чтобы пользователи хранились в базе данных, а не как фактические пользователи Linux. В упомянутой выше настройке стиля Github есть один пользователь git.

Чтобы ответ был полным, OP также должен использовать директиву AuthorizedKeyCommand, которая очень хорошо объясняется здесь - OpenSSH с открытыми ключами из базы данных

Итак, вы используете комбинацию обоих. Аутентификация на сервере для x количества пользователей, хранящихся в базе данных, выполняется с помощью. на основе настраиваемого сценария аутентификации (сценарий bash, из которого вы вызываете сценарий в своем веб-приложении)

Когда ваш собственный сценарий возвращает открытый ключ в OpenSSH для аутентификации (вместо файла authorized_keys), вы предоставляете его в формате, описанном в ответе Майкла Троянека. Таким образом, вы обеспечиваете авторизацию для определенных функций, к которым может получить доступ ваш динамический пользователь.