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
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.
|