Autenticação baseada em chave SSH no servidor Perl

1

Eu tenho um servidor escrito em Perl ao qual os clientes se conectam para executar algumas tarefas de gerenciamento. Sem entrar em detalhes, gostaria de conseguir duas coisas:

  1. criptografar canal de conexão entre servidor e cliente - pode ser feito com IO :: Socket :: SSL.
  2. autentica o cliente com chaves SSH - ainda não sei como fazer isso.

A melhor solução seria mesclar esses dois requisitos em um e ter um mecanismo que funcione exatamente como a conexão / autenticação do SSH. Isso é possível?

Obrigado.

    
por ahes 27.02.2012 / 13:02

4 respostas

3

Você deseja usar um túnel SSH. Isso criptografará sua comunicação e autenticará com chaves SSH.

Se você deseja que o cliente seja escrito em perl, use algo como o módulo Net :: SSH :: Perl:

Sem saber mais sobre sua configuração, realmente não posso ajudá-lo a implementar totalmente o túnel SSH.

    
por 27.02.2012 / 13:25
1

O SSH usa chaves, enquanto o SSL tende a usar certificados X.509 (e o SSH não é baseado em SSL, a propósito).

Um certificado (chave pública) é mais do que apenas uma chave pública: é a associação entre uma chave pública, um identificador (por exemplo, DN do Assunto) e outros atributos, sendo que o todo está assinado (pelo emissor para certificados X.509) .

Ao usar o RSA, por exemplo, é possível extrair o material de chave pública (módulo e expoente público) e transformá-lo em um certificado. O que falta neste modelo é que as chaves SSH são apenas isso, elas não são "assinadas" ou "emitidas" como os certificados X.509 são. Você não verá o aspecto da PKI usado com frequência no SSL em seu modelo. Uma maneira fácil de contornar isso seria criar um certificado autoassinado. Você teria que importá-lo explicitamente em seu cliente para torná-lo confiável ou importá-lo na primeira vez que se conectar a ele (que é afinal muito semelhante ao que acontece na primeira vez que você se conecta a um servidor SSH).

Os formatos de chaves RSA para SSH e X.509 são diferentes, então você precisará escrever algum código para ler o módulo e os expoentes das chaves SSH e produzir o certificado X.509 e a chave privada em um formato utilizável por Pilhas SSL.

Esta pergunta no StackOverflow deve ser de interesse (embora seja feita ao contrário)

    
por 27.02.2012 / 14:33
1

Além de simplesmente encapsular a conexão por SSH, como Chris Ting aponta :

Você poderia implementar um subsistema SSH, o que permitiria que seu programa fosse integrado perfeitamente ao SSH. Para o usuário, seria parecido com o seu programa simplesmente usa chaves SSH e criptografia (o que na verdade é por conta do uso de SSH). O processo não é tão bem documentado, embora o cliente e servidor OpenSSH SFTP sejam um pouco auto-documentados.

Isso exigiria uma boa quantidade de reescrita, dependendo de como os clientes se conectam e da sintaxe do protocolo. O benefício óbvio é que ele escorregaria perfeitamente para a configuração SSH do usuário.

    
por 27.02.2012 / 14:42
1

Eu escrevi um aplicativo servidor / cliente semelhante há algum tempo. Design básico:

  • o servidor não faz rede, é um script simples que se comunica por streams stdin / stdout (como daemons executados pelo inetd);
  • todas as coisas de rede e de autenticação são feitas por ssh / sshd, o cliente usa ssh com autorização baseada em chaves, servidor tem um arquivo authorized_keys com comando="" opção - essa chave sempre executa meu servidor e não pode ser usada para acessar shell ou outros programas;

Amostra .ssh/authorized_keys file:

no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding,from="10.0.0.1",command="/usr/local/bin/fsdumps-receiver" ssh-rsa AAAA.... key_comment

Cuidado com o assunto de "< ip >" opção - o acesso neste exemplo é limitado a um único IP.

O código do servidor tem acesso a algumas variáveis de ambiente úteis. Tais como:

  • $ ENV {'SSH_ORIGINAL_COMMAND'} - "comando" (não realmente) passado como ssh server_ip that_command
  • $ ENV {'SSH_CLIENT'} - IP do cliente

Você pode usar SSH_ORIGINAL_COMMAND para escolher a tarefa de gerenciamento em seu servidor. O código do cliente poderia gerar ssh (ou usar Net :: SSH :: Perl) com este nome de tarefa como argumento e depois enviar / receber dados para / do servidor.

    
por 27.02.2012 / 15:45