iptables script do consultor de regras

9

Existe um servidor sem qualquer defesa iptables : ACCEPT all..

Poderia haver aplicativos personalizados neste servidor.

Se precisarmos endurecer esse servidor (portanto, negar tudo, e deixar apenas o que é necessário para os aplicativos) com regras rígidas do iptables, precisamos descobrir manualmente qual aplicativo usa qual dst/src port/protocol e então temos que escrever as regras do iptables para eles ..

A questão : existem scripts que podem ajudar a coletar essas informações de um computador em execução? (dos logs?) - E gerando automaticamente as regras do iptables?

Como se houvesse o audit2allow on SELinux . Apenas por iptables !

A máquina não pode ter nenhuma interrupção!

Ex .: o script "MAGIC" deve rodar uma semana / mês na máquina, coletando informações e, depois de uma semana / mês, o script será capaz de produzir um arquivo de regras do iptables que possamos usar.

Muitas pessoas podem entrar nesta situação (como fortalecer um servidor em relação ao iptables). E seria ótimo se houvesse um script / solução que pudesse fazer isso: \

    
por evachristine 03.07.2014 / 16:52

7 respostas

2

Faça isso manualmente

sudo ss -tuanp

ou

sudo netstat -tuanp

Explicação:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name
    
por 04.07.2014 / 01:42
1

Execute tcpdump na máquina por aproximadamente uma semana para capturar o tráfego médio. Então você pode navegar pelo tráfego usando o wireshark mais tarde para ver quais portas estão sendo usadas.

O comando para isso seria tcpdump -i <interface> -s 65535 -w <some-file>

Você pode mapear isso de volta usando netstat -tuanp para ver quais PIDs / aplicativos estão usando quais portas.

Teoricamente, isso pode ser roteirizado.

    
por 07.07.2014 / 14:58
1

Você pode começar com um modelo muito básico como link , que só permite ssh e ping, e adiciona qualquer coisa mais manualmente.

um script rápido para gerar regras de iptables para sua aplicação escutando na interface pública (0.0.0.0) / tcp

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

você também pode usar o iptables -I INPUT <number> para injetar as regras em um local específico, que você pode listar com iptables -nvL --line-numbers INPUT

    
por 10.07.2014 / 13:55
1

Infelizmente, não existe nenhum script desse tipo que possa ser executado em um modo de aprendizado ou modo passivo registrando todo o uso da rede, obtendo seus resultados e gerando um firewall real usando iptables de seus registros.

Sua melhor aposta será começar simples e continuar continuamente adicionando as várias peças à medida que você começa a entender completamente quais serviços seu sistema está fornecendo. Você precisará usar ferramentas como netstat para ver quais portas estão sendo usadas para os vários serviços hospedados, bem como quais endereços IP estão acessando-os.

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

OBSERVAÇÃO: Acima, você pode ver quais serviços eu tenho em execução em um servidor que está aceitando conexões TCP, ou seja, eles estão "ouvindo" conexões em várias portas.

Não é mais inteligente começar com coisas como SSH (porta 22) e HTTP (porta 80), se elas são típicas do seu sistema, então eu faria esses tipos de serviços em massa de uma só vez. Para outros serviços, como LDAP ou NIS, você pode querer fazer isso de uma maneira mais controlada, certificando-se de que as coisas não sejam interrompidas quando você as introduzir.

Ferramentas como FireHOL , Firewall Builder (fwbuilder), e eztables podem ser úteis ao atacar este projeto, já que eles fornecem uma boa camada de abstração de ter que construir regras personalizadas de iptable manualmente, o que pode ser complicado.

FireHOL

FireHOL is a language (and a program to run it) which builds secure, stateful firewalls of any complexity from easy to understand, human-readable configurations.

exemplo

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder is a unique graphical firewall tool that allows the user to create objects and then drag and drop those objects into firewalls, to build a powerful security system for a single PC or a network of PCs. Fwbuilder supports a wide range of firewalls (Cisco ASA/PIX, Linux iptables, FreeBSD's ipfilter, OpenBSD's pf, and more), so its rules can be deployed on multiple platforms. Let's take a look at using Fwbuilder on Linux, which might just become a life-long affair with a powerful security system.

exemplo

eztables

Eztablesallowsyoutoquicklyconfigureafirewallwithoutevertouchingiptables.Thefirewallrulesyntaxisdesignedtobeeasytoreadandtoapply.

ThisishowyouallowtheentireinternettoaccessyourwebserveronTCP-port80:

allow_inany$eth0any80/tcp

Eztablesisdesignedtobesimple,yetpowerful.Itdoesn'tmatterifyouwanttoprotectyourlaptop,aresettingupahomerouter,orbuildingacompanyfirewall.

UsandooFail2Ban

Comumrudimentariptablesfirewall,vocêprovavelmentedesejarácumprimentá-lousandoumaferramentacomo Fail2Ban .

trecho

Fail2ban scans log files (e.g. /var/log/apache/error_log) and bans IPs that show the malicious signs -- too many password failures, seeking for exploits, etc. Generally Fail2Ban is then used to update firewall rules to reject the IP addresses for a specified amount of time, although any arbitrary other action (e.g. sending an email) could also be configured. Out of the box Fail2Ban comes with filters for various services (apache, courier, ssh, etc).

O uso de ferramentas como essa ajudará a limitar a exposição que seu sistema terá que suportar à medida que você continuar a endurecê-lo. Mesmo depois de se convencer de que seu sistema foi endurecido, talvez você ainda queira continuar usando o Fail2Ban como parte de suas medidas de segurança.

Referências

por 12.07.2014 / 10:53
0

Use regras de iptable para registrar as novas conexões, que também farão o login do udp.

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

Você pode especificar diferentes --log-level para ter os logs em outro arquivo que não / var / log / messages (você terá que configurar o daemon syslog).

Acho que você deve ler os logs principais do aplicativo, pois alguns servidores têm uma atividade muito periódica, como meio-dia, fim de semana, fim de mês (trimestre, ano) para que você não perca uma importante atividade de rede do servidor.

Como o servidor é crítico, torna a matriz de fluxo de rede do servidor em uma boa planilha (fonte ip, ip dest, protocolo, porta, aplicativo) que ajudará você a construir as regras.

    
por 07.07.2014 / 18:46
0

Eu sei que isso não é um script e não é uma resposta à pergunta do OP, mas é uma idéia minha que desejo compartilhar com o OP.

Eu tenho todas as portas de escuta com:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

Talvez isso possa deixar você mais perto de escrever seu próprio roteiro. :)

    
por 09.07.2014 / 21:36
0

Você pode começar com algo assim:

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p  --dport  -j ACCEPT # !'

e depois acompanhá-lo com

iptables -P INPUT DROP

ou

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

O que a primeira linha faz é usar o netstat para listar os processos de escuta e suas portas. Em seguida, ele gerará linhas "iptables" para permitir cada uma dessas conexões de entrada. A pequena substituição de regex de sed foi customizada para a saída do netstat no meu servidor, então pode requerer alguns ajustes para você. Quando funciona, você deve acabar com algo parecido com:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

Duas coisas importantes a serem observadas:

1) Essas regras não fazem nada para você até que você coloque uma linha DROP ou REJECT no final ou faça com que a política padrão para pacotes não correspondidos. Estas regras permitem pacotes, o que é discutível, se a política padrão permitir algo que não seja compatível.

2) Essas regras são ambivalentes sobre o IP source . A partir do seu post original, parece que você quer permitir que todos os seus clientes usem o servidor e, em seguida, examine os logs para obter os IPs de source com as portas de destino. Eu não sei de uma ferramenta para fazer isso, então este script irá apenas impedir que pessoas façam novos serviços no seu servidor que escutem em outras portas ... o que é algo .

    
por 01.06.2017 / 18:40