Securizando openssh MODE PARANOICO 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".. 1. Configurar adecuadamente ssh /etc/ssh/sshd_config Dentro 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 1247 port 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 yesAuthorizedKeysFile .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 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...".... 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 secur... Leer más »
Cómo acceder a un terminal SSH desde el navegador web Normalmente en las empresas los firewalls perimetrales sólo permiten el tráfico HTTP(s) hacia Internet. Hoy vamos a ver otra herramienta para poder evadir esta restricción y poder ejecutar un terminal SSH a través del navegador: Shell In A Box (o ShellInABox).ShellInABox es un emulador de terminal web basado en ajax para cualquier navegador que soporte Javascript y CSS sin necesidad de disponer de ningún plugin adicional.Existen otros emuladores para navegador mediante complementos como NaCl o FireSSH, si bien necesitarás acceso al exterior por el puerto 22/TCP. Con ShellInABox accederás directamente al puerto 443/TCP de HTTPS.Ahora bien, ¿por qué no cambiar el puerto del demonio SSH del 22/TCP al 443/TCP y dejarnos de tanta historia? Pues principalmente porque no tendrás necesidad de utilizar otro cliente como Putty y porque muchos firewalls con inspección de paquetes detectarían el intercambio de claves al menos que lo ofuscemos con ossh y Potty. Al instalar certificados SSL/TTL, ShellInABox cifrará todas las comunicaciones cliente-servidor y también hará más difícil la labor de detección de los firewalls/NIDS más "inteligentes".En esta entrada vamos a probar a instalar ShellInABox en un máquina virtual con Kali Linux: root@kali:~# apt-get install openssl shellinabox Por defecto, el servidor web shellinboxd escuchará en el puerto 4200/TCP. Para modificarlo simplemente lo cambiaremos en el fichero de configuración: root@kali:~# vi /etc/default/shellinabox # Should shellinaboxd start automatically SHELLINABOX_DAEMON_START=1 # TCP port that shellinboxd's webserver listens on SHELLINABOX_PORT=443 # Parameters that are managed by the system and usually should not need # changing: # SHELLINABOX_DATADIR=/var/lib/shellinabox # SHELLINABOX_USER=shellinabox # SHELLINABOX_GROUP=shellinabox # Any optional arguments (e.g. extra service definitions). Make sure # that that argument is quoted. # # Beeps are disabled because of reports of the VLC plugin crashing # Firefox on Linux/x86_64. SHELLINABOX_ARGS="--no-beep" Durante la instalación, si no encuentra un certificado adecuado, shellinaboxd intenta crear uno nuevo autofirmado (certificate.pem) mediante openssl. En ese caso el certificado creado se ubica en /var/lib/shellinabox. Si por lo que sea no se ha creado correctamente podéis crearlo vosotros mismos. Para empezar a utilizarlo, simplemente iniciaremos los servicios: root@kali:~# service ssh start [ ok ] Starting OpenBSD Secure Shell server: sshd. root@kali:~# service shellinabox start root@kali:~# service shellinabox status Shell In A Box Daemon is running Y comprobamos el acceso a través de nuestro navegador: Fuentes y referencias: - shellinabox - Web based AJAX terminal emulator - How to access ssh terminal in web browser on Linux - Shell In A Box – A Web-Based SSH Terminal to Access Remote Linux Servers - Crea un tunel TCP a través de HTTP mediante Tunna - Evadir un portal cautivo mediante un túnel DNS - Cómo crear un túnel SSH entre un servidor Linux y un cliente Windows Normalmente en las empresas los firewalls perimetrales sólo permiten el tráfico HTTP(s) hacia Internet. Hoy vamos a ver otra herramient... Leer más »