El objetivo de esta entrada es securizar SSH, no obstante varias de las técnicas que vamos a ver se pueden utilizar para ayudarnos a securizar cualquier otro servicio.
SSH (Secure SHell, en español: intérprete de órdenes segura) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos, y también puede redirigir el tráfico de X para poder ejecutar programas gráficos si tenemos un Servidor X (en sistemas Unix y Windows) corriendo.
Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura (tanto archivos sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.
En dos palabras: control absoluto. Ni que decir tiene las ventajas y los problemas que podemos solucionar teniendo el servicio activado en nuestro servidor... Pero, ¿estamos realmente tranquilos? ¿habremos puesto una contraseña suficientemente segura?... desde luego que no nos salva ni "el PIrri" de que nos den un par de achuchones si alguien ve el puerto 22 abierto .. en busca de tesoros...
Pues si no concilias bien el sueño pensando en tu ssh... sigue leyendo te ayudamos a configurarlo a nivel PARANOIDE...
Para ello utilizaremos el fichero de configuración de ssh, el programa fail2ban (para bannear indeseados), y la técnica portknocking ..
Las siguientes medidas las podemos implementar juntas o por separado según nuestro nivel de "paranoia"..
Dentro de este archivo tenemos varias opciones para securizar nuestro ssh por ejemplo:
port 1243
PermitRootLogin no
protocol 2
Por ejemplo:
AllowUsers ana jose manu
otro ejemplo:
AllowUser pedro@217.158.45.*
Si queremos poner un máximo de 3 intentos, habría que indicarlo de la siguiente manera:
MaxAuthTries 3
Si queremos limitar a una única pantalla de logueo por IP, habría que hacerlo de la siguiente manera:
MaxStartups 1
ClientAliveInterval 300
HostbasedAuthentication no
Creando nuestra clave publica (en nuestra máquina cliente)
ssh-keygen -t rsa
Al ejecutar este comando nos pide una clave. Le asignamos una y luego deberemos colocar en esa máquina remota la clave RSA pública que acabamos de generar ( /.ssh/id_rsa.pub ) en el directorio /.ssh/authorized_keys de el servidor ssh.
Habilitamos autenticación por clave (en el servidor)
Ahora es momento de volver a configurar /etc/ssh/sshd_config para habilitar la autenticación con las claves anteriormente añadidas /.ssh/authorized_keys del servidor ssh. En /etc/ssh/sshd_config :
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Fail2Ban es una aplicación que analiza continuamente los ficheros de log y bloquea las direcciones de Internet que hayan originado varias tentativas fallidas de acceso con una contraseña inválida.
Fail2Ban es extremadamente eficaz en la prevención de ataques de fuerza bruta y ataques de negación de servicio (DoS).
Además nos puede avisar de los intentos de "acceso" a nuestro correo.
Para instalarlo:
root@server:~# aptitude install fail2ban whois
La documentación de fail2ban aconseja que toda la configuración se realice en archivos con la extensión .local. Estos pueden ser creados copiando el archivo de la configuración original, con la extensión .conf:
root@server:~# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
En una primera etapa, definimos cuáles son las direcciones que no estarán sujetas a restricciones (la dirección local y la red local), por cuánto tiempo estarán bloqueadas las direcciones de donde provengan las amenazas (1800 segundos (30 minutos) y después de cuántas tentativas (3 tentativas permitidas). Esta configuración debe realizarse en el archivo /etc/fail2ban/jail.local:
También se define la dirección e-mail que recibirá las alertas en /etc/fail2ban/jail.local:
Luego, debe configurarse la acción a realizar cuando se detecta un posible ataque. En este caso, la dirección IP del atacante es bloqueada y u e-mail es enviado al administrador del sistema.
Por último, se definen los parámetros del servicio que se pretende proteger.
Para esto, se edita la sección JAILS del archivo /etc/fail2ban/jail.local:
Una vez configurado e instalado hacemos un restart y ya lo tenemos en marcha:
/etc/init.d/file2band restart
Explicáremos brevemente en que consiste el port knocking ¡¡wikipedia!!
El golpeo de puertos (del inglés port knocking) es un mecanismo para abrir puertos externamente en un firewall mediante una secuencia preestablecida de intentos de conexión a puertos que se encuentran cerrados. Una vez que el firewall recibe una secuencia de conexión correcta, sus reglas son modificadas para permitir al host que realizó los intentos conectarse a un puerto específico.
La herramienta que vamos a utilizar es Knockd , una herramienta similar para windows seria knock knock.
Tras su instilación deberemos configurar el arranque del demonio knockd ;esto lo haremos facilmente en /etc/knockd.conf
START_KNOCKD=1
El siguiente paso será definir la interfaz de red que vamos a utilizar...
# command line options
Luego, tenemos que personalizar el fichero /etc/knockd.conf para especificar qué secuencia de puertos queremos y qué hacer cuando ésta llegue. En el “man knockd” encontramos interesantes ejemplos de uso, pero podemos centrarnos en el más típico que es el que instala Debian por defecto:
Para probar tan solo nos hace falta llamar a la puerta:
Con esto Knockd nos abrirá la puerta a ssh, tras hacer lo que tengamos que hacer la cerraremos con nuestra secuencia de cierre...
Knock 192.168.100.2 9000 8000 7000
SSH (Secure SHell, en español: intérprete de órdenes segura) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos, y también puede redirigir el tráfico de X para poder ejecutar programas gráficos si tenemos un Servidor X (en sistemas Unix y Windows) corriendo.
Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura (tanto archivos sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.
En dos palabras: control absoluto. Ni que decir tiene las ventajas y los problemas que podemos solucionar teniendo el servicio activado en nuestro servidor... Pero, ¿estamos realmente tranquilos? ¿habremos puesto una contraseña suficientemente segura?... desde luego que no nos salva ni "el PIrri" de que nos den un par de achuchones si alguien ve el puerto 22 abierto .. en busca de tesoros...
Pues si no concilias bien el sueño pensando en tu ssh... sigue leyendo te ayudamos a configurarlo a nivel PARANOIDE...
Para ello utilizaremos el fichero de configuración de ssh, el programa fail2ban (para bannear indeseados), y la técnica portknocking ..
Las siguientes medidas las podemos implementar juntas o por separado según nuestro nivel de "paranoia"..
1. Configurar adecuadamente ssh
/etc/ssh/sshd_configDentro de este archivo tenemos varias opciones para securizar nuestro ssh por ejemplo:
a) Ofuscación del puerto ssh (altamente aconsejable):
Normalmente el servicio lo tenemos por defecto en el puerto 22 esto lo podremos cambiar a nuestro criterio en el archivo de configuración de openssh . Sustituiremos el numero 22 por el que optemos por ejemplo 1247port 1243
b) Restringir el acceso Root
Por ejemplo si no necesitamos en nuestro acceso remoto permisos de root, lo mas lógico es NO permitir acceso al mismo desde ssh.PermitRootLogin no
c) Restringir protocolos
Le diremos a ssh que sólo se utilizará Protocol 2, ya que Protocol 1 es considerado un tanto inseguro.protocol 2
d) Limitar usuarios
Los ingresos de SSH pueden ser limitados a ciertos usuarios que necesitan acceso remoto. Agrega usuarios separados por espacio en /etc/ssh/sshd_config.Por ejemplo:
AllowUsers ana jose manu
otro ejemplo:
AllowUser pedro@217.158.45.*
e) Limitar el número de reintentos
Por medio de la variable “MaxAuthTries”, podemos indicar el número de veces que nos podemos equivocar al introducir el nombre de usuario o la contraseña. Una vez superado el número que hayamos indicado, la conexión se perderá y habrá que empezar de nuevo el proceso de conexión. Con esto evitaremos ataques de persistencia de la conexión.Si queremos poner un máximo de 3 intentos, habría que indicarlo de la siguiente manera:
MaxAuthTries 3
f) Limitar el número de pantallas de login
Limitar el número de ventanas de logueo simultáneas que podemos tener activas desde una misma IP, para de esta forma evitar ataques divididos.Si queremos limitar a una única pantalla de logueo por IP, habría que hacerlo de la siguiente manera:
MaxStartups 1
g) Configurar el LogOut por tiempo de inactividad
Es recomendable configurar esta directiva para evitar sesiones SSH desatendidas.ClientAliveInterval 300
h) Deshabilitar la autenticación basada en Host
Para deshabilitar este método de autenticación, modificamos o agregamos lo siguiente en sshd_config.HostbasedAuthentication no
i) Utilizar autenticación mediante llaves públicas/privadas (SSH Public-Key / Private-Key Authentication)
Entrar con usuario y password está bien, pero podemos tener mas seguridad usando un par de claves pública y privada.
Creando nuestra clave publica (en nuestra máquina cliente)
ssh-keygen -t rsa
Al ejecutar este comando nos pide una clave. Le asignamos una y luego deberemos colocar en esa máquina remota la clave RSA pública que acabamos de generar ( /.ssh/id_rsa.pub ) en el directorio /.ssh/authorized_keys de el servidor ssh.
Habilitamos autenticación por clave (en el servidor)
Ahora es momento de volver a configurar /etc/ssh/sshd_config para habilitar la autenticación con las claves anteriormente añadidas /.ssh/authorized_keys del servidor ssh. En /etc/ssh/sshd_config :
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
2. Instalar Fail2Ban
Fail2Ban es una aplicación que analiza continuamente los ficheros de log y bloquea las direcciones de Internet que hayan originado varias tentativas fallidas de acceso con una contraseña inválida.
Fail2Ban es extremadamente eficaz en la prevención de ataques de fuerza bruta y ataques de negación de servicio (DoS).
Además nos puede avisar de los intentos de "acceso" a nuestro correo.
Para instalarlo:
root@server:~# aptitude install fail2ban whois
La documentación de fail2ban aconseja que toda la configuración se realice en archivos con la extensión .local. Estos pueden ser creados copiando el archivo de la configuración original, con la extensión .conf:
root@server:~# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
En una primera etapa, definimos cuáles son las direcciones que no estarán sujetas a restricciones (la dirección local y la red local), por cuánto tiempo estarán bloqueadas las direcciones de donde provengan las amenazas (1800 segundos (30 minutos) y después de cuántas tentativas (3 tentativas permitidas). Esta configuración debe realizarse en el archivo /etc/fail2ban/jail.local:
También se define la dirección e-mail que recibirá las alertas en /etc/fail2ban/jail.local:
Luego, debe configurarse la acción a realizar cuando se detecta un posible ataque. En este caso, la dirección IP del atacante es bloqueada y u e-mail es enviado al administrador del sistema.
Por último, se definen los parámetros del servicio que se pretende proteger.
Para esto, se edita la sección JAILS del archivo /etc/fail2ban/jail.local:
Una vez configurado e instalado hacemos un restart y ya lo tenemos en marcha:
/etc/init.d/file2band restart
3. Port Knocking ssh
Llegamos al final del viaje y con esto acabaremos de securizar nuestro servicio preferido...Explicáremos brevemente en que consiste el port knocking ¡¡wikipedia!!
El golpeo de puertos (del inglés port knocking) es un mecanismo para abrir puertos externamente en un firewall mediante una secuencia preestablecida de intentos de conexión a puertos que se encuentran cerrados. Una vez que el firewall recibe una secuencia de conexión correcta, sus reglas son modificadas para permitir al host que realizó los intentos conectarse a un puerto específico.
La herramienta que vamos a utilizar es Knockd , una herramienta similar para windows seria knock knock.
Tras su instilación deberemos configurar el arranque del demonio knockd ;esto lo haremos facilmente en /etc/knockd.conf
START_KNOCKD=1
El siguiente paso será definir la interfaz de red que vamos a utilizar...
# command line options
KNOCKD_OPTS="-i eth0"
Luego, tenemos que personalizar el fichero /etc/knockd.conf para especificar qué secuencia de puertos queremos y qué hacer cuando ésta llegue. En el “man knockd” encontramos interesantes ejemplos de uso, pero podemos centrarnos en el más típico que es el que instala Debian por defecto:
No hay que olvidar que lo que pretendemos es abrir un puerto de nuestro firewall, tras una secuencia de golpeo, y para abrir un puerto el requisito indispensable es que primero ha de estar cerrado, con lo que esto nos lleva a partir de que el puerto 22 ha de estar cerrado en nuestro firewall por ejemplo la siguiente que solo permite conexiones salientes desde nuestra maquina y cierra todos los puertos de entrada...
iptables -P INPUT DROP
iptables -A INPUT -i lo -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Tras configurar el /etc/knockd.conf a nuestro gusto, arrancamos el knockd con /etc/init.d/knockd start
iptables -A INPUT -i lo -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Tras configurar el /etc/knockd.conf a nuestro gusto, arrancamos el knockd con /etc/init.d/knockd start
Ya esta listo nuestro "PORTERO", ahora sólo necesitamos alguien o algo que le diga la contraseña para que nos deje pasar, lo que haremos es crearnos un script para hacer este proceso fácil en la maquina cliente... con la herramienta nmap podemos hacer la llamada de puertos fácilmente:
Para probar tan solo nos hace falta llamar a la puerta:
Con esto Knockd nos abrirá la puerta a ssh, tras hacer lo que tengamos que hacer la cerraremos con nuestra secuencia de cierre...
Knock 192.168.100.2 9000 8000 7000
Conclusión
Hemos conseguido securizar nuestro servicio SSH de tal forma que, para que alguien entre, necesitaría saber primero el puerto por el que estamos dando el servicio ssh, luego debería saber cual es nuestra secuencia de golpeo de puertos, saber el password de un usuario con permisos para utilizar ssh en remoto, saber su contraseña, y no podrá usar ssh con permisos de root.....una misión solo apta para "hackers muy aguerridos..."....
Un saludo, Manuel.
Sed buenos :P
Muy interesante. Muchas gracias ;-)
ResponderEliminarMuy buen aporte, solo algunas cosas.
ResponderEliminar1) Falta Latch!!!
Esto lo podéis hacer cómo en este ejemplo con el SDK en Bash
http://www.dexa-dev.com/securizando-un-vps-con-latch-i/
o usar el módulo pam que sale esta semana (Spoiler!).
2) El port knocking tiene el problema de redes en las que los puertos no estándar están bloqueados, y te puedes generar un DOS por no poder llamar a la puerta.
Saludos y enhorabuena por el blog, que ya sabéis que es un fijo en mis RSS.
Saludos Malignos! }:)
gracias por la info,Chema!! y por tu apoyo, muy interesantes ambos puntos...investigare....
EliminarUn saludaco!!!
http://www.hackplayers.com/2014/01/securizando-openssh-mode-paranoico-2.html#more
EliminarMuy buen artículo!! Muchas gracias por la información del knocks, no tenía ni idea....
ResponderEliminarpa eso estamos!!!, nos alegra haberte informado :D
EliminarCreo que cometes un error al indicar el archivo /etc/ssh/ssh_config. Debería ser /etc/ssh/sshd_config al estar hablando de configurar el servidor.
ResponderEliminarGracias por el artículo
Saludos
Manuel Glez.
xd que verguenza.... me cole en el subtitulado....corregido gracias tocayo
EliminarMuy bueno, nunca es tarde para aprender algo nuevo. :-)
ResponderEliminarMuy bueno, gracias.
ResponderEliminarme parece interesante ademas que llegue aquii buscando esta informacion,¿pero como se podria hacer esto mismo en windows?sobre todo este paso Instalar Fail2Ban gracias por vuestra ayuda y muy buen trabajo,saludos.
ResponderEliminarMejor que Latch ;) prefiero un buen 2FA con TOTP, con Google Authenticator, Authy, etc
ResponderEliminarPor otra parte, mejor que port knocking es SPA (Single Packet Authorization)
Saludos y buen post!