><>
<>
= Introduzione =
Le tecniche di '''Port knocking''' permettono di aumentare considerevolmente la sicurezza di un server che deve garantire alcuni servizi non permanenti attraverso IP pubblici. Se s'inviano dei pacchetti a delle porte prestabilite sulle quali il demone è in ascolto e nel caso la sequenza sia corretta, questi attiverà un comando che potrà eseguire delle regole di [[Sicurezza/Iptables|iptables]] che apriranno le porte necessarie alla connessione. Il vantaggio è notevole in quanto il server potrebbe rimanere sempre in ''stealth'' e aprire le porte per un determinato servizio solo in caso di necessità.
= Preparativi =
È necessario che il [[Sicurezza/Firewall|firewall]] di sistema Ubuntu [[Sicurezza/Iptables|iptables]] sia configurato e attivo.
= Installazione =
Per utilizzare le tecniche di '''Port knocking''', [[AmministrazioneSistema/InstallareProgrammi|installare]] il pacchetto ''[[apt://knockd|knockd]]''.
= Configurazione knockd =
Per fare in modo che il demone parta all'avvio del computer modificare con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] il file {{{/etc/default/knockd}}} in questo modo:{{{
START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
}}}
{{{#!wiki note
Sostituire '''eth0''' con il nome della propria interfaccia di rete.
}}}
= Configurazione knockd.conf per l'apertura di una sola porta =
Modificare con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] il file {{{/etc/knockd.conf}}} impostandolo come segue:
{{{
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
# Questa è la sequenza delle porte sulle quali knockd rimarrà in ascolto. Di default il protocollo è TCP.
# Quali e quante porte usare è discrezionale.
# sequence = 7000:udp,8000:tcp,9000:udp
# Esempio con sequenza con porte miste udp/tcp
seq_timeout = 30
#Tempo di attesa massimo per completare la sequenza.
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
# Quando la sequenza verrà accettata verrà inserita una regola che aprirà la porta SSH standard.
tcpflags = syn
# Ulteriore filtro, sul tipo di flag del pacchetto inviato alla sequenza di porte.
[closeSSH]
sequence = 9000,8000,7000
# Questa è un'altra sequenza di porte sulle quali knockd rimarrà in ascolto.
seq_timeout = 30
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
# Quando la sequenza verrà accettata verrà inserita una regola che cancellerà quella creata in precedenza.
tcpflags = syn
# Ulteriore filtro, sul tipo di flag del pacchetto inviato alla sequenza di porte.
}}}
La variabile «%IP%» passa alla regola di iptables l'indirizzo che ha effettuato la richiesta di connessione, in questo caso verrà permessa l'apertura della porta SSH discriminando solo l'IP validato.
= Configurazione per l'apertura di una sola porta, per soli esperti =
Un'altra possibilità per usare il demone knockd, utilizzabile '''SOLO se il firewall sul server è configurato per accettare le connessioni "established" e "related"''' alla porta che si vuole aprire (es ssh, 22) è di chiudersi subito dietro la porta appena aperta, per evitare che, restando "aperta", qualche malintenzionato tenti un brute-force al servizio, lanciando uno script anziché impostando delle regole sul firewall.
Per questo scopo il file {{{/etc/knockd.conf }}} può ad esempio essere modificato, con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]], come segue (per spiegazioni sul significato delle opzioni vedere la sezione precedente):
{{{
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 30
start_command = /etc/init.d/ssh start
tcpflags = syn
cmd_timeout = 5
stop_command = /etc/init.d/ssh stop
# Dopo cmd_timeout secondi, viene eseguito il comando stop_command}}}
Ricordiamo ancora che '''è indispensabile''' che il firewall sul server accetti le connessioni "related" ed "established" altrimenti la sezione "stop_command", appena sarà eseguita, vi chiuderà la connessione SSH senza quindi avere possibilità di connettervi al server!
{{{
root@server2:~# iptables -nL | grep ":22"
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22 dpts:513:65535 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65535 dpt:22 flags:0x17/0x02 state RELATED,ESTABLISHED
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:22 state ESTABLISHE
root@server2:~# }}}
= Configurazione knockd.conf per l'apertura di più porte =
Nell'esempio sopra esposto si è visto come aprire una sola porta. Se l'esigenza fosse però quella di aprirne di più procedere creando più sessioni «[openServizio]» e «[closeServizio]». Questo sistema risulta però scomodo per ovvi motivi, per ottenere lo stesso risultato è consigliato usare degli script.
Modificare con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] il file {{{/etc/knockd.conf}}} impostandolo come segue:
{{{
[options]
logfile = /var/log/knockd.log
[open]
sequence = 7000,8000,9000
seq_timeout = 30
tcpflags = syn
command = sh /etc/open_ports %IP%
[close]
sequence = 9000,8000,7000
seq_timeout = 30
tcpflags = syn
command = sh /etc/close_ports %IP%
}}}
In questo caso invece di eseguire direttamente iptables si richiamano due script passando il parametro «%IP%» alla variabile speciale «$1».
== Esempio di script open_ports ==
Modificare con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] il file {{{/etc/open_ports}}} impostandolo come segue:
{{{
#! /bin/sh
iptables -A INPUT -s $1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 631 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 5125 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 5126 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 8888 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 10000 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 81 -j ACCEPT
}}}
== Esempio di script close_ports ==
Modificare con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] il file {{{/etc/close_ports}}} impostandolo come segue:
{{{
#! /bin/sh
iptables -D INPUT -s $1 -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 21 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 631 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 5125 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 5126 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 8888 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 10000 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 81 -j ACCEPT
}}}
= Client =
Di seguito viene mostrato come configurare i client a dipendenza del sistema operativo utilizzato.
== Linux ==
Scaricare i sorgenti da [[http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki|questo indirizzo]] all'interno della propria '''Home''' e [[AmministrazioneSistema/FormatiDiCompressione#Decomprimere|scompattarli]], entrare nella cartella {{{knock-0.x/src}}} e digitare all'interno di una finestra di [[AmministrazioneSistema/Terminale|terminale]] il seguente comando:{{{
gcc -o knock knock.c
}}}
Sempre da una finestra di terminale digitare il [[#comando_client|comando per la connessione]] oppure seguire i passaggi per creare un [[#alias_linux|alias di connessione]]
== Windows ==
Scaricare da [[http://www.zeroflux.org/knock/files/knock.exe|questo indirizzo]] e digitare all'interno di una finestra DOS il [[#comando_client|comando per la connessione]] tralasciando la prima parte «./»
== OSX ==
Consultare la [[http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki|relativa pagina]].
<>
= Connessione =
Per effettuare la connessione digitare il seguente comando all'interno di una finestra di terminale:
{{{
./knock -v ip_host port1 port2 port3 port...
}}}
Nel caso una porta sia configurata tramite il protocollo UDP, usare la sintassi «port:udp»
<>
= Connessione usando un alias (solo linux) =
Creare un alias aggiungendo la seguente riga al file ''.bash_aliases'' nella home dell'utente e creare successivamente il file "connectServer":
{{{
utente@client:/home/Scrivania/# cd
utente@client:~# vi .bash_aliases}}}
Contenuto del file ~/.bash_aliases:
{{{
alias ll='ls -l'
alias la='ls -a'
alias count='ll | wc -l'
alias SshServer='~/connectServer' # Parte da aggiungere
}}}
Contenuto del file ~/connectServer
{{{
# ip_del_server va sostiuito con l'ip o il dns name del server a cui connettersi (es: 192.168.0.2 oppure www.myserver.com)
telnet ip_del_server 7000
telnet ip_del_server 8000
telnet ip_del_server 9000
# Attesa di due secondi prima di effettuare la connessione: il server potrebbe metterci del tempo prima di avviare il demone SSH!
sleep 2
# Da abilitare se si vuole effettuare la connessione con utente root
# ssh -l root ip_del_server
ssh ip_del_server
}}}
Salvare il file connectServer e assicurarsi che sia eseguibile:
{{{
utente@client:~# chmod +x connectServer}}}
A questo punto per connettersi al server (dopo aver riaperto una shell, altrimenti il nuovo alias non sarà riconosciuto) basterà digitare quanto segue:
{{{
utente@client:~# SshServer}}}
= Ulteriori risorse =
* [[http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki|Sito ufficiale del progetto]]
* [[http://www.portknocking.org/|Port knocking in perl]]
* [[http://portknocko.berlios.de/|Sito ufficiale del progetto PortKnockO]]
* [[http://www.openskill.info/infobox.php?ID=694|Documentazione sui TCP Flag ]]
----
CategorySicurezza