<
><> <> = 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