Blog DLN Cloud

SSH Autenticação Baseada em Host

O Serviço SSH pode usar vários métodos de autenticação, o método de autenticação ensinado no artigo é fazer o ssh usar uma Autenticação baseada em host.

Esse artigo ensina as etapas necessárias para configurar a autenticação baseada em host usada no ssh entre o servidor linux remoto que tem o ssh instalado e o cliente linux.

A autenticação baseada em host faz uso de uma chave pública e privada assim como é feita com a autenticação de chave pública SSH, em ambos os casos uma conexão segura é feita usando um par de chaves.

A principal diferença é que a autenticação usando a chave pública é feita por conta de usuário cadastrada no sistema remoto que será acessado, ou seja, o par de chaves privada e pública é configurado para cada conta de usuário. Na prática o cliente tem a chave privada e a chave pública é armazenada no arquivo .ssh/authorized_keys do servidor remoto que será acessado, esse arquivo fica dentro do diretório home da conta de usuário do servidor remoto.

Enquanto a autenticação baseada em host o cliente linux pode acessar as contas de usuários do sistema remoto, uma vez que toda a configuração seja feita sem precisar configurar o acesso para cada conta de usuário individualmente que será acessada.

Configuração do Cliente SSH

No sistema cliente linux o primeiro passo é instalar o OpenSSH Client, como já explicado aqui no blog. Em seguida editar o arquivo /etc/ssh/ssh_config, adicionando no fim do arquivo a seguinte configuração:

EnableSSHKeySign yes
HostbasedAuthentication yes

A opção “EnableSSHKeySign” precisa ser habilitada para usar o programa ssh-keysign, que é usado durante a autenticação baseada em host. O ssh-keysign é usado pelo ssh durante o acesso remoto para acessar as chaves do host local e gerar a assinatura digital necessária durante a autenticação baseada no host.

Já a opção “HostbasedAuthentication” é usada para o cliente solicitar autenticação baseada em host ao se conectar aos sistemas remotos que serão acessados.

Como já explicado a autenticação usa um par de chaves uma privada e uma pública, então é necessário que as chaves de públicas do servidor remoto sejam armazenadas no sistema cliente no arquivo /etc/ssh/ssh_known_hosts. Para obter as chaves públicas do servidor remoto usaremos o comando ssh-keyscan e depois salvar tudo dentro do arquivo, no exemplo o servidor remoto tem o IP 192.168.0.39 e o comando deve ser executado com usuário com permissão administrativa(root):

ssh-keyscan 192.168.0.39 | tee -a /etc/ssh/ssh_known_hosts

Para visualizar o conteúdo do arquivo podemos usar o comando cat /etc/ssh/ssh_known_hosts:

cat /etc/ssh/ssh_known_hosts
192.168.0.39 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPe7lcwryukNwpeXESVJ8a+BKQbGBQ3UEZQbikLz/jj1455Aobm7xvM/0dPADi+JW+u9AUyr4sLRWl12PoHbpis=
192.168.0.39 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDtg4Ksvk1/1sRLxVA1AUcCpSkXEp8EOJoWEueF2R4zhsiYrvaWMEXdPi5VlHRWlx0uWm3/FoaJ9CGOXhTVHeU6EhY2FsG+5xyjxmdAfQACDfw3EFPK5a6zfW++gTwYfjrtiy3OtTgWWn4RlJ38UCQYyXo+D2L1uH5/l5FELcjz0QAFK917xaJ/pR483K3BPbZMsrMpgVjQqk0e09TcbqUnKiewU8J9IVWvstDIh/mdf9u2NTuQluDxa9oNcXCR9yWnpA3fKQXY74ZEKHARuBdwslLHNJyrgDhWBxM34ePPUvsB7+zIaH4nuN2TQvZ7v9XBUm00Q9SRtnlGSwMRWV2MCP+YO2GM7motnUi0PvYl4VxzVL1P/8H3J77tcgKzlcYMjzTOzdVSka4cd6TDzE5YlmM4EeGGkGu1kvs1aTHNxVsJoVWBuf+N5aEaEcgZLr0mefdeSZ6KIwZLI3pO6vVgI24uD+tz/9LaFNxXVi48UzzeYRTlIdTYbO0d/A2dPP8=
192.168.0.39 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKnalnhLgEASrOtX/LURtsgRZcXMdrQeQRNXtQF7SeYw

E a última etapa é gerar as chaves privadas e públicas para o programa ssh-keysign ler as chaves privadas do host do sistema cliente, as chaves ficam dentro no diretório /etc/ssh/.

Se o cliente tem instalado o OpenSSH Server, não é necessário concluir essa etapa, por que quando o OpenSSH Server é instalado o OpenSSH cria as chaves públicas e privadas automaticamente, mas se o OpenSSH Server não tiver sido instalado no sistema cliente, então continue.

Para gerar as chaves privadas e públicas no sistema cliente, caso ainda não existam, podemos criar-las manualmente usando o comando ssh-keygen com a opção -A.

ssh-keygen -A

Quando o caminho onde as chaves serão armazenadas não é especificado, é usado o caminho padrão que é o /etc/ssh/.

Configuração do Servidor Remoto SSH

No servidor remoto que irá ser acessado pelo cliente é necessário primeiro instalar o OpenSSH Server, como já foi explicado aqui no blog.

Depois de instalar o OpenSSH Server no servidor remoto é necessário configurar o arquivo /etc/ssh/shosts.equiv para controlar quais clientes podem usar a autentição baseada em host. O arquivo /etc/ssh/shosts.equiv deve conter uma lista de endereços DNS ou IP de sistemas clientes que têm permissão para tentar a autenticação baseada em host e também pode ser incluso o nome da conta de usuário do sistema cliente usado no momento da autenticação.

A sintaxe do arquivo é:

endereço_do_cliente usuário_do_cliente

O Nome da conta de usuário é opcional, caso omita todas as contas de usuário do cliente autorizado no arquivo shosts.equiv serão permitidas, desde que exista no servidor remoto. Vejamos alguns Exemplos:

client.domain.com linus
10.10.10.1

O Primeiro exemplo informa que o cliente “client.domain.com” pode usar autenticação baseada em host desde que a conta de usuário do cliente(client.domain.com) que esta executando o comando ssh seja a conta chamada linus. É importante não fazer confusão, quando menciono conta de usuário do cliente, não é conta de usuário do servidor que será acessado e sim a conta de usuário que está sendo usada no cliente no momento que o comando ssh é executado para acessar o servidor remoto.

O segundo exemplo não especifca contas de usuários, então o acesso é permitido a qualquer conta de usuário cadastrada no cliente que tem o endereço IP 10.10.10.1, desde que a conta de usuário que é usada para executar o comando ssh no cliente exista também no servidor remoto.

IMPORTANTE:

O acesso é concedido ao cliente que tiver o endereço(IP ou DNS) e o nome da conta de usuário presentes no arquivo /etc/hosts.equiv ou dependendo do sistema em /etc/ssh/shosts.equiv.

Nas linhas que tem somente especificado o endereço(IP ou DNS) do cliente, qualquer conta de usuário do cliente pode acessar o servidor usando autenticação baseada em host, desde que exista uma conta de usuário com o mesmo nome no servidor remoto.

Para mais informações e exemplos de configuração do arquivo shosts.equiv, consulte o manual do arquivo hosts.equiv que é o arquivo usado por algumas distribuições linux em substituição ao arquivo /etc/ssh/shosts.equiv:

man 5 hosts.equiv

Para colocar em prática o exemplo abordado nesse artigo, vamos criar o arquivo /etc/ssh/shosts.squiv e adicionar a seguinte linha no arquivo:

192.168.0.3 suporte

Nessa configuração o servidor permite que o cliente com endereço IP 192.168.0.3 use autenticação baseada em host desde que a conta de usuário do cliente que executou o comando ssh seja a conta de usuário chamda suporte, assim o cliente 192.168.0.3 usando a conta suporte pode acessar qualquer conta de usuário do servidor remoto(192.168.0.39), desde que permitida nas configurações do arquivo sshd_config do servidor.

E como já mencionado alguns sistemas não usam o arquivo /etc/ssh/shosts.equiv, então também será criado um link simbolico chamado /etc/hosts.equiv que aponta para o arquivo /etc/ssh/shosts.equiv, assim caso use um sistema diferente para colocar em prática o que é ensinado no artigo não terá problemas ;).

ln -s /etc/ssh/shosts.equiv /etc/hosts.equiv

Os clientes configurados no /etc/ssh/shosts.equiv do servidor também devem ter suas chaves públicas armazenadas no arquivo /etc/ssh/ssh_known_hosts do servidor para serem reconhecidos.

Na prática esse arquivo /etc/ssh/ssh_known_hosts deve conter três campos obrigatórios por linha. O primeiro da esquerda para direita é o nome do host ou o endereço IP correspondendo aos configurados no arquivo shosts.equiv. O segundo campo é o tipo de chave, ssh-rsa para chaves RSA ou ssh-ed25519 para chaves Ed25519 ou ecdsa-sha2-nistp256 para chaves ECDSA. O terceiro campo é a própria chave pública.

Para transferir as chaves públicas do cliente para o arquivo /etc/ssh/ssh_known_hosts do servidor, vamos executar o código abaixo, que na prática, usa o comando sed para substituir o inicio de cada linha pelo endereço IP do cliente(192.168.0.3) e envia a saída para o comando ssh que armazena no arquivo /tmp/ssh_known_hosts do servidor remoto 192.168.0.39.

sed 's/ root.*//;s/^/192.168.0.3 /' /etc/ssh/*.pub | ssh [email protected] 'tee /tmp/ssh_known_hosts'

Agora no servidor(192.168.0.39) mova o arquivo /tmp/ssh_known_hosts para /etc/ssh/ssh_known_hosts e altere as permissões usando os comandos abaixo usando o usuário root:

mv /tmp/ssh_known_hosts /etc/ssh/ssh_known_hosts
chown root. /etc/ssh/ssh_known_hosts
chmod 644 /etc/ssh/ssh_known_hosts

E por ultimo edite no servidor o arquivo /etc/ssh/sshd_config e inclua no final do arquivo a opção de configuração HostbasedAuthentication, que deve ser informado para permitir a autenticação baseada em host.

HostbasedAuthentication yes

Salve as alterações e reinicie ou execute ou reload na unit ssh.service:

systemctl reload ssh.service

Conectando-se ao servidor remoto usando autenticação baseada em host

Agora é hora de testar toda a configuração feita e se autenticar no servidor remoto usando a autenticação baseada. É importante mencionar que não é necessário informar a senha de conta de usuário do servidor remoto, a autenticação é feita usando o par de chaves.

Lembrando que nesse artigo o cliente tem o IP 192.168.0.3, o cliente executa o comando ssh usando a conta de usuário suporte, tenta se autenticar no servidor remoto 192.168.0.39 com a conta de usuário dlncloud:

ssh [email protected] -v

A opção -v do comando ssh é usada para mostrar detalhes(modo verbose), como a saída é longa destaco abaixo as principais informações:

debug1: Authentications that can continue: publickey,password,hostbased
debug1: Next authentication method: hostbased
debug1: userauth_hostbased: trying hostkey ecdsa-sha2-nistp256 SHA256:bCsU1xW7G8mbpD0Ic8fwebGSqtxojX2Qd1pYh1l+IFU
debug1: Authentication succeeded (hostbased).
Authenticated to 192.168.0.39 ([192.168.0.39]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Remote: Accepted for 192.168.0.3 [192.168.0.3] by /etc/hosts.equiv.
debug1: Sending environment.
debug1: Sending env LANG = pt_BR.UTF-8

A primeira linha mostra o tipo de autenticação habilitada no servidor remoto(192.168.0.39), em seguida é usada o tipo de autenticação hostbased(autenticação baseada em host), é selecionada a chave e a autenticação é bem sucedida. o acesso é autorizado para o cliente 192.168.0.3 configurado no arquivo /etc/hosts.equiv(link simbolico para /etc/ssh/shosts.equiv).

Espero que o artigo para configurar e entender a autenticação baseada em host, tenha sido útil. Se tiver dúvidas deixe sua pergunta na seção de comentários abaixo.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *