Tenho um servidor em uma rede interna (faça login via VPN) de onde faço login no servidor via SSH com autenticação de chave pública/privada OpenSSH. Do ponto de vista da segurança, quero vincular os endereços MAC dos meus três clientes usados iptables
ao servidor para que somente esses clientes possam fazer login nele.
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
No entanto, é recomendado fazer dessa maneira? Que outros métodos (melhores) posso usar para vincular o login SSH aos clientes usados?
(Se alguém quiser solicitar 2FA, infelizmente 2FA não é possível como solução potencial.)
Obrigado.
Responder1
Suponho que você queira evitar que seu servidor SSH aceite conexões de hosts não confiáveis, mesmo que eles forneçam credenciais de usuário válidas. Está certo?
Uma possível solução para vincular a autenticação de chave pública dos usuários a hosts clientes selecionados é por meio da autenticação baseada em host. Configurando a autenticação baseada em host e definindo AuthenticationMethods
parâmetros /etc/ssh/sshd_config
para:
AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
Ou:
AuthenticationMethods hostbased,publickey
Isso instruirá o daemon SSH a solicitar aos clientes que autentiquem os hosts dos quais estão se conectando antes de verificar as chaves ou senhas dos usuários. A primeira alternativa permite autenticação baseada em senha, enquanto a última a restringe apenas a chaves públicas. Como a autenticação baseada em host é baseada em pares de chaves, o servidor SSH será capaz de autenticar clientes com endereços IP dinâmicos.
Aqui segue instruções completas. A documentação de como o SSH executa a autenticação baseada em host está escrita emssh(1)
página de manual. Observe como o SSH identifica os usuários e verifique se isso é aplicável ao seu caso.
A autenticação baseada em host funciona da seguinte maneira: Se a máquina na qual o usuário efetua login estiver listada na máquina remota
/etc/hosts.equiv
e/etc/ssh/shosts.equiv
os nomes de usuário são iguais em ambos os lados, ou se os arquivos~/.rhosts
existirem~/.shosts
no diretório inicial do usuário na máquina remota econtém uma linha contendo o nome da máquina cliente e o nome do usuário nessa máquina, o usuário é considerado para login. Além disso, o servidor deve ser capaz de verificar a chave de host do cliente para que o login seja permitido. Este método de autenticação fecha falhas de segurança devido à falsificação de IP, falsificação de DNS e falsificação de roteamento. [Nota para o administrador:/etc/hosts.equiv
,~/.rhosts
e o protocolo rlogin/rsh em geral são inerentemente inseguros e devem ser desativados se a segurança for desejada.]
Para habilitar a autenticação baseada em host no OpenSSH:
- Defina os seguintes valores de parâmetro em
/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
- Para realizar a autenticação baseada em host, você pode confiar nas informações de nome de host fornecidas pelos clientes configurando
HostbasedUsesNameFromPacketOnly yes
em/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly yes
- Ou, alternativamente, você pode configurar o daemon SSH para identificar nomes de host por meio da resolução de endereços IP dos clientes usando informações armazenadas em
/etc/hosts
arquivos ou registros PTR no servidor DNS da rede:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly no
UseDNS yes
- Liste os nomes de host dos clientes autorizados no
/etc/ssh/shosts.equiv
arquivo. Crie-o manualmente se não existir. A sintaxe do arquivo é quase a mesma documentada emhomem host.equiv(5), no entantoO daemon SSH não aceita nomes de host vazios.
# /etc/ssh/shosts.equiv
ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
- Liste as chaves públicas dos hosts autorizados no
/etc/ssh/ssh_known_hosts
arquivo. Uma maneira conveniente de fazer isso é atravésssh-keyscan
:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts
Depois de configurar o servidor OpenSSH para aceitar solicitações de autenticação baseadas em host, os clientes também devem ser configurados para solicitar autenticação baseada em host:
- Defina os seguintes valores de parâmetro em
/etc/ssh/ssh_config
:
# /etc/ssh/ssh_config
Host *
HostbasedAuthentication yes
EnableSSHKeySign yes
- Certifique-se de que os bits SUID/SGID estejam
ssh-keysign
executável concede permissão de leitura para arquivos de chave privada do host:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
16517300 616 -r-xr-sr-x 1 root ssh_keys 630344 Feb 4 16:01 /usr/libexec/openssh/ssh-keysign
[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys 480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys 387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key