Em termos de segurança, três métodos adicionais me vêm à mente.
A: use autenticação de chave pública
Para aumentar a segurança, você pode configurar o servidor SSH para usar a autenticação de chave pública. Ou seja, além de ou em vez de uma senha forte, a conexão será aberta apenas se o cliente SSH fornecer a chave privada que corresponde à chave pública no servidor. Mesmo que um invasor pudesse obter a chave pública de alguma forma, ele não poderia recuperar a chave privada disso. No entanto, isso não ocultará sua porta dos scanners de portas.
B: use uma porta diferente
Além disso, fiz uma boa experiência em termos de menos verificações de porta com a configuração do servidor SSH para escutar uma porta diferente de 22. A opção de configuração padrão correspondente /etc/ssh/sshd_config
é
Port 22
Você pode mudar isso para, digamos 54322:
Port 54322
Lembre-se de reiniciar o servidor SSH posteriormente; dependendo do Linux no seu Raspberry, pode ser um dos
# service sshd restart
# systemctl restart sshd
(O #
sinal, se não estiver em um arquivo, deve indicar um prompt raiz aqui nos meus exemplos.)
Não se preocupe, sua sessão SSH atual permanecerá ativa. Vale a pena tentar abrir uma segunda sessão SSH na porta 54322 para ver se o logon ainda funciona. Lembrar de
- configure seu cliente SSH para a nova porta
- se aplicável, encaminhe a nova porta do seu roteador da Internet para o Raspberry Pi
C: feche a porta e abra-a apenas mediante solicitação
Se você realmente não deseja mostrar à "Internet" que você tem essa porta aberta, consulte daemons de porta aberta, por exemplo knockd
. Esses programas escutam portas (fechadas) definidas por você e, após uma seqüência de batida, também definida por você, abrem uma porta diferente, por exemplo, sua porta SSH. Em um telefone celular ou laptop, você inicia a sequência de batidas e o daemon de batida no Raspberry Pi abre a porta SSH, que não era visível.
Mais detalhadamente, a batida na porta adicionará uma linha à sua iptables
configuração. Esta linha abrirá a porta do seu Raspberry. Isso também significa que a porta SSH deve ser fechada iptables
antes. E isso significa que você não pode fazer login via SSH.
Um exemplo knockd.conf
pode ser assim:
[openclosessh]
sequence = 1000,2020,3015,65432
seq_timeout = 15
tcpflags = syn
start_command = /usr/local/bin/knockd-open.sh %IP%
cmd_timeout = 30
stop_command = /usr/local/bin/knockd-close.sh %IP%
Além disso, lembre-se de encaminhar as portas a serem batidas do seu roteador da Internet para o seu Raspberry.
Os scripts de abertura / fechamento correspondentes podem ter a seguinte aparência:
#!/bin/bash
# /usr/local/bin/knockd-open.sh
# adds two lines at the top of iptables which allow all incoming and outgoing traffic on tcp port 54322
iptables -I INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -I OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
e
#!/bin/bash
# /usr/local/bin/knockd-close.sh
# deletes those two lines again
iptables -D INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -D OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Lembre-se de tornar os dois scripts executáveis com chmod +x /usr/local/bin/knockd*
. Além disso, você deve iniciar e ativar o serviço de bloqueio com um dos seguintes
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
Especialmente se você usar um computador remoto no qual não tenha acesso ao console, convém atd
revogar automaticamente quaisquer alterações e / ou reiniciar o Raspberry em caso de erros de configuração.
Como o iptables não será armazenado automaticamente nas reinicializações, em um exemplo, você pode ser root (via su
) e
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
Um exemplo ./script-which-closes-iptables.sh
pode ser assim (lembre-se de torná-lo executável com chmod +x
)
#!/bin/bash
# allow everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# allow only related or established incoming ssh sessions
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --dport 54322 -j ACCEPT
# allow outgoing related or established ssh sessions
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --sport 54322 -j ACCEPT
# allow everything on the loopback interface
iptables -A OUTPUT -o lo -j ACCEPT
# drop everything else in and out
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Se sua sessão SSH estiver acabando agora, o Raspberry será reiniciado em 5 minutos. Se sua sessão SSH ainda estiver ativa, revogue a reinicialização pendente com
# atq
15 reboot
# atrm 15
Se a sua sessão SSH ainda estiver ativa, tente fazer login através de uma segunda sessão SSH. Isso não deve funcionar. Em seguida, use seu telefone celular e bata nas portas que você configurou /etc/knockd.conf
. Depois disso, tente novamente fazer login através de uma segunda sessão SSH. Desta vez, deve funcionar.
Então você pode fazer com que o iptables persista uma reinicialização. No seu sistema, pode ser necessário instalar um pacote via
# apt-get install iptables-persistent
Salve suas iptables com
# iptables-save > /etc/iptables/iptables-rules
e habilite o serviço iptables com
# systemctl enable iptables