Como você pode fazer um SSH dinâmico, baseado em chave, semelhante ao GitHub?

1

Eu não quero fornecer recursos do SSH / RSYNC aos usuários do meu aplicativo. Eu gostaria que eles pudessem apenas colar / salvar uma chave SSH no meu aplicativo semelhante a como o GitHub faz a>:

Então, minha pergunta é, depois que eu deixo os usuários salvarem suas chaves (de preferência no banco de dados):

Existe uma maneira de fornecer / imitar recursos SSH / RSYNC sem realmente criar contas de usuário do Linux? Eu adoraria poder autorizar com base em sua chave pública armazenada no banco de dados e deixá-los RSYNC in / out de uma pasta específica (digamos, com base em seu nome de usuário no aplicativo, por exemplo).

(se for importante, será um aplicativo Rails implantado em um servidor Ubuntu)

    
por Callmeed 26.06.2013 / 20:09

2 respostas

2

Dê uma olhada na command -option para o arquivo authorized_keys-do SSH. Dessa forma, você pode forçar um comando em usuários específicos que acessam sua máquina, dependendo de sua chave SSH.

Imagine um usuário chamado "git" no seu servidor. Este usuário tem o seguinte arquivo authorized_keys como exemplo:

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]

Portanto, quando user1 executa ssh [email protected] "/execute/command --with --parameter" , /path/to/script é chamado (como usuário git). Este script pode acessar o comando original ( /execute/command --with --parameter ) na variável de ambiente $ SSH_ORIGINAL_COMMAND (mergulhe na documentação do SSH para mais detalhes).

Desta forma, é apenas uma questão de obter as linhas corretas no arquivo authorized_keys (você pode construir dinamicamente o arquivo a partir das chaves armazenadas em seu banco de dados).

De lá, você pode escrever seu próprio shell ou fazer o que quiser com o comando original.

Isso é basicamente como o gitolite e a gitosis gerenciam permissões de repositório git (o Github usa um desses eu acho).

Espero que isso ajude um pouco - Atenciosamente!

    
por 29.04.2014 / 09:28
1

O OP diz especificamente que deseja atribuir chaves a vários usuários e que deseja que os usuários sejam armazenados em um banco de dados, não como usuários reais do Linux. Na configuração do estilo do Github mencionada acima, há um único usuário git.

Para que a resposta seja completa, o OP também precisaria usar a diretiva AuthorizedKeyCommand, que é explicada muito bem aqui - OpenSSH com chaves públicas do banco de dados

Então, você usa uma combinação de ambos. A autenticação no servidor para um número x de usuários, armazenados em um banco de dados, é feita por. com base em um script de autenticação personalizado (um script bash do qual você chama algum script em seu aplicativo da Web)

Quando seu script personalizado está retornando uma chave pública para o OpenSSH para autenticação (no lugar de um arquivo authorized_keys), você o fornece no formato descrito na resposta de Michael Trojanek. Dessa forma, você fornece autorização sobre funcionalidades específicas que seu usuário dinâmico pode acessar.

    
por 26.01.2017 / 23:18