Я не хочу предоставлять пользователям своего приложения функции, подобные 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), вы предоставляете его в формате, описанном в ответе Майкла Троянека. Таким образом, вы обеспечиваете авторизацию для определенных функций, к которым может получить доступ ваш динамический пользователь.