[Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Sicurezza del sistema: firewall, antispam, antivirus, ssh, patch, bug, ecc.

[Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » martedì 28 aprile 2009, 23:34

Con questo progetto tenterò di dare informazioni e consigli su come rendere più sicuro e virtualmente impenetrabile un sistema pubblico su Internet o raggiungibile da Internet.
Esistono svariati consigli per rendere complicato e virtualmente impossibile un attacco informatico per guadagnare diritti di root su un server o su un sistema pubblico su Internet.

Alcuni consigli generali.

Impostare una password "robusta":
minimo 12 caratteri alfanumerici maiuscoli e minuscoli
minimo un carattere speciale ($%&£ eccetera)
minimo un numero

Impostare un firewall:
vedere i link nella mia firma

Eliminare ogni servizio inutile

Oltre questi suggerimenti, analizzeremo alcune tecniche avanzate di protezione. Una di queste è il "Port Knocking". Vediamolo nel dettaglio.

Port Knocking


[ Descrizione teorica ]
In informatica, il port knocking è un sistema per aprire delle porte su un firewall dall'esterno inviando tentativi di connessione ad una sequenza prestabilita di porte chiuse; una volta che ciò sia stato fatto le regole del firewall vengono aggiornate dinamicamente per consentire all'host che ha inviato la giusta sequenza di connettersi alla porta voluta.

Questo scopo viene ottenuto principalmente impiegando un demone che controlli continuamente i log del firewall in cerca della sequenza corretta e in tal caso ne modifichi la configurazione, ma si può usare anche uno sniffer che esamini direttamente i pacchetti ricevuti, usando in questo caso delle porte già aperte su cui ricevere la bussata. L'utente invece utilizzerà un piccolo programma, che può essere un semplice script netcat o un ping modificato sino ad un generatore di hash, da lanciare prima della normale connessione alla macchina di destinazione.

Il port knocking viene frequentemente impiegato per consentire l'accesso sulla porta TCP 22, usata da SSH, in quanto questo servizio è spesso l'obiettivo di attacchi a forza bruta in seguito a port scan. La bussata è analoga ad una stretta di mano segreta e può consistere in qualsiasi quantità di pacchetti TCP, UDP, ICMP diretti a porte numerate sulla macchina di destinazione. La complessità della bussata può variare da una semplice lista di porte da contattare sequenzialmente ad uno schema temporizzato che discrimini l'indirizzo IP e impieghi tecniche crittografiche.

Molte implementazioni sono vere e proprie macchine a stati che consentono di non rivelare alcuna informazione circa lo stato attuale, in altre parole se la parte iniziale della bussata è stata ricevuta correttamente, mentre quella finale no, l'utente non ha nessun modo di saperlo in quanto l'unico effetto osservabile è l'eventuale apertura della porta a cui si vuole connettere quando la sequenza inviata è corretta.

(Tratto da Wikipedia: [url=http://"http://it.wikipedia.org/wiki/Port_knocking"]http://it.wikipedia.org/wiki/Port_knocking[/url] )

[ Descrizione del progetto ]
The PortKnockO Project is composed of two parts: an iptables module (user space) and a netfilter module (kernel space). The first one is an iptables extension, and the other one is a netfilter extension.

Both modules are used to implement Port Knocking, a stealthy system for network authentication across closed ports. For instance, this can be used to avoid brute force attacks to ssh or ftp services.


Il progetto PortKnocking è composto da due parti: un modulo iptables (user space) e un modulo netfilter (kernel space). Il primo è un'estensione di iptables e l'altro di netfilter.
Ambo i moduli sono usati per implementare il "Port Knocking", un sistema "sthealt" per l'autenticazione via network attraverso porte chiuse (dal firewall). Per esempio, questo può essere usato per eliminare attacchi brute force al servizio ssh o ftp.

[ Installazione ]
Anonymous SVN Access via SVN:
Codice: Seleziona tutto
svn checkout svn://svn.berlios.de/portknocko/trunk

Comandi (da consolle)
Codice: Seleziona tutto
# cd portknocko
# ~/portknocko/cd iptables
# ~/portknocko/iptables/make clean
# ~/portknocko/iptables/make
# ~/portknocko/iptables/make install

# cd ../kernel
# ~/portknocko/kernel/make clean
# ~/portknocko/kernel/make
# ~/portknocko/kernel/make install

# depmod -Ae


Se usate "insmod ./ipt_pknock.ko", dovreste prima eseguire "modprobe cn" per caricare il connettore netlink!!

Potrebbero mancarvi delle dipendenze...se non riuscite a compilare correttamente i moduli, potete provare installando o aggiornando i seguenti pacchetti (uno alla volta, finchè riuscite a compilare):
  • iptables (versione 1.4)
  • iptables-dev (versione 1.4)
  • linux (ultima disponibile)
  • linux-source (ultima disponibile)
  • linux-headers (ultima disponibile)
  • kernel-source (ultima versione disponibile per la vostra versione)
I primi tre potrebbero essere indispensabili, dato che si tratta di compilare due moduli per iptables e per il kernel, gli altri sono da provare solo se non bastassero i primi tre.
ATTENZIONE: Se dovete arrivare fino all'installazione dei sorgenti del Kernel, dovete anche compilarli (ma non installarli!!). Seguite le procedure specifiche per la vostra distribuzione!
Per installare correttamente il tutto dovete aggiornare all'ultima versione iptables, oppure cercare una versione di PortKnocking più "vecchia" (in base alla versione di iptables che avete installata).

Fatta la compilazione non resta che "abilitare" il sistema di PortKnocking:
Codice: Seleziona tutto
# iptables -P INPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -A INPUT -p tcp -m state --state NEW
      -m pknock --knockports 2002,2001,2004 --name SSH
      -m tcp --dport 22 -j ACCEPT

Codice: Seleziona tutto
$ telnet yourserver 2002 # first knock
$ telnet yourserver 2001
$ telnet yourserver 2004 # last knock

$ ssh user@yourserver

Opzioni:
Codice: Seleziona tutto
[--time seconds]      -> max time between knocks.
[--strict]           -> if the peer fails one knock during the
                  sequence, it must start over.


Ovviamente conviene cambiare le porte di Knocking con altre a scelta vostra ;)
Quella spiegata fin'ora è la via a "una regola"...ne esistono altre e potete anche usare un sistema "multiplo", ma questo è lasciato alla vostra esperienza e competenza.
Per una descrizione completa (in inglese) vi rimando al sito ufficiale
[url=http://"http://developer.berlios.de/project/showfiles.php?group_id=7093"]http://developer.berlios.de/project/showfi...p?group_id=7093[/url]

Buone "bussate" :)
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » martedì 28 aprile 2009, 23:37

Sul kernel attuale (2.6.22) non funziona più quanto descritto sopra...ho provato a ricompilare tutto il possibile (iptables, kernel, moduli eccetera) ma nulla da fare...allora ho cercato alternative e ne ho trovata una ottima e più modulare.

knockd is a port-knock server. It listens to all traffic on an ethernet (or PPP) interface, looking for special "knock" sequences of port-hits. A client makes these port-hits by sending a TCP (or UDP) packet to a port on the server. This port need not be open -- since knockd listens at the link-layer level, it sees all traffic even if it's destined for a closed port. When the server detects a specific sequence of port-hits, it runs a command defined in its configuration file. This can be used to open up holes in a firewall for quick access.


knockd è una server bussa-porta. Ascolta tutto il traffico su una interfaccia ethernet (o PPP), cercando speciali sequenze di "bussate" di porta. Un client esegue queste bussate inviando un pacchetto TCP (o UDP) a una porta sul server. Questa porta non deve essere aperta - knockd ascolta al livello dello strato di collegamento, vede tutto il traffico, anche se è destinato a una porta chiuso. Quando il server rileva una specifica sequenza di "bussate", esegue un comando definito nel suo file di configurazione. Questo può essere usato per aprire porte in un firewall per un rapido accesso (o per eseguire un comando).


Questa la configurazione attuale del demone sul server:
Codice: Seleziona tutto
cat /etc/knockd.conf
[options]
      logfile = /var/log/knockd.log

[opencloseSSH]
      sequence   = porta1, porta2, porta3
      seq_timeout = 5
      #tcpflags   = syn,ack
      start_command    = /etc/init.d/ssh start
      cmd_timeout = 5
      stop_command    = /etc/init.d/ssh stop

ove porta1:porta3 sono ovviamente numeri di porte a scelta su cui si deve bussare.
Questa implementazione permette di far partire il server ssh e, dopo 5 secondi, di fermarlo (ovviamente il firewall DEVE permettere il traffico related e established, altrimenti appena il server ssh viene spento verrete buttati fuori dal server ;) )

Anzichè un comando specifico, potete applicare regole sul firewall (es: /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT). Sta a voi scegliere e sperimentare.

Sito ufficiale: [url=http://"http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/index"]http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/index[/url]
Il pacchetto è disponibile in .deb, .rpm e tarball source.
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » martedì 28 aprile 2009, 23:45

Securizzare SSH con chiavi pubbliche e private

Per rendere ancora più sicuro il nostro server SSH, possiamo fare in modo che ci si possa connettere solo con una coppia di chiavi pubbliche/private. Così facendo rendiamo inutile ogni tentativo brute force (infatti disabiliteremo l'accesso via password)

La prima cosa da fare è creare la propria chiave pubblica.
Per farlo, basta lanciare il terminale sul proprio computer (non sul server al quale ci si vuole collegare) e andare alla directory .ssh della propia home, ossia /Users/vostro_utente/.ssh e qui digitare il comando:

    ssh-keygen -t dsa -f /Users/vostro_utente/.ssh/id_dsa -P 'vostra_passphrase'

Ovviamente occorre sostituire vostro_utente con il nome opportuno, sia nel path che nel comando.
Una nota a parte riguarda invece la parte finale del comando 'vostra_passphrase': occorre sostituire la parola 'vostra_passphrase' (deve stare tra le virgolette) con una parola facile da memorizzare, una sorta di password che sarà la stessa per tutti i server su cui sarà piazzata la chiave pubblica. E' possibile anche lasciarla vuota, ossia due virgolette senza nemmeno uno spazio in mezzo, se siete amanti del pericolo, utilizzando il comando di cui sopra in questa forma:

    ssh-keygen -t dsa -f /Users/vostro_utente/.ssh/id_dsa -P ''

in questo caso al collegamento con i server su cui è piazzata la chiave pubblica avverrà senza la richiesta di nessuna password o passphrase. Fatelo solo a vostro rischio e pericolo, se siete assolutamente sicuri che nessuno possa usare il computer a vostra insaputa per andare a far danni sui server remoti.
A questo punto sono stati generati due documenti, la vostra chiave privata, id_dsa che non dovete assolutamente toccare, e la chiave pubblica id_dsa.pub, che ora andremo a piazzare sui server remoti che ci interessano.
Una volta copiato il documento id_dsa.pub sui server interessati, occorre inserire la propria chiave pubblica al posto giusto, nella cartella .ssh della home dell'utente che intendiamo utilizzare sul server remoto, assieme a quelle eventualmente già presenti di altri utenti.
Ad esempio, se vogliamo utilizzare l'utente root su un server Linux, la chiave pubblica dovrà essere inserita in /root/.ssh. Nell'utente pippo su di un server Mac OS X, il percorso sarà invece /Users/pippo/.ssh

Tutto fatto, se ora provate a collegarvi al vostro server con il classico comando ssh pippo@nome_server.dom vi verrà chiesta la vostra passphrase, più semplice da ricordare, o anche nulla se l'avete lasciata vuota.

Facendo così però l'accesso via password è ancora attivo. Dobbiamo disabilitarlo. Ecco come.

Aprite il file /etc/ssh/sshd_config e assicuratevi che ci siano le seguenti righe. Aggiungetele se mancano o modificatele se già presenti:
Codice: Seleziona tutto
RSAAuthentication yes
PubkeyAuthentication yes
X11Forwarding no
UsePAM yes
IgnoreUserKnownHosts no
PasswordAuthentication no
GatewayPorts no
AllowTcpForwarding no
KeepAlive yes
DenyUsers utenti_senza_accesso_ssh #separati da spazio

Questo, con l'aggiunta del Port Knocking rende quasi impossibile "sfondare" un server SSH.

Ciaooooo
Ultima modifica di Ptah il martedì 28 aprile 2009, 23:48, modificato 1 volta in totale.
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » martedì 28 aprile 2009, 23:47

IN LAVORAZIONE. TRADUZIONE A BREVE

BFD -- Brute Force Detection

BFD è uno script per shell che analizza i log di sicurezza e rintraccia i fallimenti di autenticazione. E' un sistema bruteforce detection senza essere molto complesso e lavora in congiunzione con un APF (Advanced Policy-based Firewall, descritto più sotto)


## Recupera gli ultimi source e scompattali.
# cd /usr/src/utils
# wget http://rfxnetworks.com/downloads/bfd-current.tar.gz
# tar xfz bfd-current.tar.gz
# cd bfd-*
# ./install.sh

Leggi il README e edita il file di configurazione, che si trova in  /usr/local/bfd/conf.bfd.
Trova la riga ALERT="0" e modificala in ALERT="1"
Trova EMAIL_USR="root" e sostiuiscila con EMAIL_USR="username@yourdomain.com"

Modifica il file /usr/local/bfd/ignore.hosts e aggiungi il tuo IP pubblico (o il range di IP pubblici). BFD usa APF e quindi sovrascriverà il file allow_hosts.rules, quindi è importante che tu aggiunga il tuo IP per prevenire che ti auto-escludi dal sistema.

## Avvia il programma
#  /usr/local/sbin/bfd -s


APF -- Advanced Policy-based Firewall

Get the latest source from the rfxnetworks, and install the software.

# cd /usr/src
# mkdir utils
# cd utils
# wget http://rfxnetworks.com/downloads/apf-current.tar.gz
# tar xfz apf-current.tar.gz
# cd apf-*
# ./install.sh

Read the README.apf and README.antidos for configuration options. Edit the /etc/apf/conf.apf and modify the following lines to your need.

DEVEL_MODE="0"
IG_TCP_CPORTS="21,22,25,53,80,110,143,443,3306"
IG_UDP_CPORTS="53,111"
USE_AD="1"

By default, APF is setup to run in development mode which flushes firewall rules every 5 minutes. Running in development mode defeats the purpose of running APF, as it will automatically flush every 5 minutes. Configure the Ingress (inbound) TCP and UDP ports that need to be opened. Finally, enable AntiDos by setting USE_AD="1".

Edit the /etc/apf/ad/conf.antidos as you fit necessary, and start the APF firewall.

# apf --start
Ultima modifica di Ptah il venerdì 1 maggio 2009, 16:45, modificato 1 volta in totale.
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda paper0k » mercoledì 29 aprile 2009, 7:25

Ottimo Ptah! ;)
Ma perché non farci una paginetta nel wiki? Nel forum si potrebbe "perdere" sommerso da discussioni di supporto...
Chiunque può essere ragionevole, ma esser sani di mente è raro (Oscar Wilde)
Wiki|Blog|Twitter|Identi.ca|last.fm
Avatar utente
paper0k Maschile
Rampante Reduce
Rampante Reduce
 
Messaggi: 7216
Iscrizione: ottobre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda pierba » mercoledì 29 aprile 2009, 7:34

Evidenzio per qualche tempo.

ciao
Pietro pagina personale - Avete domande sul forum? Leggendo le FAQ: potreste trovare la risposta.
La conoscenza deve essere collettiva, quindi, come da regolamento (Sez. II punto 15) i messaggi personali contententi richieste di assistenza tecnica verranno ignorati.
Avatar utente
pierba Non specificato
Tenace Tecnocrate
Tenace Tecnocrate
 
Messaggi: 14531
Iscrizione: febbraio 2005

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » martedì 12 maggio 2009, 23:28

Lavoro su un Wiki, raccolgo le idee e lo metto :)
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda toma.luca95 » sabato 21 maggio 2011, 12:18

Ma si può anche mettere un'azione "bussata" fallita? Del tipo redirect su una macchina virtuale apposta per far si che l'attacco vada a quella e quindi sia inutile?
toma.luca95 Non specificato
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 750
Iscrizione: febbraio 2010

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda Ptah » sabato 21 maggio 2011, 14:01

Ciao.
Beh non ha senso fare una cosa del genere, sai quante sono le possibili diverse combinazioni di 4 porte su 65000? Tante :D
Inoltre, seal portknocking aggiungi un firewall proattivo (tipo APF) e imposti il rabhit su alcune porte "prossime" a quelle da bussare, vai sicuro che non c'è bisogno.

Ciao :)
Non sono chi dico di essere ;) || Problema risolto?Metti [RISOLTO] nel titolo ;)
Script per Firewall Iptables
Guida Php ufficiale (in inglese)
Ptah Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1269
Iscrizione: dicembre 2006

Re: [Progetto] Progetto sicurezza. Tecniche e consigli per rendere sicuro un sistema pubblico

Messaggioda toma.luca95 » sabato 21 maggio 2011, 15:19

Bè, in effetti basta fare quelle li vicino...buono...così anche se uno riesce ad avvicinarsi rimane fregato...
toma.luca95 Non specificato
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 750
Iscrizione: febbraio 2010


Torna a Sicurezza

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 1 ospite