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
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: \
Faça isso manualmente
sudo ss -tuanp
ou
sudo netstat -tuanp
-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve
-p - show process name
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.
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
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 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.
Comumrudimentariptables
firewall,vocêprovavelmentedesejarácumprimentá-lousandoumaferramentacomo
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.
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.
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. :)
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 .