27 may 2010

Seguridad en SSH (2)

Después de ver en el artículo anterior los peligros a los que estamos expuestos si tenemos nuestro servidor SSH mal configurado, veamos como configurarlo de manera segura.
Para acceder a la configuración del servidor SSH accedemos a la carpeta /etc/ssh/ donde se encuentra en el fichero sshd_config. Veamos un ejemplo de su contenido:



# Package generated configuration file
# See the sshd(8) manpage for details

# What ports, IPs and protocols we listen for
Port 60000
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers mrproper
MaxStartups 3

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive no
ServerAliveInterval 60
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

UsePAM yes

A continuación veremos las principales opciones de seguridad. Para ver el resto de las opciones puedes recurrir a la extensa información de man sobre ssh (man sshd_config y man sshd). Es aconsejable tener claro como funciona la criptografía asimétrica (o de llave pública) para entender las opciones relacionadas con este tema.

  • Port 22: Establece el puerto en el que escucha el servidor SSH, por defecto se usa el puerto 22. No es aconsejable usar el puerto por defecto pues si usamos este puerto nos arriesgamos a ser blanco de múltiples ataques. El cambio del puerto utilizado nos ahorrará un montón de problemas siendo recomendable usar un puerto en el rango de los puertos privados. Puedes consultar el rango de estos puertos en el fichero /proc/sys/net/ipv4/ip_local_port_range, en Ubuntu 8.04 el rango es 32768 - 61000.
  • ListenAddress 0.0.0.0: Establece la IP en la cual escuchara el servicio, muy importante si queremos dar servicio solamente en nuestra red local; pues nos evitará ataques desde otras redes como internet. Si lo dejamos a 0.0.0.0 el servidor escuchara en todas las ips de la máquina.
  • Protocol 2: Estable el protocolo a usar, es recomendable usar el protocolo 2 pues incluye numerosas mejoras en cuanto a seguridad.
  • HostKey /etc/ssh/ssh_host_rsa_key

    HostKey /etc/ssh/ssh_host_dsa_key


    Ubicación de las claves privadas usadas por el servidor. Es importante controlar el acceso a estas claves pues son usadas para establecer la identidad del servidor y descifrar los mensajes recibidos, por lo que si cayeran en manos de un atacante este podría descifrar el tráfico capturado o suplantar la identidad de nuestro servidor.
  • Clave Pública
  • UsePrivilegeSeparation yes: Si lo establecemos a sí (opción muy recomendada) el servicio se ejecutará con unos privilegios mínimos creando un nuevo hilo con los privilegios propios del usuario una vez autentificado. El objetivo es evitar un escalado de privilegios, por ejemplo por medio del uso de exploits.
  • KeyRegenerationInterval 3600
    ServerKeyBits 768

    Tiempo de vida de la clave del servidor y longitud de la misma, se usa sólo para el protocolo versión 1, es preferible usar el protocolo versión 2.
  • SyslogFacility AUTH: establece que clave de syslog se usará para guardar los logs, podemos ver la configuración de syslog en /etc/syslog.conf. La clave AUTH guarda los mensajes en el fichero /var/log/auth.log. Para ver estos mensajes podemos hacerlos usando cat y filtrando con grep "cat /var/log/auth.log | grep sshd".
  • LogLevel INFO: establece el nivel de información que se guardara en el log, de menos información a más los niveles son: SILENT, QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, y DEBUG3.
  • LoginGraceTime 120: tiempo en segundos antes de desconectar un usuario conectado pero no autentificado (usuario en el proceso de login).
  • PermitRootLogin no: indica como puede loguearse el super usuario. Las opciones son:
    • “yes” puede loguearse como el resto de usuarios.
    • “without-password” sólo puede loguerase mediante clave pública.
    • “forced-commands-only” permite login con clave pública; pero limitando su uso al lanzamiento de comandos establecidos con la opción "command" de sshd.
    • “no” el usuario root no puede loguearse
    Es preferible establecer esta opción a no y hacer uso de sudo para las tareas que necesiten permisos de root, pues como ya vimos la cuenta de root es una de las que más ataques sufre.
  • StrictModes yes: comprueba que los ficheros de claves de ssh del usuario no sean accesible para otros usuarios de la máquina con lo cual podrían descifrar el tráfico de este.
  • ServerAliveInterval 60: intervalo en segundos en el cual se comprobará periódicamente si el usuario sigue conectado. Este mensaje se envía a través del canal cifrado al contrario que la opción TCPKeepAlive. Lo recomendable es activar ServerAliveInterval y establecer TCPKeepAlive no.
  • AllowUsers usuario1 usuario2 usuario3: lista con los usuarios que pueden acceder vía SSH. Esta opción es una de las más importantes porque nos permite establecer con seguridad que usuarios pueden hacer uso del SSH. Evitando así problemas al instalar servicios que agregan sus propios usuarios, pues estos usuarios son los primeros que un atacante intentaría usar.
  • MaxStartups 1: número máximo de usuarios no autentificados conectados al servidor. Útil a la hora de evitar un consumo excesivo de recursos ante un ataque.
  • PubkeyAuthentication yes: Habilita la autentificación mediante clave pública
  • AuthorizedKeysFile %h/.ssh/authorized_keys: establece la ubicación de las clave públicas de los usuarios (%h hace referencia al directorio home).
  • IgnoreRhosts yes
    HostbasedAuthentication no
    Desabilita los ficheros .rhosts y .shosts de los usuarios. Estos ficheros permiten la conexión remota a otras máquinas sin emplear contraseña.
  • PermitEmptyPasswords no: permite el acceso a usuarios sin clave. Permitir el acceso a estos usuarios es un suicidio, salvo casos muy concretos, desde el punto de vista de la seguridad.
  • PasswordAuthentication yes: establece si se puede realizar el login mediante nombre y contraseña. Es mucho más seguro el uso de claves públicas; pero esto obliga al usuario a tener el archivo de la clave a mano a la hora de acceder al SSH. Si establecemos esta opción a sí es muy importante el uso de claves seguras para todos los usuarios del sistema, evitando así el éxito de los ataques por fuerza bruta.
  • X11Forwarding yes: permite abrir programas en modo gráfico de forma remota. Esto puede plantear algunos problemas de seguridad en el equipo local si el servidor ha sido comprometido. Si un atacante pudiera leer el fichero .Xauthority tendría acceso completo a nuestro escritorio (más información aquí y aquí).
  • AcceptEnv LANG LC_*: Establece que variables de nuestro cliente de SSH serán pasadas al servidor. Algunas variables pueden ser usadas para saltarse restriccines impuestas en el servidor. La configuración por defecto acepta las variables de lenguaje y regionales.
  • MaxAuthTries 6: Establece el número máximo de intentos de autentificación por conexión. Si se alcanza la mitad de este valor los intentos serán escritos al fichero de log.

Es una buena práctica revisar de vez en cuando el fichero de log del servidor para asegurarse que todo marcha bien. Con la orden sudo cat /var/log/auth.log | grep sshd podemos ver la información generada por el demonio sshd y también es interesante revisar los intentos de autentificación inválidos usando sudo cat /var/log/auth.log | grep sshd | grep Fail.

No hay comentarios: