Restringindo o acesso ao SSH com um endereço IP dinâmico

3

Desativei PasswordAuthentication para SSH e estou usando uma chave pública-privada para fazer login. No entanto, vários guias (em particular, este ) eu vi sugerir apenas permitir o acesso SSH do meu endereço IP particular.

/etc/ssh/sshd_config:
    AllowUsers deploy@(your-ip) deploy@(another-ip-if-any)

ufw allow from {your-ip} to any port 22
  • Existe algum ponto em restringir por endereço IP dentro de sshd_config E adicionar uma regra de firewall?

  • Supondo que eu tenha um endereço IP dinâmico, essas regras pareceriam inúteis, já que tenho que usar o terminal do console de provedores de hospedagem, efetue login na raiz para permitir o acesso do IP da minha casa. Nesse caso: qual é a rota sugerida?

1: Proibir todos os logins por SSH, a menos que eu use primeiro o terminal de provedores de hospedagem, faça o login em uma raiz para permitir o acesso do meu IP de casa ao SSH?

2: Mantenha a porta SSH aberta e confie na chave público-privada para fazer login.

3: Alguma outra sugestão?

    
por R4D4 08.02.2017 / 15:03

2 respostas

1

Bem, eu fiz muita escavação e não encontrei nada. Então, eu configurei meu computador doméstico com um serviço de DNS dinâmico e criei o seguinte script bash, espero que seja útil para outra pessoa.

Instruções:

  • Esse script não é específico para o SSH e é uma maneira de permitir um acesso permanente do host dinâmico a uma porta de destino usando o ufw - irrelevante de qual serviço está escutando nessa porta. Portanto, usar a porta 22 (por padrão) permitiria acesso permanente do host dinâmico ao SSH. Da mesma forma, você pode usar esse script para garantir acesso permanente de seu host dinâmico a algo como FTP (porta 21).

  • Tudo o que é necessário é modificar as variáveis RemoteHostName e PortNumber na parte superior do arquivo. Obviamente, o RemoteHostName é o nome do host fornecido pelo provedor de DNS dinâmico e o PortNumber é a porta à qual estamos permitindo o acesso.

  • Se o IP resolvido do RemoteHostName já existir dentro do ufw com acesso à porta de destino, o script sairá, pois não há nada para alterar.

  • Se não existir, todas as entradas com o número da porta de destino dentro do ufw serão excluídas e uma nova entrada será incluída usando o endereço IP e a porta de destino atualizados. Resumindo, não tente usar o ufw para outras regras que envolvam a porta no script, pois o script irá percorrê-las.

  • Se este script é chamado por um cron job ou algo assim, então, em teoria, sempre deve manter o endereço IP atualizado dentro do ufw.

  • O script gera o seguinte:

    1) Standard output: Could not resolve the IP address of the RemoveHostName XYZ
    2) Standard output: No change necessary as the IP address XYZ already has access to port XYZ.
    3) Standard output: Deleting old ufw rule: XYZ
    4) Standard output: Adding new ufw rule: XYZ
    5) Error output: Could not resolve the IP address of the RemoveHostName XYZ
    
  • Por favor note, eu não sou muito familiarizado com o script bash e tão pouco familiarizado com expressões regulares. Então, se você usar esse script, faça um favor a você (e a mim!) E dê uma olhada nele. Se você perceber algum erro, por favor deixe um comentário e / ou uma nova resposta.

Script:

#!/bin/bash


##############################################################
#Variables
##############################################################    
RemoteHostName=someremotehost.dyndnsorsomething.com
PortNumber="22"


##############################################################
#Check if the dynamic IP address exists within ufw.
##############################################################
DynamicIPAddress=$(host $RemoteHostName | awk '/has address/ { print $4 }')
if [[ $DynamicIPAddress = "" ]]
then
    echo $(date -u -Iseconds): Could not resolve the IP address of the RemoveHostName $RemoteHostName >&2
    exit
fi

UFWRules=$(ufw status numbered)
REGEX=" $PortNumber (.*)ALLOW IN(.*)$DynamicIPAddress$"
while read -r line; do
    if [[ $line =~ $REGEX ]]
    then
        echo $(date -u -Iseconds): No change necessary as the IP address $DynamicIPAddress already has access to port $PortNumber.
        exit
    fi
done <<< "$UFWRules"


##############################################################
#Remove all entries with the given port number.
##############################################################
while true
do

    UFWRules=$(ufw status numbered)
    REGEX="(.*) $PortNumber (.*)ALLOW IN(.*)"
    Matched="No"
    while read -r line; do
        if [[ $line =~ $REGEX ]]
        then
            echo $(date -u -Iseconds): Deleting old ufw rule: $line
            RuleNumber=$(echo $line | (cut -d "[" -f2 | cut -d "]" -f1))
            ufw --force delete $RuleNumber
            Matched="Yes"
            break
        fi
    done <<< "$UFWRules"

    if [ $Matched = "No" ]
    then
        break
    fi

done


##############################################################
#Add in access from the dynamic IP address.
##############################################################
echo $(date -u -Iseconds): Adding new ufw rule: "ufw allow from $DynamicIPAddress to any port $PortNumber".
ufw allow from $DynamicIPAddress to any port $PortNumber
    
por R4D4 12.02.2017 / 21:40
0

Se você estiver executando um servidor web no mesmo host, o que significa que o PHP provavelmente também está instalado, então você pode instalar uma ferramenta que eu escrevi, usei e mantive ativamente:

link

Clientes que precisam de acesso SSH executam a parte do cliente como um serviço do sistema no sistema operacional escolhido. O cliente mantém a porta SSH do servidor e qualquer outra porta protegida (por exemplo, POP3 / IMAP) aberta com pacotes criptografados não freqüentes. É uma solução muito boa para esquecer e esquecer. Eu pessoalmente tive zero problemas com o software, mas você pode querer testá-lo em um droplet DigitalOcean ou serviço similar antes de implantá-lo em seu ambiente de produção. As portas são mantidas abertas por até 30 minutos (o padrão), a menos que os pacotes de renovação sejam enviados (o cliente tenta uma renovação a cada 10 minutos por padrão), o que permite que os endereços IP sejam alterados com o mínimo de tempo de inatividade. Quando as portas são abertas para um endereço IP, as notificações por e-mail são opcionalmente enviadas para quem estiver configurado para receber tais notificações.

O objetivo é limitar drasticamente a superfície de ataque, fechando porta (s) sensível (s) para todos que não possuem as chaves de criptografia para clientes em IPs dinâmicos, em que a configuração de uma VPN complexa não é uma opção. Mesmo que um invasor acabe com o mesmo endereço IP desbloqueado (por exemplo, um laptop no WiFi de uma cafeteria), eles ainda precisam passar pelo SSH, mas pelo menos a Rússia, a China e a Coreia do Norte não conseguem sequer ver o porto .

A propósito, eu não uso o ufw. Ela polui o iptables com um monte de cadeias desnecessárias, torna as regras do iptables muito mais complicadas do que precisam, e mais regras equivalem ao processamento mais lento de pacotes através do iptables. Eu escrevi um post não muito tempo atrás sobre como escrever regras elegantes do iptables:

link

Na verdade, é muito mais fácil usar o iptables diretamente e é menos complicado do que o ufw quando você pode copiar conjuntos de regras bons e limpos. Além disso, você nunca sabe quando ficará preso em uma caixa do CentOS.

    
por CubicleSoft 12.09.2017 / 03:46

Tags