Em termos de segurança, três métodos adicionais vêm à minha mente.
A: usar autenticação de chave pública
Para aumentar a segurança, você pode configurar seu servidor SSH para usar a autenticação de chave pública. Ou seja, adicionalmente ou em vez de uma senha strong, a conexão será aberta apenas se o cliente SSH fornecer a chave privada que corresponde à chave pública no servidor. Mesmo que um atacante pudesse ganhar 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 varreduras de portas com a configuração do servidor SSH para ouvir uma porta diferente de 22.
A opção de configuração padrão correspondente em /etc/ssh/sshd_config
é
Port 22
Você pode alterar isso para, por exemplo, 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, indicará um prompt de root aqui nos meus exemplos.)
Não se preocupe, sua sessão SSH atual permanecerá ativa. Pode valer a pena tentar abrir uma segunda sessão SSH para a porta 54322 para ver se o login ainda funciona. Lembre-se de
- configure seu cliente SSH para a nova porta
- se aplicável, encaminhe a nova porta em seu roteador de internet para o Raspberry Pi
C: feche a porta e abra-a somente a seu pedido
Se você realmente não quer mostrar "a internet" que você tem esta porta aberta, dê uma olhada nos daemons de batidas de porta, e. g. %código%. Esses programas escutam as portas (fechadas) definidas por você e, em uma seqüência de detonação, também definida por você, abre uma porta diferente, e. g. sua porta SSH. De um telefone celular ou laptop, você inicia a sequência de batidas e o daemon de batida no seu Raspberry Pi abre sua porta SSH, que não era visível.
Mais detalhadamente, a batida de portas adicionará uma linha à configuração knockd
. Esta linha irá abrir a porta no seu Raspberry. Isso também significa que a porta SSH deve ser fechada por iptables
antes. E isso significa que você não pode fazer login via SSH.
Um exemplo iptables
poderia 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 acionadas do seu roteador de internet para o seu Raspberry.
Os scripts de abertura / fechamento correspondentes podem ser assim:
#!/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 knockd.conf
. Além disso, você deve iniciar e ativar o serviço knockd com um dos
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
Especialmente se você contratar um computador remoto em que não tenha acesso ao console, talvez queira usar chmod +x /usr/local/bin/knockd*
para revogar automaticamente quaisquer alterações e / ou reinicializar o Raspberry em caso de erros de configuração.
Como o iptables não será armazenado através de reinicializações automaticamente, em um exemplo, você pode ser root (via atd
) e
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
Um exemplo su
poderia ser assim (lembre-se de torná-lo executável com ./script-which-closes-iptables.sh
)
#!/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 a sua sessão SSH estiver a morrer agora, o Raspberry irá reiniciar 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 por meio de uma segunda sessão SSH. Isso não deveria funcionar. Em seguida, use seu celular e bata as portas que você configurou em chmod +x
. Depois disso, tente novamente fazer login por meio de uma segunda sessão SSH. Desta vez, deve funcionar.
Então você pode fazer seu iptables persistir em uma reinicialização. No seu sistema, você pode ter que instalar um pacote via
# apt-get install iptables-persistent
Salve seus iptables com
# iptables-save > /etc/iptables/iptables-rules
e ative o serviço iptables com
# systemctl enable iptables