¿Que es el Port Knocking?

El Port Knocking  o “Golpeo de puertos” es una técnica para aplicar seguridad a nuestro servidor. Según vemos en la imagen el Port Knocking se comporta como un Firewall.

Port knoching

¿En qué consiste?

Lo normal es que nos conectemos remotamente a nuestro servidor por SSH por el puerto 22, a través de algún cliente como Putty. Podríamos aplicar algo de seguridad y cambiar el puerto por defecto que es el 22, pero aun así hay utilidades como Nmap nos permiten averiguar los puertos que hay abiertos.

Aquí es donde entra la técnica del Port Knocking, comportándose como un Firewall. El método consiste en realizar una serie de intentos de conexión preestablecidos a una cadena de puertos para avisar al sistema de que es un acceso seguro. ¡¡Buff que lio ¡!

Lo explicaré en mayor detalle:

Configuro en el sistema para que si hay un intento de conexión en la siguiente secuencia de puertos  7000-8000-9000, me deje entrar por SSH al puerto deseado. Tiene que ser en esa misma secuencia y a esos mismos puertos, si no el puerto no se abriría.

1.       Si hago la secuencia 6000-7000-8000 no dejaría entrar

2.       Si hago la secuencia 9001-800 no dejaría entrar

Por lo tanto el servidor tiene el puerto cerrado, pero cuando detecte que se ha realizado la secuencia de puertos correcta (7000-8000-9000, definida previamente en el archivo de configuración), el server abrirá el puerto para establecer una conexión.

Port Knocking

Al lío, proceso de configuración.

1.       Instalar el paquete knockd.

               aptitude install knockd

Port knocking

Tras la instalación el servicio no está activo, para ello editar el archivo que nos dice la imagen, lo haremos en el punto 2.

2.       Tras la instalación, editar fichero /etc/default/knockd

Port knocking

Como se puede leer, hay que editar el fichero /etc/knockd.conf antes de editar este, pero no habría ningún problema si editamos /etc/default/knockd antes.

# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING

START_KNOCKD=1

                Hay que poner START_KNOCKD a 1 para que el demonio knockd arranque.

                Un demonio es un proceso que se ejecuta en segundo plano (background).

# command line options
# KNOCKD_OPTS="-i eth1"

Hay descomentar la línea anterior, y especificarle en qué interfaz tiene que escuchar, si no la descomentamos por defecto es el «eth0».

No funciona poner dos interfaces con «-i eth0 -i eth1».

3.       Bloquear acceso al puerto 22 con IPTABLES

AHHHH!!, por dios que es eso de IPTABLES, tranquilos aquí tenéis esta pequeña explicación.

IPTABLES es el cortafuegos (FIREWALL) por defecto de Linux.

iptables -A INPUT –p tcp –dport 22 –j DROP

Esto lo que hace es indicar a iptables que añada (A) una nueva regla a la cadena de entrada (INPUT) para el protocolo tcp (-p tcp), en la que descarte (-j DROP) todos los paquetes recibidos al puerto de destino 22 (–dport 22), que es el puerto SSH por defecto.

Ver como lo hemos bloqueado con :

–  iptables -L

Para borrar las reglas de iptables, iptables -F

Si cuando hacemos iptables -L aparece esto es que no tenemos ninguna regla definida.

Port knocking

–  nmap localhost

Para instalar nmap: aptitude install nmap

Port knocking

4.       Editar el fichero /etc/knockd.conf

Aquí se encuentra  el meollo, vemosque cuando llega una secuencia de paquetes TCP con el flag de SYN a los puertos 7000, 8000 y 9000 en menos de 5 segundos, el demonio knockd añade una regla de iptables para permitir el acceso al servicio SSH a la IP que ha hecho el port knocking. Y con la secuencia de puertos a la inversa, podemos cerrar el puerto posteriormente.

Usaré la secuencia por defecto 7000, 8000, 9000 pero aconsejo escoger otra por seguridad.

[options]

        #UseSyslog  //esto es lo que viene por defecto

        logfile = /var/log /knockd.log    //personalizamos el fichero de log

[openSSH]

        sequence       = 7000,8000,9000

        seq_timeout = 5

        command      = iptables -D INPUT -p tcp –dport 22 -j DROP

        tcpflags          = syn

[closeSSH]

        sequence       = 9000,8000,7000

        seq_timeout = 5

        command      = iptables -A INPUT -p tcp –dport 22 -j DROP

        tcpflags          = syn

Explicación de la configuración:.

[options]

 UseSyslog significa que para registrar actividad (log) se usará /var/log/syslog

[openSSH]

Es donde obviamente irán las instrucciones para abrir SSH,

sequence.Primeramente tenemos la secuencia de puertos (la combinación secreta) que está configurada por defecto (puerto 7000, 8000 y 9000).

                NOTA IMPORTANTE:

· Obviamente los puertos se pueden cambiar (de hecho lo recomiendo) así como no tienen que ser 3 obligatoriamente, pueden ser más o menos, depende de lo que deseen ustedes.

· Los puertos no pueden ser consecutivos, deben estar bien distantes.

seq_timeout. Significa el tiempo que se esperará para que se efectúe la combinación secreta de puertos. Por defecto está puesto 5 segundos, esto significa que una vez empecemos a efectuar el port knocking tenemos máximo 5 segundos para terminar la secuencia correcta.

Si pasan 5 segundos y no hemos culminado el port knocking entonces simplemente será como si la secuencia no hubiese sido válida.

command.Cuando esos puertos sean «tocados» ejecutará el comando:

 /sbin/iptables -D INPUT -p tcp -dport 22 -j DROP, que elimina la sentencia creada en iptables encargada de bloquear el puerto SSH, permitiéndonos así poder conectar.

tcpflags. Con esta línea especificamos el tipo de paquetes que reconocerá el servidor como válidos para el port knocking. Por defecto es syn.

[closeSSH]

Hace lo contrario, la vuelve a añadir para que los paquetes que lleguen al puerto SSH sean descartados, pero el golpeo de los puertos es en orden contario como se observa.

5.       Ponemos en marcha el demonio.

service knockd start

O bien

/etc/init.d/knockd start

Port_Knocking

6.       Desde el pc cliente mandar la secuencia de conexión para que nos abra el puerto, eso sí, previamente hay que instalar en el cliente el paquete knock.

aptitude install knockd  //Instalar paquete en el cliente

knock 10.33.1.2 7000 8000 9000

   Si no dice nada va bien
   O bien

knock -v 10.33.1.2 7000 8000 9000

La marca «-v» le indica que lo haga en modo «verbose» (que muestre lo que va haciendo), seguido de la dirección IP del servidor (10.33.1.2), seguido de los puertos a «golpear» en cuestión en el orden indicado, poniendo el protocolo utilizado para realizar el «golpeo» separado por dos puntos «:»

7.       Ver que funciona.

conectarnos por putty

         o bien

ssh -p 22 jesus@10.33.1.2

o bien

ssh jesus@10.33.1.2

8.       Hacer el proceso inverso para cerrar el puerto.

knock -v 10.33.1.2 9000 8000 7000

9.       Ver el fichero de log para ver que se está realizando bien el proceso.

Cada golpeo se identifica como un Stage y openSSH y closeSSH son los nombres que se definen en el fichero de configuración /etc/knockd.conf

Port_Knocking

Como podéis ver, el Port Knocking es muy interesante y útil, además aparte de lo que ya sabemos podemos configurarlo para que mate un proceso, detenga un servicio como apache o MySQL, arranque el servicio SSH, hacer una actualización del sistema de forma remota sin ni siquiera acceder al sistema, añadir o eliminar un usuario, mover ficheros de lugar, eliminarlos, claro está apuntándonos previamente la combinación de puertos deseada, no vaya a ser que la liemos parda.

Algunos ejemplos de configuración del fichero knockd.conf los puedes ver en la siguiente imagen.

Port_Knocking

Cambiar-puerto-22-ssh

Este artículo, nace con la necesidad de hacer nuestro servidor un poco más seguro, para ello vamos a cambiar el puerto por defecto para conectarnos por SSH, que es 22.

ssh

¿Qué es un puerto?

Un puerto es un punto de comunicación al que pueden llegar y desde el que pueden partir datos. Asociado a un puerto habrá un programa o servicio que escucha y atiende peticiones procedentes tanto desde el propio sistema donde se ejecuta como desde otros a los que esté conectado. Distintos programas utilizan distintos números de puerto, por lo que se puede establecer más de una comunicación simultánea. Los puertos tienen asociado un número que suele identificar al programa con el que está asociado, aunque esto no es obligatorio: un programa puede usar cualquier puerto disponible.

Para ver los puertos de comunicaciones que existen y su número asociado, basta con poner en el Oráculo (Google), puertos bien conocidos, y nos van a salir varias páginas donde se muestra nuestro cometido.

Cada puerto se identifica por un número binario de 16 bits, que varía desde 0 a 216 -1 = 65535, que se clasifican de la siguiente forma:

  • Puertos conocidos (0 – 1023): o well known ports, reservados para aplicaciones y servicios estándar como HTTP, FTP.Las aplicaciones clientes se conectan a estos puertos para acceder a los servicios.
  • Puertos registrados (1024 – 49151): para aplicaciones no estándar, es decir, que los puede usar cualquier aplicación.
  • Puertos dinámicos (49152 – 65535: normalmente se asignan en forma dinámica a las aplicaciones de clientes al iniciarse la conexión. Su uso es poco común son usados en conexiones peer to peer (P2P), como Skype.

Para ello habrá que hacer los siguientes puntos:

1. Instalar el servicio SSH en el servidor.      

       apt-get install ssh

2. Editar el fichero /etc/services

El fichero /etc/services es utilizado por los servidores y por los clientes para obtener el   número de puerto en el que deben escuchar o al que deben enviar peticiones

nano /etc/services

Una vez editado, lo ideal es poner un puerto TCP y UDP, por encima de 1023, ya que los puertos del 0 – 1023 están reservados para aplicaciones y servicios estándar como HTTP, FTP.

Yo voy ha escoger el puerto 1025.

Una vez modificado el fichero, hay que guardarlo y no hay que hacer nada más, ya que este fichero NO se utiliza para habilitar o deshabilitar servicios, sino como hemos dicho, simplemente para obtener números de puerto a partir de nombres de servicio y viceversa.

ssh_los_teatinos

3. Editamos el archivo /etc/ssh/ssh_config

nano /etc/ssh/ssh_config

En la Línea donde se refleja  #  Port 22, quitamos el “#” y cambiamos el 22 por un número de puerto mayor a 1023, que deseemos, en mi caso 1025.

4. Editamos el archivo /etc/ssh/sshd_config

nano /etc/ssh/sshd_config

        En la línea 5 cambiamos el puerto 22 por el número de puerto elegido.

5. Reiniciamos el servicio ssh

/etc/init.d/ssh restart

6. Accedemos con PuTTY al servidor por el puerto 1025,  a ver si nuestros cambios han surtido efecto.

puTTY SSH Los teatinos

¿Qué es un Servlet?

¿Qué es un Servlet de Java?

Es una tecnología que nos permite crear aplicaciones web interactivas (dinámicas), es decir, le permite al usuario interactuar con la aplicación (hacer consultas, insertar y eliminar datos, …)

Un Servlet es un objeto java que pertenece a una clase que extiende de javax.servlet.http.HttpServlet

Son pequeños programas escritos en Java que admiten peticiones a través del protocolo HTTP. Los servlets reciben peticiones desde un navegador web, las procesan y devuelven una respuesta al navegador, normalmente en HTML. Para realizar estas tareas podrán utilizar las clases incluidas en el lenguaje Java. Estos programas son los intermediarios entre el cliente (casi siempre navegador web) y los datos (BBDD)

¿Qué es un contenedor de Servlets?

Un contenedor de Servlet es un programa capaz de recibir peticiones de páginas web y redireccionar estas peticiones a un objeto Servlet.

Ejemplo: Apache Tomcat

¿Cómo funciona un contenedor de Servlets?

1. El navegador (cliente) pide una página al servidor HTTP que es un contenedor de Servlets.

2. El servlet procesa los argumentos de la petición, es decir, el contenedor de Servlets delega la petición a un Servlet en particular elegido de entre los Servlets que contiene.

3. El Servlet, que es una objeto java, se encarga de generar el texto de la página web que se entrega al contenedor.

4. El contenedor devuelve la página web al navegador (cliente) que la solicitó, normalmente en HTML.

Por lo tanto nos encontramos en una arquitectura Cliente-Servidor. Lo normal para esto es utilizar Apache Tomcat como contenedor de servlets. Recordar que apache es un servidor HTTP.

¿Qué es Apache Tomcat?

Es un contenedor de servlets, no es un servidor de aplicaciones. La diferencia principal radica en que un contenedor de servlets está pensado únicamente para tecnología web (acceso vía HTTP), mientas que en un servidor de aplicaciones se pueden hacer sistemas más complejos y multicapa. Por ejemplo, un sistema que poseerá soluciones de escritorio, web y móvil deberá alojarse en un servidor de aplicaciones, ya que posee capas distintas que requerirán mayor complejidad en el lado servidor.

Antes de empezar con el desarrollo del artículo, veremos algunas definiciones interesantes que nos vendrán bien para entenderlo.

  • Desplegar una aplicación (deployment): significa ponerla en producción.
  • Servidor de aplicaciones: un servidor de aplicaciones consiste en un contenedor que abarca la lógica de negocio de un sistema (según el patrón MVC, sería el Modelo), y que provee de respuestas a las peticiones de distintos dispositivos que tienen acceso a ella. Son un claro ejemplo del modelo cliente-servidor, cuyo lado cliente ejecuta requerimientos de procesamiento al otro lado, donde el servidor se encarga de procesar y responder.
  • Servidores de aplicaciones J2EE:
    • JBoss: libre, es el más utilizado.
    • WebSphere: conjunto de aplicaciones desarrolladas por IBM. La más importante es WebSphere Aplication Server. También se incluyen aplicaciones para diseñar modelos de negocio, ejecutar y monitorizar procesos.
    • GlassFish: libre, desarrollado por Sun. Incorpora un componente llamado Grizzly, que aumenta la escalabilidad y velocidad del servidor.
    • WebLogic
  • Servidores de aplicaciones .NET:
    • Internet Information Server (IIS)
    • Base4 Server
    • Zope