Buone regole di avvio per iptables per un server web?


12

Sto installando un nuovo server centos 5.4 e vorrei avere una serie di regole pulite per l'avvio di mu iptables.

Quali sarebbero le buone regole per cominciare?

È un buon punto di partenza:

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Per cosa è questa regola:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

AGGIORNARE :

Sarà un web server con FTP (richiesto), apache, SSH, mysql.


Uso questa semplice regola .... Chiudi tutto, lavora all'indietro e apri ciò che è necessario. Per un server Web, la porta 80/443 è in genere l'unico servizio pubblico. Blocca tutto il resto o limita l'accesso, ad esempio limita ssh a IP specifici o alla rete privata.
jeffatrackaid,

Risposte:


13

Le tue regole IPTables sembrano essere per lo più appropriate per il tuo server. Ma suggerirei un paio di possibili modifiche:

  • A meno che non sia necessario consentire l'accesso a SSH, MySQL e FTP da tutta Internet, sarebbe molto più sicuro utilizzare l'opzione "--source" per limitare l'accesso a tali porte solo da determinati indirizzi IP approvati. Ad esempio, per consentire l'accesso SSH solo dall'indirizzo IP 71.82.93.101, cambieresti la quinta regola in 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Probabilmente dovrai aggiungere una regola separata per ogni singolo indirizzo IP che desideri consentire, vedi questa domanda per maggiori informazioni su: iptables IP multipli di origine .

  • A meno che questa macchina non stia eseguendo un server DNS, probabilmente vorrai bloccare l'accesso alla porta "dominio" (53). Per fare ciò, basta rimuovere la riga 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Questo dovrebbe anche rispondere alla tua ultima domanda, BTW.) Se stai effettivamente eseguendo un server DNS, tuttavia, lascia questa regola in atto.

  • Se è necessario consentire l'accesso client MySQL remoto sulla rete, è necessario aggiungere la riga "iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT" per aprire l'accesso esterno alla porta MySQL standard . Ma NON farlo a meno che non sia veramente necessario - se hai solo bisogno dell'accesso MySQL locale (per un'app PHP in esecuzione su Apache, diciamo), non è necessario fornire l'accesso MySQL remoto. E a meno che tu non voglia rischiare di essere violato, se apri la porta 3306 alla rete, assicurati di aver bisogno di password complesse per tutti gli account utente MySQL e che i pacchetti del tuo server MySQL siano aggiornati.

  • Uno dei tuoi commenti ("Consenti servizi ssh, dns, ldap, ftp e web") menziona i servizi LDAP, ma non esiste una regola del genere nella tua configurazione. Questo mi succede molto quando copio una configurazione di esempio e la modifico. Non influirà sulla funzione, ma riparerei il commento, poiché i commenti fuorvianti possono causare indirettamente confondendo te o un altro amministratore in futuro.

Nella mia esperienza, è difficile trovare un set perfetto di regole IPTables, ma penso che tu sia decisamente sulla strada giusta. Inoltre, buona fortuna con ulteriori informazioni su IPTables: queste regole possono sembrare inizialmente complesse, ma è un'abilità molto utile per qualsiasi amministratore di sistema Linux.


1
Invece di consentire l'accesso remoto a MySQL attraverso il firewall, puoi semplicemente assicurarti che chiunque abbia bisogno di accedere al server MySQL abbia il diritto di far avanzare la porta SSH.
ptman,

I port forwarding SSH rappresentano una potenziale alternativa all'apertura della porta e al blocco delle autorizzazioni MySQL. Ma a meno che non abbia a che fare con dati sensibili e / o non sia un target di alto profilo (che renderebbe utili le funzionalità di crittografia di SSH), non vedo il vantaggio. Dopotutto, il tunneling SSH ha i suoi svantaggi, tra cui: problemi di installazione / configurazione; aumento dell'utilizzo della CPU e limitazione della larghezza di banda (a causa della dimensione del buffer statico di OpenSSH). E se non volesse che tutti i suoi client MySQL remoti abbiano accessi locali?
Ryan B. Lynch

Per quanto riguarda i commenti che non corrispondono alle regole, le regole ICMP consentono traceroute, scoperta di PMTU e altri messaggi utili, ma non consentono ping (richiesta di eco e risposta di eco).
Gerald Combs

Gerald, è una buona cattura, non me ne sono nemmeno accorto. Dovrebbe probabilmente cambiare il commento per notare che il ping NON è permesso, oppure dovrebbe aggiungere regole che consentano il traffico di richieste / risposte dell'eco ICMP.
Ryan B. Lynch

4

Sicuramente cerca di limitare anche il tuo traffico in uscita.

Ho visto molti casi in cui gli exploit di PHP hanno portato qualcuno a usare 'curl' o 'wget' per recuperare codice dannoso da altrove, quindi eseguirlo sul server per unirsi a una botnet.

Se non ti aspetti che Apache (come esempio) abbia bisogno di parlare con altri siti Web stessi, limita il traffico e risparmia un po 'di dolore lungo la linea!


2

Queste regole sono pronte per essere importate tramite "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

E solo per la cronaca ... dovrebbero essere impostati anche questi criteri predefiniti, SE il precedente iptables-restore non viene utilizzato:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Ho modificato il tuo post - StackOverflow è un formato di domanda / risposta. Si prega di leggere le FAQ: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Ciò introdurrà problemi di prestazioni, poiché la regola con stato viene visualizzata qui per ultima e dovrebbe apparire per prima poiché corrisponde alla maggior parte dei pacchetti.
Michael Hampton

0

Perché consenti ftp e dns? Il tuo server fornisce questi servizi? L'FTP non dovrebbe essere realmente utilizzato, ad eccezione di alcuni casi d'uso molto specifici, utilizzare invece SFTP (non FTPS). Inoltre, perché specificare tutte le altre porte con nomi simbolici e http con 80 numerici? L'hai appena copiato da qualche altra parte? Nessuna copia e avviso compenserà la mancanza di comprensione. Assicurati di comprendere TCP, IP, firewall e i protocolli dei servizi che fornirai.


Non intendo offendere, ptman, ma penso che la tua risposta possa essere vista come un po 'scoraggiante e condiscendente. Inoltre, non stai davvero rispondendo alla domanda. Se il richiedente manca di comprensione, non pensi che sarebbe meglio parlare rispettosamente e dargli un'istruzione specifica sull'argomento?
Ryan B. Lynch

Probabilmente hai ragione. I miei commenti possono sembrare negativi, ma non erano intesi come tali. Stavo cercando di elencare domande che avrebbero innescato processi di pensiero rilevanti. E poiché non conosco il livello base di comprensione, non ho iniziato a scrivere un libro di testo. Ma hai assolutamente ragione sul tono inutile. Fortunatamente hai scritto una risposta molto più utile.
ptman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.