{"id":748,"date":"2018-01-30T20:44:59","date_gmt":"2018-01-31T01:44:59","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/maad\/?p=748"},"modified":"2018-01-30T21:02:26","modified_gmt":"2018-01-31T02:02:26","slug":"reforzando-seguridad-con-port-knocking","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/maad\/2018\/01\/30\/reforzando-seguridad-con-port-knocking\/","title":{"rendered":"Reforzando seguridad con Port Knocking"},"content":{"rendered":"<p>El\u00a0<em>port knocking<\/em>\u00a0(golpeo de puertos)<strong>\u00a0es un mecanismo que permite abrir puertos<\/strong>\u00a0a trav\u00e9s de una\u00a0<strong>serie predefinida de intentos de conexi\u00f3n<\/strong>\u00a0a puertos que se encuentran cerrados.<\/p>\n<p>El protocolo\u00a0<strong>SSH<\/strong>\u00a0suele utilizarse principalmente por administradores para ejecutar comandos de forma remota. Sin embargo, siempre existe\u00a0<strong>el riesgo de exponer un tipo de servicio de estas caracter\u00edsticas<\/strong>\u00a0ya que suelen ser blanco de ataques. De esta manera, existe el\u00a0<em>port knocking<\/em>\u00a0como mecanismo adicional para la protecci\u00f3n de este servicio o incluso otros.<\/p>\n<p>Por ejemplo, cualquiera que tenga un sistema con un servidor SSH expuesto a Internet sabr\u00e1 que no es nada infrecuente encontrar registrados diferentes intentos de intrusi\u00f3n en el sistema (en el\u00a0<code>\/var\/log\/auth.log<\/code>\u00a0en un sistema Debian):<\/p>\n<p style=\"padding-left: 60px\"><em>Oct 19 09:31:49 darkstar sshd[13481]: Invalid user fluffy from 202.102.XX.XX<\/em><br \/>\n<em>Oct 19 09:32:02 darkstar sshd[13493]: Invalid user oracle from 202.102.XX.XX<\/em><br \/>\n<em>Oct 19 09:32:08 darkstar sshd[13500]: Invalid user www from 202.102.XX.XX<\/em><br \/>\n<em>Oct 19 09:32:17 darkstar sshd[13508]: Invalid user postmaster from 202.102.XX.XX<\/em><br \/>\n<em>Oct 19 09:32:31 darkstar sshd[13520]: Invalid user file from 202.102.XX.XX<\/em><\/p>\n<p>Si el servidor de SSH s\u00f3lo permite autentificaci\u00f3n por clave privada\/p\u00fablica (Autenticaci\u00f3n trasparente por clave p\u00fablica\/privada con OpenSSH) podemos estar razonablemente tranquilos de que el intento de intrusi\u00f3n no tendr\u00e1 \u00e9xito. Pero como nunca se puede estar seguro del todo, puede ser buena idea a\u00f1adir, adicionalmente, un sistema de\u00a0<em>port knocking<\/em>\u00a0para abrir el puerto SSH s\u00f3lo cuando realmente lo vayamos a usar.<\/p>\n<p>En un sistema basado en Debian, esto se puede hacer muy f\u00e1cilmente con el demonio\u00a0<code><a href=\"http:\/\/www.zeroflux.org\/projects\/knock\">knockd<\/a><\/code>, uno de los paquetes oficiales de la distribuci\u00f3n. Tras instalar el paquete, tenemos que editar el fichero\u00a0<code>\/etc\/default\/knockd<\/code>\u00a0para permitir que el demonio arranque:<\/p>\n<p style=\"padding-left: 30px\"><em># PLEASE EDIT \/etc\/knockd.conf BEFORE ENABLING<\/em><br \/>\n<em>START_KNOCKD=1<\/em><\/p>\n<p>y especificarle cualquier opci\u00f3n que queramos usar, especialmente en qu\u00e9 interfaz tiene que escuchar si no es el\u00a0<code>\"eth0\"<\/code>:<\/p>\n<p style=\"padding-left: 30px\"><em># command line options<\/em><br \/>\n<em># KNOCKD_OPTS=\"-i eth1\"<\/em><\/p>\n<p>Hay que tener en cuenta que el\u00a0<code>knockd<\/code>\u00a0siempre ve los paquetes llegar, incluso si los puertos est\u00e1n cerrados y si alguna regla de\u00a0<code>iptables<\/code>\u00a0rechaza el paquete. Podr\u00edamos decir que se comporta como el\u00a0<code><a href=\"http:\/\/www.tcpdump.org\/tcpdump_man.html\">tcpdump<\/a><\/code>, en el sentido de que el interfaz se pone en modo promiscuo y ve todo lo que llega a \u00e9l. Pero adicionalmente, seg\u00fan qu\u00e9 paquetes vea, ejecuta una acci\u00f3n. Por cierto, parece que no funciona poner dos interfaces con\u00a0<code>\"-i eth0 -i eth1\"<\/code>.<\/p>\n<p>A continuaci\u00f3n, tenemos que personalizar el fichero\u00a0<code>\/etc\/knockd.conf<\/code>\u00a0para especificar qu\u00e9 secuencia de puertos queremos y qu\u00e9 hacer cuando \u00e9sta llegue. En el \u201c<code><a href=\"http:\/\/linux.die.net\/man\/1\/knockd\">man knockd<\/a><\/code>\u201d encontramos interesantes ejemplos de uso, pero podemos centrarnos en el m\u00e1s t\u00edpico que es el que instala Debian por defecto:<\/p>\n<blockquote><p><em>[openSSH] <\/em><br \/>\n<em> sequence = 7000,8000,9000 <\/em><br \/>\n<em> seq_timeout = 5 <\/em><br \/>\n<em> command = \/sbin\/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT <\/em><br \/>\n<em> tcpflags = syn <\/em><\/p>\n<p><em>[closeSSH] <\/em><br \/>\n<em> sequence = 9000,8000,7000 <\/em><br \/>\n<em> seq_timeout = 5 <\/em><br \/>\n<em> command = \/sbin\/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT <\/em><br \/>\n<em> tcpflags = syn<\/em><\/p><\/blockquote>\n<p>Vemos que cuando llega una secuencia de paquetes TCP con el flag de\u00a0<a href=\"http:\/\/en.wikipedia.org\/wiki\/SYN_%28TCP%29#Connection_establishment\">SYN<\/a>\u00a0a los puertos 7000, 8000 y 9000 en menos de 5 segundos, el demonio\u00a0<code>knockd<\/code>\u00a0a\u00f1ade una regla de\u00a0<code>iptables<\/code>\u00a0para permitir el acceso al servicio SSH a la IP que ha hecho el\u00a0<em>port knocking<\/em>. Y con otra secuencia, podemos cerrar el puerto posteriormente.<\/p>\n<p>Tras configurar el\u00a0<code>\/etc\/knockd.conf<\/code>\u00a0a nuestro gusto, arrancamos el\u00a0<code>knockd<\/code>\u00a0con \u201c<code>\/etc\/init.d\/knockd start<\/code>\u201c.<\/p>\n<p>Para mandar la secuencia que active la acci\u00f3n podemos usar, desde otro sistema, el comando\u00a0<code><a href=\"http:\/\/linux.die.net\/man\/1\/knock\">knock<\/a><\/code>, que se instala tambi\u00e9n al instalar el paquete\u00a0<code>knockd<\/code>:<\/p>\n<blockquote><p>[root@clientessh ~]# knock 192.168.100.2 7000 8000 9000<\/p><\/blockquote>\n<p>y en el sistema en el que hemos arrancado el\u00a0<code>knockd<\/code>\u00a0vemos c\u00f3mo los paquetes llegan y se ejecuta la acci\u00f3n planificada para dicha secuencia:<\/p>\n<blockquote>\n<h6>Oct 19 21:55:17 darkstar knockd: 192.168.100.1: openSSH: Stage 1<br \/>\nOct 19 21:55:17 darkstar knockd: 192.168.100.1: openSSH: Stage 2<br \/>\nOct 19 21:55:17 darkstar knockd: 192.168.100.1: openSSH: Stage 3<br \/>\nOct 19 21:55:17 darkstar knockd: 192.168.100.1: openSSH: OPEN SESAME<br \/>\nOct 19 21:55:17 darkstar knockd: openSSH: running command: \/sbin\/iptables -A INPUT -s 192.168.100.1 -p tcp --dport 22 -j ACCEPT<\/h6>\n<\/blockquote>\n<p>El hecho de que podamos ejecutar cualquier comando nos da total flexibilidad. Por ejemplo, se me ocurre que en vez de, o adicionalmente a a\u00f1adir o quitar reglas de\u00a0<code>iptables<\/code>, tambi\u00e9n podr\u00edamos incluso arrancar o parar el demonio\u00a0<code>sshd<\/code>:<\/p>\n<blockquote><p>[openSSH]<br \/>\nsequence = 7000,8000,9000<br \/>\nseq_timeout = 5<br \/>\ncommand = \/etc\/init.d\/ssh start<br \/>\ntcpflags = syn<\/p>\n<p>[closeSSH]<br \/>\nsequence = 9000,8000,7000<br \/>\nseq_timeout = 5<br \/>\ncommand = \/etc\/init.d\/ssh stop<br \/>\ntcpflags = syn<\/p><\/blockquote>\n<p>Lo que nos quedar\u00eda por ver es qu\u00e9 alternativas tenemos para mandar la secuencia de puertos. Hemos visto que el propio paquete\u00a0<code>knockd<\/code>\u00a0de Debian lleva el comando\u00a0<code>knock<\/code>. Pero, \u00bfhay alternativas? \u00bfy si queremos hacer\u00a0<em>port knocking<\/em>\u00a0desde Windows? \u00bfy si queremos hacerlo desde un sistema que no tenga ning\u00fan software especial?<\/p>\n<p>La propia p\u00e1gina de\u00a0<code>man<\/code>\u00a0de\u00a0<code>knockd<\/code>\u00a0nos sugiere algunas alternativas:<\/p>\n<blockquote><p><em>knock is the accompanying port-knock client, though telnet or\u00a0<a href=\"http:\/\/netcat.sourceforge.net\/\">netcat<\/a>\u00a0could be used for simple TCP knocks instead. For more advanced knocks, see\u00a0<a href=\"http:\/\/www.hping.org\/\">hping<\/a>,\u00a0<a href=\"http:\/\/www.earth.li\/projectpurple\/progs\/sendip.html\">sendip<\/a>\u00a0or packit.<\/em><\/p><\/blockquote>\n<p>Una posibilidad para Windows tambi\u00e9n es el\u00a0<a href=\"http:\/\/sourceforge.net\/projects\/knockknock\/\">KnockKnock<\/a>, descubierto gracias a \u201c<a href=\"http:\/\/www.marksanborn.net\/linux\/add-port-knocking-to-ssh-for-extra-security\/\">Add Port Knocking to SSH for Extra Security<\/a>\u201c:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/www.marksanborn.net\/wp-content\/uploads\/2008\/04\/knockknock.gif\" alt=\"Imagen relacionada\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>pero un inconveniente del KnockKnock es que lanza la secuencia m\u00e1s de una vez:<\/p>\n<p style=\"padding-left: 30px\"><em>Oct 19 22:38:32 darkstar knockd: 192.168.100.1: Prueba: Stage 1<\/em><br \/>\n<em>Oct 19 22:38:32 darkstar knockd: 192.168.100.1: Prueba: Stage 2<\/em><br \/>\n<em>Oct 19 22:38:32 darkstar knockd: 192.168.100.1: Prueba: Stage 3<\/em><br \/>\n<em>Oct 19 22:38:32 darkstar knockd: 192.168.100.1: Prueba: Stage 4<\/em><br \/>\n<em>Oct 19 22:38:32 darkstar knockd: 192.168.100.1: Prueba: OPEN SESAME<\/em><br \/>\n<em>Oct 19 22:38:32 darkstar knockd: Prueba: running command: \/sbin\/iptables -A INPUT -s 192.168.100.1 -p tcp --dport 22 -j ACCEPT<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: Stage 1<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: Stage 2<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: Stage 3<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: Stage 4<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: OPEN SESAME<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: Prueba: running command: \/sbin\/iptables -A INPUT -s 192.168.100.1 -p tcp --dport 22 -j ACCEPT<\/em><br \/>\n<em>Oct 19 22:38:33 darkstar knockd: 192.168.100.1: Prueba: Stage 1<\/em><br \/>\n<em>Oct 19 22:38:34 darkstar knockd: 192.168.100.1: Prueba: Stage 2<\/em><br \/>\n<em>Oct 19 22:38:34 darkstar knockd: 192.168.100.1: Prueba: Stage 3<\/em><br \/>\n<em>Oct 19 22:38:34 darkstar knockd: 192.168.100.1: Prueba: Stage 4<\/em><br \/>\n<em>Oct 19 22:38:34 darkstar knockd: 192.168.100.1: Prueba: OPEN SESAME<\/em><br \/>\n<em>Oct 19 22:38:34 darkstar knockd: Prueba: running command: \/sbin\/iptables -A INPUT -s 192.168.100.1 -p tcp --dport 22 -j ACCEPT<\/em><\/p>\n<p>Si el comando a ejecutar se puede ejecutar m\u00e1s de una vez sin otros efectos, como es el caso del\u00a0<code>iptables<\/code>, nos da igual, pero en otros casos, puede ser un problema.<\/p>\n<p>Otra soluci\u00f3n es usar el cliente de\u00a0<code>telnet<\/code>\u00a0de Windows contra los diferentes puertos para activar la secuencia. Para ello, en Windows se puede usar un\u00a0<code>.bat<\/code>\u00a0con este aspecto:<\/p>\n<p style=\"padding-left: 30px\"><em>start telnet 192.168.100.2 7000<\/em><br \/>\n<em>start telnet 192.168.100.2 8000<\/em><br \/>\n<em>start telnet 192.168.100.2 9000<\/em><\/p>\n<p>El resultado no siempre es el deseado. El\u00a0<code>telnet<\/code>\u00a0de Windows env\u00eda varios paquetes SYN cuando falla el primero y parece que el\u00a0<code>knockd<\/code>\u00a0no siempre acepta la secuencia. Pero bueno, normalmente antes de 4 o 5 intentos, ya ha funcionado la secuencia.<\/p>\n<p>Por supuesto, el\u00a0<code>knockd<\/code>\u00a0es un punto de fallo adicional en el acceso al sistema. Si le pasa algo a este demonio, nos quedaremos sin poder acceder.<\/p>\n<p><em>Port knocking<\/em>\u00a0es muy \u00fatil a la hora de\u00a0<strong>proteger servicios que necesariamente deben estar expuestos a Internet<\/strong>. Solo las personas que tengan autorizaci\u00f3n, sabr\u00e1n sobre que secuencia de puertos se deben realizar intentos de conexi\u00f3n para finalmente habilitar el\u00a0<em>firewall<\/em>. Asimismo, esta no es la \u00fanica variante en cuanto al\u00a0<em>port knocking<\/em>, sino que\u00a0<strong>existen otras alternativas a la hora de programar el comportamiento<\/strong>\u00a0de este\u00a0<em>software<\/em>. Esta es una de las diversas variantes para evitar que\u00a0<strong>el sistema sea comprometido<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El\u00a0port knocking\u00a0(golpeo de puertos)\u00a0es un mecanismo que permite abrir puertos\u00a0a trav\u00e9s de una\u00a0serie predefinida de intentos de conexi\u00f3n\u00a0a puertos que se encuentran cerrados. El protocolo\u00a0SSH\u00a0suele utilizarse principalmente por administradores para ejecutar comandos de forma remota. Sin embargo, siempre existe\u00a0el riesgo de exponer un tipo de servicio de estas caracter\u00edsticas\u00a0ya que suelen ser blanco de ataques. [&hellip;]<\/p>\n","protected":false},"author":1477,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1257,2249],"tags":[6040,855781,29814,855739,855782],"class_list":["post-748","post","type-post","status-publish","format-standard","hentry","category-actualidad","category-seguridad","tag-port","tag-portknocking","tag-puertos","tag-seguridad","tag-ssh"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/posts\/748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/users\/1477"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/comments?post=748"}],"version-history":[{"count":5,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/posts\/748\/revisions"}],"predecessor-version":[{"id":753,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/posts\/748\/revisions\/753"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/media?parent=748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/categories?post=748"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/maad\/wp-json\/wp\/v2\/tags?post=748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}