PDA

View Full Version : [IPTABLES] qualche prova ed aiuto


dierre
22-10-2007, 22:54
Volevo scrivere una rule che permetesse l'accesso solo alla porta 80

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -j DROP


questa dovrebbe andare no? Ma ipotizzando che funzioni come dico io, cioè che accetta connessioni solo verso il webserver, che rischi ci sono di avere il server bucato? (ovviamente a parte i problemi possibili che derivano dal webserver stesso)

Mr.Bano
23-10-2007, 01:35
Tanto poi di per se Apache è ottimo, non ha seri problemi e le patch escono in buoni tempi. Di solito i disastri sono lato amministratore causa configurazioni disastrose o codice improbabile caricato sulle pagine web.In linea di massima potresti ritrovarti che ne so... con l' index modificata e un rootkit qua e là.Poi chiaro che dipende da millemila fattori.Se ad esempio tanto per dire una banalità fai girare tutto con privilegi di root non è che agevoli tanto la sicurezza, ma come regola base comunque nega il più possibile, dai i minori privilegi possibili e togli tutto ciò che non è strettamente indispensabile (vari moduli compresi).

dierre
23-10-2007, 10:27
Tanto poi di per se Apache è ottimo, non ha seri problemi e le patch escono in buoni tempi. Di solito i disastri sono lato amministratore causa configurazioni disastrose o codice improbabile caricato sulle pagine web.In linea di massima potresti ritrovarti che ne so... con l' index modificata e un rootkit qua e là.Poi chiaro che dipende da millemila fattori.Se ad esempio tanto per dire una banalità fai girare tutto con privilegi di root non è che agevoli tanto la sicurezza, ma come regola base comunque nega il più possibile, dai i minori privilegi possibili e togli tutto ciò che non è strettamente indispensabile (vari moduli compresi).

certo certo. Io parlavo esclusivamente di danni procurati da una configurazione del genere. L'unico possibile target è il webserver o il firewall stesso no?

ilsensine
23-10-2007, 10:42
Volevo scrivere una rule che permetesse l'accesso solo alla porta 80

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -j DROP


questa dovrebbe andare no?
No così blocchi tutto; ti serve anche:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
(mettilo come prima regola, visto che è quella con match maggiori).
Ma ipotizzando che funzioni come dico io, cioè che accetta connessioni solo verso il webserver, che rischi ci sono di avere il server bucato? (ovviamente a parte i problemi possibili che derivano dal webserver stesso)
1) vulnerabilità di Apache: sono rare, ma periodicamente controlla gli aggiornamenti per la sicurezza
2) vulnerabilità del tuo sito (soprattutto se usi pagine in php o simili)

W.S.
23-10-2007, 11:10
Ricordati anche di settare le policy di default.
Per i rischi di avere il server bucato il discorso è lunghissimo... settare il firewall è molto importante però rimane comunque esposto a bug di sistema, di apache, di tutti i moduli caricati da apache, di tutte le componenti raggiungibili da apache e (come già detto) di tutti i servizi ospitati da apache.

Mr.Bano
23-10-2007, 17:12
Beh nella peggiore dell' ipotesi direi che supponiamo che in qualche modo si prende l' utente apache (come già detto) è già un brutto inizio. Supponiamo sempre poi che in qualche modo riesca a scalare i privilegi...
Diciamo che nella peggiore delle ipotesi il tuo sistema è il suo sistema. Poi come ti dicevo ci sono millemila fattori, magari roba alla 0day, back shell anti firewall e chissà quanto altro...butto proprio lì così alla buona...e poi però di solito non succede tutto questo casino. Cosa può succedere è imprevedibile. Supponi proprio per assurdo domani uscire per Apache il più grande exploit remoto della storia dei webserver... roba peggio di IIS, capisci che crollerebbe tutto in un attimo..
Poi guarda se proprio ci tieni magari metti Apache in chroot che tanto è una cosa semplice da fare e ti da quel pizzico di sicurezza in più.

dierre
23-10-2007, 17:27
No così blocchi tutto; ti serve anche:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
(mettilo come prima regola, visto che è quella con match maggiori).
[...]

Mi spieghi perché serve?
In pratica gli stai dicendo che le connessioni di tipo RELATED e ESTABLISHED le deve accettare giusto? Perché è necessario dirglielo?

PS: grazie agli altri per le risposte, più o meno quelle che presagivo.

ilsensine
23-10-2007, 17:29
Mi spieghi perché serve?
In pratica gli stai dicendo che le connessioni di tipo RELATED e ESTABLISHED le deve accettare giusto? Perché è necessario dirglielo?
...e me lo chiedi? Perché altrimenti tutti i pacchetti in arrivo che non siano destinati alla porta 80 vengono buttati. Ovvero, non puoi neanche aprire connessioni verso l'esterno: tutti i pacchetti di risposta finiscono in /dev/null.

eclissi83
23-10-2007, 17:40
...e me lo chiedi? Perché altrimenti tutti i pacchetti in arrivo che non siano destinati alla porta 80 vengono buttati. Ovvero, non puoi neanche aprire connessioni verso l'esterno: tutti i pacchetti di risposta finiscono in /dev/null.
se non erro, questo e' vero se anche la catena di output e' impostata su DROP...

ad ogni modo io utilizzerei le policy di default e farei un piccolo script:

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

e il resto in ingresso viene buttato su /dev/null, quello in uscita o attraversamento passa liberamente...
ovviamente se si vuole fare qualcosa di piu' carino ed efficiente, vanno usati RELATED ed ESTABLISHED...

ciriciao!

ilsensine
23-10-2007, 17:42
se non erro, questo e' vero se anche la catena di output e' impostata su DROP...
Sì in questo caso sono i pacchetti verso l'esterno che si perdono

ad ogni modo io utilizzerei le policy di default e farei un piccolo script:

iptables -F
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

e il resto in ingresso viene buttato su /dev/null, quello in uscita o attraversamento passa liberamente...
ovviamente se si vuole fare qualcosa di piu' carino ed efficiente, vanno usati RELATED ed ESTABLISHED...
Vanno usati anche se devi connetterti all'esterno da quella macchina. Altrimenti non puoi fare neanche un apt-get update, eh!

dierre
23-10-2007, 17:55
...e me lo chiedi? Perché altrimenti tutti i pacchetti in arrivo che non siano destinati alla porta 80 vengono buttati. Ovvero, non puoi neanche aprire connessioni verso l'esterno: tutti i pacchetti di risposta finiscono in /dev/null.

Pensavo che lo facesse anche senza specificarlo dal momento che la politica iniziale è entra ed esce chiunque vuole.

Tra l'altro non mancherebbe teoricamente anche il loopback in quello che ho scritto io? Ci dovrebbe stare no?

iptables -A INPUT -i lo -j ACCEPT

?

eclissi83
23-10-2007, 18:04
Vanno usati anche se devi connetterti all'esterno da quella macchina. Altrimenti non puoi fare neanche un apt-get update, eh!

io in realta' non li uso e aggiorno tranquillamente i ports...

dierre
23-10-2007, 18:27
Un altra domanda: ho trovato su un sito questo tipo di configurazione sempre per l'allow http


SERVER_IP=”202.54.10.20”
iptables -A INPUT -p tcp -s 0/0 –sport 1024:65535 -d $SERVER_IP –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s $SERVER_IP –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT

Immagino che questo sia un server firewall quindi non è proprio il mio caso, però perché nella chain INPUT usa NEW,ESTABLISHED e niente RELATED?

Mr.Bano
24-10-2007, 04:27
Mah..io invece partirei con un bel drop tolate, input, forward e pure output e poi aggiungerei casomai le regole di accept ad ogni uno.Poi son punti di vista.

Per il loopback sì, metterlo fa la sua porca figura o rischi che i processi locali non vadano, tipo X insomma.. se droppi l' output ricordati di impostarlo tipo a iptables -A OUTPUT -o lo -j ACCEPT.

Poi tanto per dire potresti ad esempio aggiungerei pure lo spoof droppando tutto su 192.168.0.0 o ciò che usi o mettere pure una regola per droppare ogni pacchetto che non inizia con il flag syn a 1 (scansioni varie) tipo con -p tcp ! e loggare il tutto, giusto per renderlo un po' piu' completo.

All' ultima domanda, una regola del genere a te non credo serva comunque magari è una dimenticanza, magari imposta a manina senza moduli o magari molto più probabilmente non gli serve nemmeno per l' uso che fa del sistema tipo un ftp, icmp o altro tanto più che il server teoricamente non dovrebbe essere IL firewall, ma averne uno in più giusto di appoggio che non si sa mai.

EDIT: modificato regola.

W.S.
24-10-2007, 09:40
Mah..io invece partirei con un bel drop tolate, input, forward e pure output e poi aggiungerei casomai le regole di accept ad ogni uno.Poi son punti di vista.
* :)

L'unica precisazione è per la regola del loopback, in OUTPUT non si usa il -i ma il -o ;). Se metti tutte le policy a DROP (consigliato) dovrai o usare la regola che accetta le connessioni richieste/stabilite o mettere una regola in INPUT e una in OUTPUT.

X l'ultima domanda... secondo me non ha molto senso limitare le porte utilizzabili dal client in quel modo, voglio dire, FORSE aiuta a bloccare richieste provenienti da un servizio remoto compromesso (e ripeto, forse) ma se il nostro demone è vulnerabile a quell'attacco lo è anche se proviene da porte alte. Il RELATED in quelle regole andrebbe messo in OUTPUT (la direzione dell'inizializzazione è client->server), il fatto che non ci sia mi lascia qualche dubbio, probabilmente la policy di default è ACCEPT (infatti, come hai notato, manca anche il loopback).

dierre
24-10-2007, 10:17
[...]
Poi tanto per dire potresti ad esempio aggiungerei pure lo spoof droppando tutto su 192.168.0.0 o ciò che usi o mettere pure una regola per droppare ogni pacchetto che non inizia con il flag syn a 1 (scansioni varie) tipo con -p tcp ! e loggare il tutto, giusto per renderlo un po' piu' completo.
[...]

Questa come si scrive?

ilsensine
24-10-2007, 10:27
io in realta' non li uso e aggiorno tranquillamente i ports...
Accettando solo una regola di input con dport 80? Non ci credo. A cosa servirebbe lo stato "established" altrimenti?

W.S.
24-10-2007, 10:38
Pure a me suona strano... non vedo come possa funzionare la connessione con un INPUT DROP senza ACCEPT specifici, sicuro che sia esattamente così e non ci sia anche un INPUT sport 80 ACCEPT?

E per il DNS? Come fanno a passare le risposte?

Mr.Bano
24-10-2007, 17:33
* :)

L'unica precisazione è per la regola del loopback, in OUTPUT non si usa il -i ma il -o ;).

oooops! scusami! ho fatto direttamente un copia e incolla da sopra e mi sono scordato di cambiare la -i, ora modifico il messaggio per non creare confusione :)


Questa come si scrive?

sarà qualcosa tipo:

iptables -A INPUT -s 192.168.0.0/16 -j LOG --log-prefix "Col picchio che mi spoofate!"
iptables -A INPUT -s 192.168.0.0/16 -j DROP
qui puoi sbizzarrirti mettendo anche tipo il loopback, il broadcast e compagnia bella..

e:
iptables -A INPUT -p tcp ! -m state NEW -j LOG --log-prefix "nmap mi fa le pippe!"
iptables -A INPUT -p tcp ! -m state NEW -j DROP

Notare in questo caso come ho utilizzato NEW per specificare che tutte le connessioni devono iniziare con il flag syn attivo, appunto per la regola dello scambio dati con l' host.

ps: quoto W.S. difficilmente puoi interrogare un DNS se hai bloccato anche gli upd verso l' esterno.Certo che ti vada tutto poi ci credo visto che come politica di output hai accept :)

dierre
24-10-2007, 21:01
Per ora ho fatto questo:
iptables -F ###
iptables -P INPUT DROP # Policy di base
iptables -P OUTPUT DROP #
iptables -P FORWARD DROP ###
iptables -A INPUT -i lo -j ACCEPT # Loopback
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Porta 80 - web server
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Adesso mi studio le istruzioni di Bano così le implemento.