Limitar o acesso SSH a clientes específicos por endereço IP

22

Como permitimos que um determinado conjunto de IPs privados entre através do login SSH (par de chaves RSA) no Linux Server?

Ranjan Kumar
fonte
3
As regras de firewall são um curso normal de ação a ser tomada
Raman Sailopal
2
firewall ou /etc/hosts.allow se o ssh compilar com wrappers TCP ou regras de arquivo / etc / ssh / sshd_config.
Rui F Ribeiro
mais do que uma maneira de fazer, consulte linux.die.net/man/5/sshd_config que explica tudo em/etc/ssh/sshd_config
ron

Respostas:

42

Você pode limitar quais hosts podem se conectar configurando wrappers TCP  ou filtrando o tráfego de rede (firewall) usando iptables . Se você quiser usar métodos de autenticação diferentes, dependendo do endereço IP do cliente, configure o daemon SSH (opção 3).

Opção 1: Filtrando com IPTABLES

As regras de iptables são avaliadas em ordem, até a primeira correspondência.

Por exemplo, para permitir o tráfego da rede 192.168.0.0/24 e, de outra forma, soltar o tráfego (para a porta 22). A DROPregra não é necessária se a política padrão do iptables estiver configurada DROP.

iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Você pode adicionar mais regras antes da regra de queda para corresponder a mais redes / hosts. Se você tiver muitas redes ou endereços de host, use o módulo ipset . Há também o módulo iprange , que permite o uso de qualquer faixa arbitrária de endereços IP.

Os iptables não são persistentes nas reinicializações. Você precisa configurar algum mecanismo para restaurar o iptables na inicialização.

iptablesaplicam-se apenas ao tráfego IPv4. Os sistemas que têm ssh ouvindo o endereço IPv6 com o qual a configuração necessária pode ser feita ip6tables.

Opção 2: Usando wrappers TCP

Você também pode configurar quais hosts podem se conectar usando wrappers TCP. Com os wrappers TCP, além dos endereços IP, você também pode usar nomes de host nas regras.

Por padrão, negue todos os hosts.

/etc/hosts.deny:

sshd : ALL

Em seguida, liste os hosts permitidos em hosts.allow. Por exemplo, para permitir rede 192.168.0.0/24 e localhost .

/etc/hosts.allow:

sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]

Opção 3: configuração do daemon SSH

Você pode configurar o daemon ssh no sshd_config para usar um método de autenticação diferente, dependendo do endereço do cliente / nome do host. Se você deseja apenas bloquear a conexão de outros hosts, use iptables ou TCP wrappers.

Primeiro remova os métodos de autenticação padrão:

PasswordAuthentication no
PubkeyAuthentication no

Em seguida, adicione os métodos de autenticação desejados após a Match Addressno final do arquivo. A colocação Matchno final do arquivo é importante, uma vez que todas as linhas de configuração depois são colocadas dentro do bloco condicional até a próxima Matchlinha. Por exemplo:

Match Address 127.0.0.*
    PubkeyAuthentication yes

Outros clientes ainda podem se conectar, mas os logons falharão porque não há métodos de autenticação disponíveis.

Os argumentos de correspondência e as opções de configuração condicional permitidas estão documentados na página do manual sshd_config . Os padrões de correspondência estão documentados na página do manual ssh_config .

sebasth
fonte
Que tal adicionar uma diretiva ListenAddress em / etc / ssh / sshd_config?
Jerome
É possível em situações específicas (por exemplo, ouvindo o endereço de rede privado), dependendo da sua configuração de rede e de quais hosts você deseja permitir.
sebasth
2
Além disso, o sshd_config pode definir filtros com a diretiva AlowUsers e, também, as teclas_autorizadas podem ser configuradas com 'from IP or subnet "para filtrar também.
tonioc
@tonioc Ótima solução para meu caso de uso. Por favor, expanda esta sugestão em uma resposta.
simlev
se você tiver uma placa de rede com 4 portas cada indo para uma rede diferente, então o padrão #ListenAddress ::em /etc/ssh/sshd_configdirá ao servidor SSH para aceitar entrada de qualquer uma dessas redes. Caso contrário, faça ListenAddress <ip address>onde <ip address>está a porta NIC que você deseja permitir. Meu eth0é, 192.168.3.4portanto, ListenAddress 192.168.3.4resulta em SSH trabalhando apenas na rede 192.168.3.4 que está no eth0; e eth1 eth2 eth3 é negado.
ron
5

Aqui estão algumas configurações adicionais para o daemon SSH para estender a resposta anterior:

  • Adicione filtragem de usuário com a AllowUsersopção no sshd_configarquivo:

    AllowUsers [email protected].* [email protected].* otherid1 otherid2
    

    Isso permite johndoe e admin2 somente de 192.168.1.*endereços e otherid1 , otherid2 de qualquer lugar.

  • Restrinja uma chave ssh ou chave baseada em ca a um conjunto de endereços no .ssh/authorized_keysarquivo do diretório inicial de um determinado usuário:

    from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias
    

    Neste exemplo, a chave pública para useralias será efetiva apenas a partir de endereços determinados.

tonioc
fonte