Como se comunicar com o OpenSSH na mesma máquina? Tem API?

1

Estou na mesma máquina que o servidor OpenSSH, ou seja, não preciso autenticar. Eu, no entanto, quero poder me comunicar com o servidor OpenSSH do meu aplicativo cliente em Python ou outra linguagem. Ou seja, quando um novo cliente está se conectando, no meu script python eu quero ser notificado sobre isso e recuperar suas chaves públicas, endereço IP, etc ... E rejeitar que um cliente de login. Ou talvez permitir - dependendo de algumas condições.

O servidor OpenSSH fornece essa API ou retornos de chamada?

    
por Jodari 09.08.2017 / 18:03

3 respostas

2

Não oferece uma API.

Lembre-se de que você está falando sobre autenticação, que o OpenSSH pode usar o PAM. Então você provavelmente poderia coletar algumas informações sobre autenticação e tomar decisões de permissão / rejeição em um módulo PAM, mas eu não acho que isso pode ser feito com python.

    
por 09.08.2017 / 19:15
2

Se seus clientes nunca usam uma senha, mas sempre uma chave, você pode usar o parâmetro AuthorizedKeysCommand em sshd_config para executar seu script Python para validar a chave SSH. Você provavelmente pode fazer alguns truques para encontrar o IP, detectando o processo pai do processo Python e verificando seus descritores de arquivos.

Espero que isso ajude.

    
por 09.08.2017 / 23:52
0

Eu vejo duas maneiras de interpretar sua pergunta.

Monitoramento de logs

Talvez você esteja realmente procurando por um script de monitoramento de log como Fail2ban (que é um projeto python de software livre, para que você possa ver como o código deles funciona).

Os registros do servidor SSH variam em sua localização com base em como eles são instalados. Eles geralmente residem em /var/log/auth.log , /var/log/secure , /var/log/sshd.log ou um nome semelhante em uma área de log alternativa como /usr/local/var/log/ (consulte também Como verificar o log sshd? ). Aqui está um log de amostra:

Aug 14 12:34:56 jodari-desktop sshd[12345]: Accepted pubkey for jodari from 127.0.0.1 port 54321 ssh2: RSA SHA256:3xyQ+PG0Z3CIiShclJ2iNya5TOdKDgE/HrOXr11IdOo

Se você "quiser ser notificado sobre isso e recuperar as chaves públicas, o endereço IP etc." então você só precisa monitorar essa linha. (É possível que você precise aumentar o LogLevel em /etc/ssh/sshd_config ou onde quer que o arquivo esteja.)

Se você deseja recuperar as chaves públicas reais do usuário (em vez de apenas as impressões digitais), o script precisaria simplesmente percorrer o arquivo $HOME/.ssh/authorized_keys (esse é o local padrão; ele pode ser alterado com AuthorizedKeysFile diretiva em seu sshd_config ). Você precisará combinar a impressão digital com a chave pública. É grátis se houver apenas uma linha válida no arquivo, mas você precisaria gerar a impressão digital de cada chave pública e associá-la à impressão digital extraída dos registros. Basta procurar a impressão digital na saída do seguinte comando:

ssh-keygen -lf "$HOME/.ssh/authorized_keys"

Execução de comandos via SSH

Se você está realmente procurando executar as coisas como elas seriam experimentadas em uma sessão SSH, você pode usar chaves ssh sem senha para executar comandos.

Gere chaves ssh apenas para uso interno e você terá acesso sem senha automatizado via ssh no localhost. Isso manterá tudo controlado pelo OpenSSH, portanto, para monitorar conexões, basta procurar localhost como autenticado pelas chaves internas dedicadas nos logs SSH padrão.

Eu não posso falar sobre o modo python de fazer isso, mas você pode fazer tudo isso em python como chamadas de sistema.

Para criar a chave:

mkdir -p "$HOME/.ssh"
chmod 700 "$HOME/.ssh"
ssh keygen -t rsa -b 4096 -P "" -C "python script PASSWORDLESS access" \
  -f "$HOME/.ssh/python-localhost.id_rsa"

Para instalá-lo localmente:

cat "$HOME/.ssh/python-localhost.id_rsa.pub" >> "$HOME/.ssh/authorized_keys"

Para usá-lo:

ssh -i "$HOME/.ssh/python-localhost.id_rsa" localhost your_command_goes_here
    
por 14.08.2017 / 18:06

Tags