¿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.
Respuestas:
Utilice pares de claves públicas / privadas para la autenticación en lugar de contraseñas.
Genere una clave SSH protegida con frase de contraseña para cada computadora que necesite acceder al servidor:
ssh-keygen
Permita el acceso SSH de clave pública desde las computadoras permitidas:
Copie el contenido de
~/.ssh/id_rsa.pub
cada computadora en líneas individuales~/.ssh/authorized_keys
del servidor, o ejecútelossh-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).Deshabilitar contraseña de acceso SSH:
Abra
/etc/ssh/sshd_config
, encuentre la línea que dice#PasswordAuthentication yes
y cámbiela aPasswordAuthentication 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.fuente
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 no
a 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 group2
oAllowUsers user1 user2
limite quién puede SSH al servidor.fuente
sshd
configuración es correcta antes de reiniciar sshd, para evitar bloquearse de la máquina. Consulte este blog para obtener más detalles: simplemente ejecutesshd -T
después de un cambio de configuración antes de reiniciar el mainsshd
. 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.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.
fuente
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:
sudo apt-get install libpam-google-authenticator
Haga que cada usuario ejecute el
google-authenticator
comando, que genera~/.google-authenticator
y les ayuda a configurar sus dispositivos de dos factores (por ejemplo, la aplicación Google Authenticator de Android).Editar
/etc/ssh/sshd_config
y configurar:Corre
sudo service ssh reload
para recoger tus cambios/etc/ssh/sshd_config
.Edite
/etc/pam.d/sshd
y reemplace la línea:con:
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 .
fuente
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.
fuente
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:
Si ufw no está instalado, haga esto e intente nuevamente:
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.
fuente
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 .
localhost
./etc/tor/torrc
. EstablecerHiddenServiceDir /var/lib/tor/ssh
yHiddenServicePort 22 127.0.0.1:22
.var/lib/tor/ssh/hostname
. Hay un nombre comod6frsudqtx123vxf.onion
. Esta es la dirección del servicio oculto.Abra
$HOME/.ssh/config
y agregue algunas líneas:Además, necesito Tor en mi host local. Si está instalado, puedo ingresar
ssh myhost
y 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".fuente
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 .
fuente
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.
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.
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).
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).
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 ...
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.
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.
fuente
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 .
fuente
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/
fuente
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
fuente
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.
fuente