jueves, 25 de agosto de 2016

HARDENING SERVIDORES

HARDENING DE SERVIDORES

Ahora vamos a hablar de un tema muy importante en la seguridad de nuestros servidores linux. El mantener una infraestructura informática segura y al margen de atacantes siempre es una tarea complicada. Son muchos los aspectos a tener en cuenta. A los diferentes dispositivos en un entorno en red hay que añadirle la heterogeneidad de los sistemas operativos que la componen y los servicios prestados.

Para lo cual en este tutorial, veremos algunas aplicaciones y técnicas desde distintos criterios, que servirán para fortalecer la seguridad de nuestros servidores linux

1. DENEGAR ACCESO AL SERVIDOR POR   INTENTOS FALLIDOS

Para esta técnica, utilizaremos la herramienta denyhosts que se encuentra en los repositorios de Debian, para instalarlo ejecutamos:

# apt-get install denyhosts

Una vez instalada la herramienta, procedemos a ajustar la configuración de la aplicación que está en /etc/denyhosts.conf.

##### THESE SETTINGS ARE REQUIRED #####
SECURE_LOG = /var/log/auth.log
HOSTS_DENY = /etc/hosts.deny
PURGE_DENY = 1w
BLOCK_SERVICE = ALL
DENY_THRESHOLD_INVALID = 3
DENY_THRESHOLD_VALID = 3
DENY_THRESHOLD_ROOT = 2
DENY_THRESHOLD_RESTRICTED = 2
WORK_DIR = /home/sec/denyhosts
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
HOSTNAME_LOOKUP=YES
LOCK_FILE = /var/run/denyhosts.pid

##### THESE SETTINGS ARE OPTIONAL #####
ADMIN_EMAIL = diego.donoso@caminosca-sa.com
SMTP_HOST = localhost
SMTP_PORT = 25
#SMTP_USERNAME=root
#SMTP_PASSWORD=rootpass
SMTP_FROM = DenyHosts
SMTP_SUBJECT = DenyHosts Report
SYSLOG_REPORT=YES

AGE_RESET_VALID=5d
AGE_RESET_ROOT=25d
AGE_RESET_RESTRICTED=25d
AGE_RESET_INVALID=10d

##### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE #####
DAEMON_LOG = /home/sec/denyhosts/denyhosts.log
DAEMON_SLEEP = 30s
DAEMON_PURGE = 1h
Con esta configuración lo que hemos hecho es bloquear a un host determinado al tercer intento fallido de logueo al servidor por cualquier puerto o servicio, con cualquier usuario existente o inexistente, desbloqueandolo después de 1 semana. Una vez que se hayan ajustado los cambios deseados, se debe reiniciar el servicio denyhost:

# /etc/init.d/denyhosts restart
[ ok ] Stopping DenyHosts: denyhosts.
[ ok ] Starting DenyHosts: denyhosts.

Para validar que efectivamente se cumple la condición de bloqueo por los n intentos fallidos, vale ejecutar la siguiente instrucción para visualizar los intentos fallidos de logueo al server en el log de autoriazación:

# cat /var/log/auth* | grep Failed | awk '{print $2 "-" $1 " " $3 "\t USUARIO: " $11 "\t DESDE: " $13}'
19-Sep 11:46:16     USUARIO: fer       DESDE: 172.16.5.217
19-Sep 11:46:19     USUARIO: fer       DESDE: 172.16.5.217
19-Sep 11:46:22     USUARIO: fer       DESDE: 172.16.5.217

Como se puede observar, el usuario fer desde la IP 172.16.5.217 tuvo 3 intentos “Failed”.

La siguiente tabla, muestra la descripción de cada parámetro configurable en el archivo /etc/denyhosts.conf, para ajustar a la necesidad de cada administrador:

Parámetro
Descripción
ADMIN_EMAIL
Su dirección de e-mail. Si está presente, este parámetro le permite recibir mensajes de e-mail cada vez que DenyHosts decida bloquear un host. Si usted configura este parámetro, modifique también SMTP_HOST ySMTP_PORT para especificar su servidor de e-mail y para verificar otros parámetros SMTP_ .
AGE_RESET_VALID
Similar a PURGE_DENY (vea a continuación) este define el lapso de tiempo después del cual, si no hay intentos fallidos adicionales, el conteo de fallas para un host se reinicia a cero. AGE_RESET_INVALID es similar pero aplica a intentos (fallidos) de inicio de sesión de usuarios no existentes, mientras que AGE_RESET_ROOTpertenece a intentos fallidos de inicio de sesión raíz. Usted también debe configurar RESET_ON_SUCCESS para definir si el conteo de intentos inválidos para una IP es o no es reiniciado a cero después de un inicio de sesión exitoso. El valor predeterminado es no, pero yo prefiero yes porque si usted algunas veces escribe mal la contraseña, a pesar de haber podido iniciar sesión varias veces, eventualmente quedará bloqueado.
DAEMON_PURGE
Define con qué frecuencia DenyHosts revisa si hay hosts que se deben desbloquear. Este valor puede ser mucho mayor que el tiempo entre ejecuciones, por ejemplo 2h (cada dos horas) o 1d (una vez al día).
DAEMON_SLEEP
Especifica cuánto tiempo espera DenyHosts entre verificaciones sucesivas de SECURE_LOG. Un valor razonable puede ser 30s (treinta segundos), por ejemplo. Usted no deseará ejecutar el script con demasiada frecuencia (gastando ciclos de procesador) ni demasiado esporádicamente (dando total libertar a los piratas).
DENY_THRESHOLD_VALID
Define cuántos intentos fallidos de inicio de sesión (para usuarios válidos, no raíz) serán tolerados antes de bloquear el host. También hay un valor DENY_THRESHOLD_ROOT que aplica exclusivamente para intentos raíz de inicio de sesión, pero usted estará mejor prohibiendo directamente la raíz para que se conecte remotamente mediante SSH con su servidor, como se mostró en el artículo anterior. Otro valor,DENY_THRESHOLD_INVALID, aplica para intentos de inicio de sesión de usuarios no existentes. El valor anterior debe ser menor que aquel para los usuarios válidos, porque es más probable que este tipo de intento de inicio de sesión sea parte de un intento de phishing.
HOSTS_DENY
Debe apuntar al archivo con los datos de acceso de host restringido, el cual normalmente es/etc/hosts.deny. Este parámetro es obligatorio. Si está mal, DenyHosts no funcionará como se espera.
LOCK_FILE
Es la ruta y el nombre del archivo, si existe cuando usted ejecute DenyHosts, que hace que salga inmediatamente (por ejemplo, /tmp/denyhosts.lock). El archivo es similar a /etc/nologin, el cual hace que los intentos de inicio de sesión fallen. Si el archivo no existe cuando usted ejecute DenyHosts, será creado y luego eliminado al salir para evitar tener dos instancias del programa ejecutándose al mismo tiempo.
PLUGIN_DENY
Apunta hacia una aplicación que usted desee ejecutar siempre que se bloquee un host. La aplicación es invocada con el host como un argumento. Usted debe usar esto siempre que desee efectuar acciones adicionales, como actualizar una base de datos. De forma similar, la aplicación referida por PLUGIN_PURGE es llamada cuando un host es removido del archivo HOSTS_DENY.
PURGE_DENY
Define el tiempo después del cual un host bloqueado es permitido nuevamente. Si está vacío los host quedarán bloqueados permanentemente. Esta entrada puede estar en minutos (120m), horas (2h), días (14d), semanas(2w), o años (1y).
PURGE_THRESHOLD
Define cuántas veces un host puede desbloquearse antes de quedar bloqueado para siempre. Si es cero, los host pueden ser bloqueados y desbloqueados un número infinito de veces.
SECURE_LOG
La ruta y nombre del archivo donde sshd registra sus mensajes. Esto varía de distribución a distribución. Por ejemplo es /var/log/messages para openSUSE®, pero para otras distribuciones use /var/log/secure o /var/log/auth.log. Recuerde también configurar sshd de forma que produzca registros. Si este parámetro está equivocado, DenyHosts simplemente no funcionará.
WORK_DIR
La ruta para los archivos propios DenyHosts, la cual normalmente es /usr/share/denyhosts/data. Si la ruta no existe, será creada.