Configurando um shell OpenSSH para qualquer nome de usuário de conexão

3

Usando o pacote sshd OpenSSH padrão para o Debian, existe alguma maneira de configurá-lo para tratar cada nome de usuário como sendo o mesmo?

Por exemplo, se alguém conectou com um nome de usuário aleatório (ie: 8LaRiQRd8Qjh), que não existia como um usuário Linux, eu poderia configurar o sshd para tratar isso como algum nome de usuário consistente como "testuser"?

Eu sei como isso pode ser feito a partir da perspectiva do cliente SSH, mas eu quero que o próprio servidor SSH aceite quaisquer credenciais de conexão (permitindo que meu shell lide com a autenticação nesse nível).

Idealmente, o que eu quero é uma regra como "Se não houver um nome de usuário existente, use este nome". Mesmo "usar sempre este nome de usuário" é bom, menos ideal.

Seria bom encontrar uma solução simples usando o serviço sshd OpenSSH padrão, em vez de executar meu próprio serviço sshd.

    
por GoldenNewby 01.09.2016 / 22:56

1 resposta

2

Eu não tenho ideia do porquê você está tentando fazer isso, e parece uma péssima idéia.

Dito isso, por alguma razão a pergunta me deixou viciada e precisei encontrar uma resposta.

A resposta curta é que isso não pode ser feito prontamente simplesmente configurando os pacotes disponíveis no debian.

Se você quiser fazer isso, você tem que escrever dois módulos: um para o NSS e outro para o PAM.

Para o módulo NSS você precisará fornecer pelo menos _getpwbynam_r . Para o módulo PAM , há muito mais clichê.

Isso parece ser muito trabalhoso e não é o que você está procurando, mas desde que você mencionou que deseja cuidar da autenticação, essa é a maneira de fazer isso.

Uma opção muito mais simples (e provavelmente muito menos segura) seria usar paramiko para configurar um servidor SSH em Python e personalizar / ligar as funções de autenticação.

Felizmente, os caras da paramiko já fizeram a maior parte do levantamento de peso neste servidor de demonstração eles têm em seu repo.

Ao substituir o check_auth_password ou check_auth_publickey , você pode aceitar qualquer usuário como válido. Um exemplo de senha auth (*) :

# pip install pam
import pam
MYUSER = 'testuser'

class Server(paramiko.ServerInterface):
    def check_auth_password(self, username, password):
        if password and pam.authenticate(username=MYUSER, password=password):
            return paramiko.AUTH_SUCCESSFUL
        return paramiko.AUTH_FAILED

Como isso não é StackOverflow, vou parar por aí:)

Isto criará um servidor ssh que irá ignorar nomes de usuários para autenticação de senha e verificará a senha dada em relação a testuser .

Por padrão, este servidor solicitará um nome e sairá. Você pode querer substituir isso por um shell ou seu aplicativo personalizado.

Eu codifiquei o nome de usuário, mas você pode facilmente obtê-lo de um arquivo de configuração ou de uma pesquisa de banco de dados ou qualquer outra coisa.

Você também pode querer substituir a variável host_key e talvez o número da porta.

Há tantas maneiras de se atirar no pé com isso. Você deve ser muito, muito, muito cuidado. Este código não está pronto para produção, revise a coisa toda. Se você não encontrar nada de errado, você não fez uma boa revisão; -).

* : isto está simplesmente substituindo uma função na classe Server em demo_server.py e adicionando algumas coisas no topo

    
por 02.09.2016 / 21:41