É seguro reiniciar um servidor aberto na Internet?

29

Especificamente

Eu tenho um conjunto de regras iptables definido em um servidor executando o CentOS. Estou garantido / posso garantir / como posso garantir que, quando a rede fica on-line (na inicialização da máquina ou após reiniciar o serviço de rede), o conjunto de regras do iptables já está aplicado (e se o iptables falhou na inicialização ou falha na aplicação do conjunto de regras) a interface de rede não será exibida)?

(Eu sei que essa é uma pergunta noob, mas nunca executei um servidor em nada além de redes confiáveis ​​atrás de um NAT DHCP mascarado e um firewall, então ... espere perguntas noob de noobs.)

Tiro Parthian
fonte
15
Realmente não é uma pergunta noob. Foi assim que os hackers entraram na rede PlayStation em 2011, causando 24 dias de interrupção e US $ 15 milhões em acordos. Quando os firewalls foram reiniciados (como mensalmente), o firewall ficou aberto por alguns momentos - aparentemente por tempo suficiente.
31514 Chris-S
@ChrisS A coisa mais estranha sobre isso, para mim, é que tenho certeza de que os administradores do sistema responsáveis ​​por essa rede certamente serão inteligentes o suficiente para recusar se alguém sugerir desligar o firewall, mas não pestanejar mensalmente. , desligando-o ... e depois ligando novamente. Mas não tenho certeza de qual combinação deles explicaria isso.
Parthian Shot
Outra opção é desativar a porta no comutador de rede até que o servidor seja totalmente inicializado - se você estiver no local e tiver acesso ao comutador. Isso não é o ideal, mas definitivamente funcionaria, a menos que o servidor tivesse uma dependência de rede como o NFS.
precisa saber é
@ jftuga Bem, claro. Mas o servidor não estaria conectado à Internet e, portanto, tecnicamente, a solução não se enquadra no âmbito desta questão. Se estiver no local, basta desconectar o cabo Ethernet durante a reinicialização. E o problema subjacente continuaria com a solução de bloqueio de portas; que outro computador atacando pela rede não seria interrompido pelo firewall local. Se o roteador for hackeado, se houver mau funcionamento ou outra pessoa na rede local for comprometida, o jogo ainda terminará.
Parthian Shot
@ Jftuga De fato, a questão é ainda pior do que isso. Supondo que alguém já tenha adquirido um software para rodar na máquina local, mas meu firewall faz a filtragem de saída, digamos que a regra é que pacotes de saída só serão permitidos se estiverem estabelecidos ou relacionados, e que novas conexões de entrada só sejam permitidas para a porta 80 Normalmente, isso impediria um shell reverso de uma conta sem privilégios. Mas se a conexão for iniciada na inicialização, ela será mantida através da inicialização do firewall. Suponho que isso também signifique que as regras do firewall devem mudar, mas é um erro fácil de cometer.
Parthian Shot

Respostas:

18

Pronto, você tem a garantia de que o iptables será iniciado antes que a interface seja apresentada pela ordem dos scripts de inicialização. Observe a linha "chkconfig" em cada script de inicialização e você verá os níveis de execução "ativados" quando ativos, a ordem de início e a ordem de parada.

Você não tem garantia de que a interface não será exibida se o conjunto de regras iptables não tiver sido aplicado corretamente (ou de todo).

Exemplo:
chkconfig: 2345 08 92
Esta linha indica que o serviço em questão estará ativo nos níveis de execução 2, 3, 4 e 5 e começará em 8 e em 92. Qualquer coisa com um valor "start" maior será iniciado somente após a conclusão desse script, mas esse erro de script é considerado uma conclusão e não impedirá a execução de scripts downstream.

Observe que esta resposta se aplica ao CentOS 6 e versões anteriores, não necessariamente ao CentOS 7. Não pesquisei pessoalmente 7 o suficiente para responder a essa pergunta por 7.

John
fonte
11
+1 E ... não olhar na boca um cavalo de presente, porque sua resposta é bastante útil, mas ... Você conhecia alguma maneira padrão de fornecer aos serviços uma ordem de dependência, para que, se alguém falhar no início da cadeia os subsequentes não começam? Ooh- e também se alguém conseguir travar o firewall (de alguma forma) que a interface de rede "cairá com o navio"? Idealmente, eu quero que tudo à prova de falhas, mesmo na rara chance alguém tem um 0 dias de DoS do firewall ...
tiro Parthian
5
Com os scripts de inicialização do SysV (ou seja, CentOS 6 e versões anteriores), não há uma boa maneira de fazer isso. O CentOS 7 faz dependências como você deseja - se B depende de A e A falhar, B não inicia. Para o 7, ver o uso de dependências systemctl list-dependencies --all(eu apenas olhei a página do manual há 30 segundos).
John
Embora essas notícias sejam um pouco decepcionantes (estou com 6 no momento), pelo menos agora eu sei que modificar os scripts de inicialização é um truque aceitável e terrível.
Parthian Shot
5
Tenha muito cuidado ao modificar scripts init - isso pode causar alarmes falsos em qualquer software de detecção de intrusão que você possa ter, e as modificações serão substituídas se o initscriptspacote for atualizado (por exemplo, uma versão de errata). Eu realmente não recomendo fazer isso.
John
Ainda não configurei um IDS, portanto, os alarmes falsos não são um problema no momento (o servidor ainda não está ativo e sei que não estou pronto para implantar; essa questão faz parte da minha preparação. Mas eu vou colocar no HIDS). Terei o maior cuidado possível e, se houver uma maneira de não envolver a modificação manual de partes principais da configuração do init, eu definitivamente estou fazendo isso.
Parthian Shot
1

Você também pode usar a opção ifup-post nos centos:

/ etc / sysconfig / scripts de rede / ifup-post

Chamado quando qualquer dispositivo de rede, EXCETO um dispositivo SLIP, é ativado. Chama / etc / sysconfig / network-scripts / ifup-routes para exibir rotas estáticas que dependem desse dispositivo. Chama / etc / sysconfig / network-scripts / ifup-aliases para criar aliases para esse dispositivo. Define o nome do host se ainda não estiver definido e um nome de host pode ser encontrado para o IP desse dispositivo. Envia o SIGIO para todos os programas que solicitaram notificação de eventos da rede.

Pode ser estendido para corrigir a configuração do serviço de nomes, chamar scripts arbitrários etc., conforme necessário.

Este script é executado e, após o acima (ifup-route e ifup-aliases), procura ifup-local

if [ -x /sbin/ifup-local ]; then
   /sbin/ifup-local ${DEVICE}
fi

Portanto, você pode criar este arquivo e verifique se ele chama iptables novamente, por exemplo, usando iptables-restore:

iptables-restore < /etc/sysconfig/iptables
Moti
fonte
1

Um pequeno adendo: para garantir que as regras necessárias existam na próxima vez que você inicializar o servidor, salve-o com

sudo sh -c "iptables-save > /etc/iptables.rules"
manu
fonte