¿Cómo endurecer un servidor SSH?

128

¿Qué medidas puedo / debo tomar para asegurarme de que la seguridad alrededor de mi servidor SSH sea absolutamente impermeable?

Esta será la wiki de la comunidad desde el principio, así que veamos qué hacen las personas para proteger sus servidores.

LassePoulsen
fuente
44
La impermeabilidad absoluta requiere apagar la caja.
Thorbjørn Ravn Andersen
¿Qué pasa si tienes Wake-on-LAN?
rebus
El problema sería los paquetes LAN parte ... Wake-on-LAN no se enrutan, por lo que tendría que tener acceso a una máquina dentro de la LAN para enviar el paquete WOL ...
LassePoulsen
Para la autenticación de clave, puede limitar los cifrados a los cifrados que realmente necesita.

Respuestas:

108

Utilice pares de claves públicas / privadas para la autenticación en lugar de contraseñas.

  1. Genere una clave SSH protegida con frase de contraseña para cada computadora que necesite acceder al servidor:

    ssh-keygen

  2. Permita el acceso SSH de clave pública desde las computadoras permitidas:

    Copie el contenido de ~/.ssh/id_rsa.pubcada computadora en líneas individuales ~/.ssh/authorized_keysdel servidor, o ejecútelo ssh-copy-id [server IP address]en cada computadora a la que le está otorgando acceso (deberá ingresar la contraseña del servidor cuando se le solicite).

  3. Deshabilitar contraseña de acceso SSH:

    Abra /etc/ssh/sshd_config, encuentre la línea que dice #PasswordAuthentication yesy cámbiela a PasswordAuthentication no. Reinicie el demonio del servidor SSH para aplicar el cambio ( sudo service ssh restart).

Ahora, la única forma posible de SSH en el servidor es usar una clave que coincida con una línea ~/.ssh/authorized_keys. Usando este método, que no se preocupan por los ataques de fuerza bruta, porque incluso si adivinar la contraseña, será rechazada. Forzar con fuerza bruta un par de claves pública / privada es imposible con la tecnología actual.

Evan Kroske
fuente
55
-1: Generalmente se otorga acceso a individuos, no a computadoras, por lo que no es razonable crear una clave para cada computadora cliente potencial que se conecta al servidor. Su última declaración no es correcta, según su sugestión y porque no sugirió establecer una frase de contraseña para las claves privadas que tienen acceso / comprometer cualquiera de los sistemas del cliente otorgaría automáticamente acceso al servidor SSH. Se recomienda la autenticación de clave SSH, pero las claves privadas deben estar protegidas adecuadamente y deben usarse de forma individual, no distribuida como se describe.
João Pinto
77
"Por lo general, se otorga acceso a individuos, no a computadoras, por lo que crear una clave para cada computadora cliente potencial que se conecta al servidor no es razonable" Hay muchas opciones y creo que describir cómo transferir de manera segura una clave privada a cada cliente parece estar fuera del alcance de esta pregunta . No presento todas las opciones, solo una simple que creo que la gente puede entender. "... debe usarse de forma individual, no de manera distribuida como se describe" Esto parece contradecir su declaración anterior y no describí nada como distribuido.
Asa Ayers
55
"imposible" es quizás exagerar un poco.
Thorbjørn Ravn Andersen
99
Por eso digo "imposible". Nadie tiene computadoras tan rápidas así de pequeñas tanto o tanto tiempo. "Imagine una computadora del tamaño de un grano de arena que puede probar claves con algunos datos cifrados. También imagine que puede probar una clave en la cantidad de tiempo que tarda en cruzarla. Luego considere un grupo de estas computadoras, tantos que si cubrieras la tierra con ellos, cubrirían todo el planeta hasta la altura de 1 metro. El grupo de computadoras rompería una clave de 128 bits en promedio en 1,000 años ".
Asa Ayers
@ ThorbjørnRavnAndersen "Imposible" no lo está exagerando realmente, siempre y cuando utilice una tecla fuerte. No puedo encontrar una cita en este momento, pero con las longitudes de teclas actuales, los ataques de fuerza bruta no son factibles "hasta que las computadoras estén compuestas de algo diferente a la materia y ocupen algo que no sea el espacio".
Maximillian Laumeister
72

Yo sugeriría:

  • Uso de fail2ban para evitar intentos de inicio de sesión de fuerza bruta.

  • Deshabilitar el inicio de sesión como root a través de SSH. Esto significa que un atacante tenía que descubrir tanto el nombre de usuario como la contraseña, lo que dificultaba un ataque.

    Añadir PermitRootLogin noa tu /etc/ssh/sshd_config.

  • Limitar los usuarios que pueden SSH al servidor. Ya sea por grupo o solo por usuarios específicos.

    Agregue AllowGroups group1 group2o AllowUsers user1 user2limite quién puede SSH al servidor.

Mark Davidson
fuente
2
Los AllowUsers y AllowGroups no acepta una coma , como delimitador. Asegúrate de no probar esto de forma remota. Sigo bloqueado mi NAS haciendo esto incorrectamente.
ruido sin sentido
44
Siempre valide que su sshdconfiguración es correcta antes de reiniciar sshd, para evitar bloquearse de la máquina. Consulte este blog para obtener más detalles: simplemente ejecute sshd -Tdespués de un cambio de configuración antes de reiniciar el main sshd. Además, tenga una sesión SSH abierta en la máquina cuando realice el cambio de configuración, y no cierre esto hasta que haya validado la configuración como se mencionó y tal vez haya realizado una prueba de inicio de sesión SSH.
RichVel
24

Otras respuestas brindan seguridad, pero hay una cosa que puede hacer que hará que sus registros sean más silenciosos y que sea menos probable que se bloquee su cuenta:

Mueva el servidor del puerto 22 a otro. Ya sea en su puerta de enlace o en el servidor.

No aumenta la seguridad, pero significa que todos los escáneres aleatorios de Internet no saturarán sus archivos de registro.

Douglas Leeder
fuente
1
Para aquellos que creen en la seguridad por la oscuridad ( en.wikipedia.org/wiki/Security_through_obscurity ) tiene mucho sentido usar otro puerto. Aunque no ...
LassePoulsen
32
No se trata de Seguridad a través de la oscuridad (aunque la oscuridad puede tener un efecto marginal positivo). Se trata de reducir el ruido de fondo de los infinitos intentos de fuerza bruta. No puede auditar útilmente sus registros de fallas de acceso si están llenos de ataques automáticos; fail2ban no reduce el volumen lo suficiente dada la cantidad de atacantes y la prevalencia de ataques distribuidos (botnet) y estrangulados. Con ssh en un puerto inusual, sabes que los ataques que ves en los registros provienen de un atacante real interesado en tu caja. Lo recomiendo mucho
bobince
Dado que puede consultar servicios de Internet como shodan para servidores ssh orientados a la web, o usar nmap y la captura de banner hace que cambiar el puerto predeterminado sea prácticamente inútil. Aconsejaría contra esto.
Lento Loris
Shodan no toma todos los puertos de 65k, por lo que cambiar a un puerto alto probablemente lo eliminará de sus escaneos. Además, si se mueve a un puerto alto aleatorio, es probable que el atacante deba realizar escaneos TCP de 65K (muy ruidoso) para encontrar su servicio y comenzar a atacarlo. Ambas son victorias desde una perspectiva de seguridad, por lo que mudarse a un puerto alto generalmente es un buen plan. Otra es que al trasladarse a un puerto alto puede tener una mejor idea de que alguien que lo está atacando está apuntando específicamente a sus sistemas en lugar de solo el ruido de fondo general de Internet
Rоry McCune
23

Habilite la autenticación de dos factores con HOTP o TOTP . Esto está disponible desde 13.10 en adelante.

Esto incluye el uso de la autenticación de clave pública sobre la autenticación de contraseña como en otra respuesta aquí, pero también requiere que el usuario pruebe que posee su dispositivo de segundo factor además de su clave privada.

Resumen:

  1. sudo apt-get install libpam-google-authenticator

  2. Haga que cada usuario ejecute el google-authenticatorcomando, que genera ~/.google-authenticatory les ayuda a configurar sus dispositivos de dos factores (por ejemplo, la aplicación Google Authenticator de Android).

  3. Editar /etc/ssh/sshd_configy configurar:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Corre sudo service ssh reloadpara recoger tus cambios /etc/ssh/sshd_config.

  5. Edite /etc/pam.d/sshdy reemplace la línea:

    @include common-auth
    

    con:

    auth required pam_google_authenticator.so
    

Más detalles sobre las diferentes opciones de configuración son mi publicación de blog del año pasado: Mejor autenticación ssh de dos factores en Ubuntu .

Robie Basak
fuente
21

Haga que las IP del cliente de bloque sshd que no hayan podido proporcionar la información de inicio de sesión correcta " DenyHØsts " puedan hacer este trabajo con bastante eficacia. Tengo esto instalado en todas mis cajas de Linux que de alguna manera son accesibles desde el exterior.

Esto asegurará que los ataques de fuerza en el SSHD no sean efectivos, pero recuerde (!) De esta manera puede terminar bloqueándose si olvida su contraseña. Esto puede ser un problema en un servidor remoto al que no tiene acceso.

LassePoulsen
fuente
2
¿Hay alguna opción como 10 intentos fallidos de inicio de sesión antes de prohibir la dirección IP?
sayantankhan
20

Aquí hay una cosa fácil de hacer: instale ufw (el "firewall sin complicaciones") y úselo para calificar las conexiones entrantes limitadas.

Desde un símbolo del sistema, escriba:

$ sudo ufw limit OpenSSH 

Si ufw no está instalado, haga esto e intente nuevamente:

$ sudo aptitude install ufw 

Muchos atacantes intentarán usar su servidor SSH para contraseñas de fuerza bruta. Esto solo permitirá 6 conexiones cada 30 segundos desde la misma dirección IP.

mpontillo
fuente
+1 Usar límite puede ser bueno. Sin embargo, debo señalar que he encontrado problemas al usar el servidor sftp incorporado, ya que también limita las conexiones para esto.
Mark Davidson
2
@ Mark: buen punto, pero ¿no suena eso como un cliente SFTP mal escrito? ¿Por qué seguirían reconectándose al puerto SSH cuando podrían abrir más canales SSH?
mpontillo
12

Si quiero tener alguna seguridad adicional o necesito acceder a servidores SSH dentro de alguna red corporativa, configuro un servicio oculto utilizando el software de anonimización Tor .

  1. Instala Tor y configura el servidor SSH.
  2. Asegúrese de que sshd solo escuche localhost.
  3. Abierto /etc/tor/torrc. Establecer HiddenServiceDir /var/lib/tor/sshy HiddenServicePort 22 127.0.0.1:22.
  4. Mira var/lib/tor/ssh/hostname. Hay un nombre como d6frsudqtx123vxf.onion. Esta es la dirección del servicio oculto.
  5. Abra $HOME/.ssh/configy agregue algunas líneas:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Además, necesito Tor en mi host local. Si está instalado, puedo ingresar ssh myhosty SSH abre una conexión a través de Tor. El servidor SSH en el otro lado abre su puerto solo en localhost. Para que nadie pueda conectarse a través de "Internet normal".

qbi
fuente
10
Seguridad por oscuridad avanzada, pero muy interesante.
Johannes
8

Hay un artículo de la Administración de Debian sobre este tema. Cubre la configuración básica del servidor SSH y también las reglas de firewall. Esto podría ser de interés también para fortalecer un servidor SSH.

Ver artículo: Mantener seguro el acceso SSH .

Huygens
fuente
3
Un poco tarde, pero por favor, cuando conteste preguntas, copie las partes importantes de un enlace para que si el enlace se descompone, la información todavía esté aquí.
Umop aplsdn
1
Buena idea. Aunque estoy en un período con mucho menos tiempo para participar. Mi respuesta es un "wiki comunitario", así que siéntase libre de agregar la información del enlace si tiene tiempo.
Huygens
6

Mi enfoque para el endurecimiento de SSH es ... complejo. Los siguientes elementos están en términos de cómo lo hago, desde el borde más extremo de mi (s) red (es) hasta los propios servidores.

  1. Filtrado de tráfico a nivel de borde a través de IDS / IPS con escáneres de servicio conocidos y firmas en la lista de bloqueo. Lo logro con Snort a través de mi firewall de borde (este es mi enfoque, un dispositivo pfSense). Sin embargo, a veces no puedo hacer esto, como con mis VPS.

  2. Cortafuegos / filtrado de red de los puertos SSH. Explícitamente, solo permito que ciertos sistemas lleguen a mis servidores SSH. Esto se hace a través de un servidor de seguridad pfSense en el borde de mi red, o los servidores de seguridad en cada servidor se configuran explícitamente. Sin embargo, hay casos en los que no puedo hacer esto (que casi nunca es el caso, excepto en entornos privados de pruebas de seguridad o de laboratorio de prueba de seguridad donde los firewalls no ayudarán a probar cosas).

  3. Junto con mi pfSense, o un firewall de borde que conecta la red interna con la NAT y se separa de Internet y de los sistemas, acceso solo a servidores VPN . Tengo una VPN en mis redes para llegar a los servidores, porque no hay puertos con conexión a Internet como tales. Esto definitivamente no funciona para todos mis VPS, pero en conjunto con el n. ° 2, puedo hacer que un VPS sea la 'puerta de enlace' al VPNar en ese servidor, y luego permitir que sus IP pasen a las otras cajas. De esa manera, sé exactamente qué puede o no puede hacer SSH: mi única caja que es la VPN. (O, en mi red doméstica detrás de pfSense, mi conexión VPN, y soy el único con acceso VPN).

  4. Donde el # 3 no es factible, fail2ban, configurado para bloquear después de 4 intentos fallidos y bloquear las IP durante una hora o más, es una protección decente contra las personas que constantemente atacan con fuerza bruta: simplemente bloquéelos en el firewall automáticamente con fail2ban y meh. Sin embargo, configurar fail2ban es una molestia ...

  5. Ofuscación de puertos cambiando el puerto SSH. Sin embargo, esto NO es una buena idea sin otras medidas de seguridad adicionales : el mantra de "Seguridad a través de la oscuridad" ya ha sido refutado y disputado en muchos casos. Lo he hecho junto con IDS / IPS y el filtrado de red, pero todavía es algo MUY pobre de hacer por sí solo.

  6. Autenticación obligatoria de dos factores, a través de las soluciones de autenticación de dos factores de Duo Security . Todos y cada uno de mis servidores SSH tienen configurado Duo, de modo que incluso para ingresar, ocurren avisos de 2FA y tengo que confirmar cada acceso. (Esta es la última característica útil, porque incluso si alguien tiene mi frase de contraseña o interrumpe, no pueden pasar los complementos de Duo PAM). Esta es una de las mayores protecciones en mis servidores SSH contra el acceso no autorizado: cada inicio de sesión de usuario DEBE vincularse a un usuario configurado en Duo, y dado que tengo un conjunto restrictivo, no se pueden registrar nuevos usuarios en el sistema.

Mis dos centavos para asegurar SSH. O, al menos, mis pensamientos sobre el enfoque.

Thomas W.
fuente
1

Es posible que desee probar la aplicación FreeOTP de RedHat en lugar de usar Google Authenticator. A veces, al actualizar la aplicación, ¡te bloquean! ;-)

Si desea utilizar otros tokens de hardware como un Yubikey o un eToken PASS o NG o si tiene muchos usuarios o muchos servidores, es posible que desee utilizar un servidor de autenticación de dos factores de código abierto.

Últimamente escribí un tutorial sobre esto .

cornelinux
fuente
0

Escribí un pequeño tutorial sobre cómo hacer esto recientemente. Básicamente, debe usar PKI y mi tutorial también muestra cómo usar la autenticación de dos factores para una mayor seguridad. Incluso si no usa ninguna de esas cosas, también hay algunas cositas sobre la seguridad del servidor mediante la eliminación de conjuntos de cifrado débiles y otros elementos básicos. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

01000101
fuente
0

Para un gran número de usuarios / certificados, considere la integración LDAP. Las grandes organizaciones usan LDAP como repositorio de credenciales de usuario y certificados almacenados en distintivos o llaveros, ya sea que los certificados se usen para autenticación o firma de correos electrónicos. Los ejemplos incluyen openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

Las computadoras y los grupos también se pueden administrar en LDAP, lo que brinda una administración central de credenciales. De esta forma, los servicios de asistencia pueden tener una ventanilla única para atender a grandes poblaciones.

Aquí hay un enlace a la integración de centOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

weller1
fuente
0

También puede bloquear según el país de origen utilizando la base de datos geoIP.

Básicamente, si vives en los EE. UU., Entonces no hay razón para que alguien en Rusia se conecte a tu SSH, por lo que se bloqueará automáticamente.

El script se puede encontrar aquí: https://www.axllent.org/docs/view/ssh-geoip/

También puede agregarle comandos de iptables (lo hice para mis gotitas) para soltar automáticamente todo el tráfico hacia / desde esas IP.

Michael A Mike
fuente
1
Ocasionalmente, las bases de datos de GeoIP pueden estar equivocadas. Me preguntaron si estuve en Moscú ayer ... ¡eh no! :)
Sean