Ya de vuelta de la Cybercamp 2016, de la cual os hablaré en próximos post, me he decidido a terminar esta pequeña guía sobre el hardening básico que al menos yo le aplico a mis instalaciones de Debian.
Seguramente no necesitáis aplicar todo lo que recomiendo o quizás algunas opciones no se ajusten a lo que vayáis a necesitar. Esto no es un dogma a seguir a rajatabla, os recomiendo que os paréis a ver lo que hacen las distintas opciones que recomiendo en cada parte y, en lugar de limitaros a hacer copy/paste adapteis lo que yo os doy a vuestras necesidades.
Aunque en el título especifico Debian, cualquier distro derivada debería de ser compatible con esta guía.
Indicaros que para aplicar estos cambios os harán falta permisos de root así que tendréis estar logueados como tal o bien tener un usuario con sudo.
Antes de nada os recomiendo actualizar el sistema para aseguraros de que tenéis los últimos parches de seguridad:
apt-get update; apt-get upgrade; apt-get dist-upgrade
Vamos a comenzar con un clásico: iptables.
Para comenzar vamos a instalarnos el paquete iptables-persistent:
apt-get install iptables-persistent
Este paquete nos ayudará a que nuestras reglas de iptables se carguen en el arranque y tener una manera fácil y sencilla de mantenerlas.
Durante la instalación os habrá preguntado si queréis guardar vuestras reglas actuales, dependiendo de lo que hayáis seleccionado os habrá creado el archivo /etc/iptables/rules.v4 ,en caso de que no lo tengáis lo tendréis que crear a mano.
Editaremos el anteriormente mencionando /etc/iptables/rules.v4 para que quede así:
*nat :PREROUTING ACCEPT [48:11060] :INPUT ACCEPT [2:104] :OUTPUT ACCEPT [5:270] COMMIT *filter :INPUT DROP [27:7448] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [325:462098] -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT COMMIT
Lo que hacen estas reglas es cortar todo intento de conexión a la máquina excepto las ya existentes, de forma que si estáis por SSH no os quedáis fuera en ese momento.
Si queréis abrir un puerto durante el arranque simplemente sería añadir una linea como la siguiente antes del último COMMIT:
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
O si queréis abrirlo de forma puntual ejecutas el comando:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Y luego para cerrarlo:
iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Para guardar el conjunto de reglas que tengáis en un momento podéis lanzar el siguiente comando:
iptables-save > /etc/iptables/rules.v4
Y para restaurarlas:
iptables-restore < /etc/iptables/rules.v4
Iptables es un mundo en sí, así que os recomiendo le hecheis un vistazo en profundidad para añadir vuestras propias reglas según lo que necesitéis.
Lo siguiente que vamos a hacer es hacerle un poco de hardening al kernel, para ello editamos el archivo /etc/sysctl.conf y añadimos las siguientes lineas al final:
net.ipv4.icmp_echo_ignore_all=1 net.ipv4.icmp_echo_ignore_broadcasts=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1 net.ipv6.conf.eth0.disable_ipv6=1 kernel.core_uses_pid=1 kernel.ctrl-alt-del=0 kernel.kptr_restrict=2 kernel.sysrq=0 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.all.log_martians=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.default.accept_source_route=0 net.ipv4.conf.default.log_martians=1 net.ipv4.tcp_timestamps=0 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.all.accept_source_route=0 net.ipv6.conf.default.accept_redirects=0 net.ipv4.conf.all.forwarding=0
Como veis están un poco «desordenadas», esto es preferencia mía, si os fijáis el primer bloque de reglas net lo que hace es desactivar ping e ipv6, y el otro bloque ya son cosas mucho más específicas; de todas maneras el orden de los factores no altera el producto.
Como en el caso de iptables os recomiendo revisar y ver que necesitáis y que no, por ejemplo, seguramente algunos querréis habilitar el poder pasar tráfico entre interfaces con lo cual la ultima regla la deberíais eliminar.
Una vez tengamos el archivo editado lanzaremos el siguiente comando para aplicar los cambios, o también podéis reiniciar, es vuestro uptime no el mio:
sysctl -p
El siguiente paso va a ser cambiar un poco la configuración de SSH para volverlo más robusto. Para ello editamos el archivo /etc/ssh/sshd_config y modificamos/añadimos las siguientes opciones para que queden así:
UsePrivilegeSeparation SANDBOX LogLevel VERBOSE PermitRootLogin no X11Forwarding no TCPKeepAlive no AllowTcpForwarding no ClientAliveCountMax 2 Compression no MaxAuthTries 3 MaxSessions 2
Os habréis fijado que no he cambiado el puerto, esto es muy recomendable, ya que si dejáis SSH se queda a la escucha un simple nmap revelará que el servicio esta ahí, pero eso ya lo dejo a vuestra elección.
Reiniciamos el servicio de SSH para aplicar los cambios:
/etc/init.d/ssh restart
Por último vamos a aplicar una política segura para las contraseñas.
Instalamos el modulo pam_passwdqc para PAM:
apt-get install libpam-passwdqc
Y modificamos el archivo /etc/login.defs para que quede así:
PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 7
Insisto de nuevo en que esto es una simple recomendación, ajustar los valores según os sea necesario.
Una recomendación que os daría a título personal sería que deshabilitarais todos aquellos servicios que no necesitéis, sobre todo aquellos que escuchan en algún puerto. A pesar de que iptables ya debería bloquearlos nunca está de más, para el servicio de CUPS por ejemplo:
/etc/init.d/cups stop; systemctl disable cups
El anterior comando lo que hace es, primero parar el servicio y posteriormente evitar que se inicie durante el arranque. Esto no evita que terceras aplicaciones puedan levantar el servicio por su cuenta, simplemente le indica al sistema que, si nadie lo pide, no lo arranque.
Si queréis tener una idea general del estado de hardening de vuestra máquina os recomiendo que probéis la aplicación Lynis. A pesar de que ya está en los repos de Debian a mi me gusta utilizar sus repositorios para tener la última versión, para ello ejecutar los siguientes comandos:
echo "deb https://packages.cisofy.com/community/lynis/deb/ jessie main" > /etc/apt/sources.list.d/cisofy-lynis.list apt-get install apt-transport-https apt-get update; apt-get install lynis
Ahora simplemente ejecutamos Lynis de la siguiente manera:
lynis audit system
Lo que hará Lynis es realizar diferentes comprobaciones en nuestra máquina y al final nos dará una serie de recomendaciones así como una puntuación, a mi me gusta que mis máquinas se mantengan como mínimo por encima del 85 de nota.
Y esto es todo, veréis que en cuestión de aplicaciones solo he tocado SSH y es que para una guía básica ya me parecía bastante extensa sin tener que meterme en aplicaciones que mucha gente a lo mejor no tiene ni instaladas. En caso de que queráis alguna guía para alguna aplicación en concreto no dudéis en pedirla.
Espero os haya gustado, muchas gracias como siempre por vuestra visita, y no seáis tímidos, dejad un comentario!
muchas gracias por tu ayuda máster.