Hardening Linux
Buenas noches, bloggeros.
Seguridad física y control de acceso
Proteger el BIOS/UEFI
Instalación: Mejores prácticas (algunas)
Modificar /etc/motd
Modificar /etc/issue
Revisar servicios habilitados
Administración remota del servidor
Contorlar la performance del servidor
Limitar el acceso a las tty al usuario root
TMOUT=360 #después de 6 minutos cierra la sesión
Útil para terminar las sesiones abiertas que quedaron olvidadas en el sistema...
Enjaular (chroot)
Correcto uso de sudo
Control de acceso
Usar HIDS (Tripwire)
Usar keyloggers
A través de herramientas como Snoopy se puede mantener en archivos de log el registro de los comandos que un usuario ejecuta.
Al igual que Tripwire, provee al administrador una manera controlar y saber qué ocurre en el sistema y saber quién hace qué cosas.
Auditar el servidor
Configurar de manera segura los servicios
Tunning the kernel
Se modifica el valor de ciertas variables para:
Ignorar todos los paquetes echo:
Configurar el firewall (iptables)
Esta entrada está dedicada a comentar algunas prácticas que siempre llevo adelante al momento de instalar Debian (es mi distribución de cabecera). Están relacionadas con asegurar el server (o incluso tu computadora personal) de la mejor manera posible y reducir las brechas de seguridad además de otras cuestiones a tener en cuenta al momento de instalar el sistema operativo y su posterior mantenimiento.
Se sabe que no existe entorno 100% seguro pero al menos con estas recomendaciones se puede estar un poco más tranquilos de que el servidor tiene menos posibilidades de quedar comprometido por cualquier razón.
Sin más preámbulos, vamos a lo importante...
Seguridad física y control de acceso
Es importante contemplar si existe acceso físico al equipo. Si es así, tenemos un primer punto crítico de falla. El acceso a los servidores debería ser remoto. Si se requiere acceso físico a ellos, sólamente tiene que ser por parte de los administradores de la infraestructura. Aparte, sería bueno disponer acceso biométrico o por huella digital a la sala de servidores y cámaras que registren los movimientos dentro de la misma.
Idealmente se debería tener una sala separda "lógicamente", quiere decir, por ejemplo, que la infraestructura esté dividida en salas diferentes, líneas de racks, etc. Así, cada sala tendrá que contar con la seguridad física correspondiente.
A esto hay que sumar consideraciones sobre instalación eléctrica, orden en el cableado, ubicación de los equipos, separación de la línea de datos de la eléctrica, entre muchas cosas.
Idealmente se debería tener una sala separda "lógicamente", quiere decir, por ejemplo, que la infraestructura esté dividida en salas diferentes, líneas de racks, etc. Así, cada sala tendrá que contar con la seguridad física correspondiente.
A esto hay que sumar consideraciones sobre instalación eléctrica, orden en el cableado, ubicación de los equipos, separación de la línea de datos de la eléctrica, entre muchas cosas.
Proteger el BIOS/UEFI
Para evitar que algún intruso que, en caso que acceda físicamente al servidor, entre otras cosas, cambie la secuencia de booteo y acceda a través del modo rescue o monousuario.
Teniendo en cuenta lo anterior, ¡es importante deshabilitar periféricos no utilizados!
Instalación: Mejores prácticas (algunas)
- Tipo de instalación (minimal/basic): si se elige Debian para instalar en el server, ¡utilizar la versión standard! No se necesita entorno gráfico ;)
- Particionado del disco: se sugiere siempre separar los directorios /var, que almacena datos áltamente variables, con mucha actividad y que requiere ubicarse en almacenamientos rápidos como un RAID; /tmp almacena datos temporales, que son borrados por algunos procesos; /etc, que contiene archivos de configuración locales, propios de la máquina y /home, para datos del usuario.
Con el esquema general planteado anteriormente, podemos mejorar el tiempo de acceso a datos, facilitar la recuperación en caso de incidentes y minimizar los problemas por falta de espacio de almacenamiento.
- Swap: es una partición que sirve, básicamente, para guardar las imágenes de los procesos que no se mantienen en la memoria física. Se recomienda que su tamaño sea igual al de la memoria RAM, aunque depende del caso.
- ¡Usar LVM! A través de esta gestión del almacenamiento por volúmenes lógicos, se tiene una visión de alto nivel sobre el almacenamiento de disco, muy diferente a lo que nos brinda el particionado tradicional. Ofrece flexibilidad para agregar nuevo almacenamiento, modificar el tamaño de los volúmenes, etiquetar los volúmenes de manera conveniente, crear snapshots, entre otra ventajas.
Este punto es discutible. Se puede presentar la situación que el sistema no responde... y en vez de hacer un reinicio forsozo, utilizar una de las Magic Keys y generar un reinicio ordenado para que el administrador respire tranquilo. Pero si alguien accede físicamente a nuestro servidor, puede utilizar esta combinación de teclas para reiniciar el equipo y bootear desde otro dispositivo. Mmm... queda a criterio de los administradores.
Modificar /etc/motd
Message of the day es lo que se muestra a todos los usuario cada vez que inician sesión en el sistema antes de que se inicie la shell. Sería conveniente que los usuarios vean un mensaje similar a este:
Así, cada persona que acceda es advertida sobre los términos y condiciones para operar en el sistema.Este sistema es para el uso exclusivo de usuarios autorizados, por lo que las personas que lo utilicen estarán sujetos al monitoreo de todas sus actividades en el mismo. Cualquier persona que utilice este sistema permite expresamente tal monitoreo y debe estar consciente de que si este revelara una posible actividad ilicita, el personal de sistemas proporcionara la evidencia del monitoreo al personal de seguridad, con el fin de emprender las acciones civiles y/o legales que correspondan.
Modificar /etc/issue
Este fichero de texto plano contiene información del sistema operativo instalado, se muestra en la pantalla de inicio de sesión y acepta ciertos comandos. En el caso de Debian, contiene Debian GNU/Linux 8 \n \l, donde \n y \l son comandos que insertan el hostname y el nombre de la tty actual, respectivamente. También se puede insertar la arquitectura de la máquina, nombre de dominio, versión del kernel...
Si algún intruso obtiene esa información valiosa, puede recurrir a exploits o código malicioso y ejecutarlo contra nuestro sistema.
Revisar servicios habilitados
Si el servidor cumplirá la función de border router... ¿para qué está instalado el Apache? Es importante tener control sobres los servicios habilitados. Es posible saber cuáles son a través de la shell:
$ systemctl list-unit-files | awk '$2 =="enabled" {print $0}'
Si alguno de ellos no corresponde estar habilitado, podemos deshabilitarlo fácilmente con este comando:
# systemctl disable <service-name>Respaldos
Es imperdonable no tener un backup del servidor, sea cual sea la función que cumpla. Ante cualquier desastre se podrá hacer una recuperación íntegra del sistema y de esa manera, sólo el tiempo que demandará realizar esa recuperación, afectará al negocio de la organización.
¿Qué herramientas usar? Depende de lo que se quiera respaldar: máquinas virtuales, sistema, ficheros, imágenes, datos de usuario... Por ejemplo, para respaldas máquinas virtuales en KVM, se toman snapshots de esas máquinas, luego son convertida y, finalmente, copiadas en un storage usando rsync+ssh.
Lo importante, independiente de la herramienta, es definir la política de respaldos, que puede ser diferencial, incremental o total, y un calendario para generarlos de manera automatizada. Y una vez realizados esos respaldos, comprobar que son funcionales ;)
Administración remota del servidor
Lo más usual es utilizar SSH. Pero no hay que olvidarse de realizar una configuración adecuada del mismo luego de su instalación. Escribí una entrada en mi blog dedicada a ello.
Mi preferencia es utilizar una conexión VPN, siempre. Y a partir de allí, conectarse a un SSH, RDP, SFTP, VNC o lo que sea.
Contorlar la performance del servidor
Herramientas como top, free, lsof, iftop, df, tcpdump, ayudan a controlar y monitorear la utilización de recursos del servidor. Es importante conocerlas y manejarlas para cuando se deba hacer troubleshooting.
Limitar el acceso a las tty al usuario root
El usuario root tiene acceso a todas las tty. Para deshabilitarlo, se debe configurar el fichero /etc/securetty, comentando en qué terminales no se quiere que el root inicie sesión.
Si se necesita ejecutar comandos con permisos de root, se inicia sesión con un usuario común y luego se escalan privilegios.
El fichero se vería así:
.............................
Refinar los accesosEl fichero se vería así:
.............................
# Virtual consoles.............................
#tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
#tty9
#tty10
#tty11
En el mismo fichero también se listan terminales que pueden ser accedidas vía UART (puerto serial), dispositivos MUX, etc. Ese hardware lo más probable es que no se disponga, por lo que esas líneas pueden ser eliminadas del archivo.
El módulo PAM es el que se encarga de gestionar todo lo relacionado a accesos. Lee el fichero /etc/security/access.conf y otros que pueden ser creados por el usuario para accesos más granulares, por ejemplo uno específico para protocolo SSH.
Allí se especifican combinaciones del tipo (user/group, host), (user/group, network/netmask) o (user/group, tty) y define si un login es aceptado o no.
Cuando un usuario se loguea, este archivo es escaneado y se busca la primer regla que coincida con alguna de las especificaciones de acceso.
Por ejemplo:
# root no tiene acceso desde ninguna parte
- : root : ALL
# verovand sólo accede desde la net/maskLimitar acceso a los recursos
+ : verovand : 192.168.0.0/24
/etc/security/limits.conf es otro fichero leído por el módulo PAM en el que se puede limitar el acceso a los recursos del sistema por parte utilizados por usuarios o grupos de usuarios.
Por ejemplo, el fichero podría lucir de la siguiente forma:
Configurar el autologout de los usuarios verovan - maxlogin 2
* * nproc 100
Es posible cerrar la sesión de un usuario luego de cierto tiempo de inactividad en el sistema. Para conseguirlo, dependiendo si se quiere que tenga efecto en shells interactivas o en interactivas y no interactivas, se debe incluir la variable de entorno TMOUT en el fichero /etc/profile o /etc/bash.bashrc, respectivamente.
TMOUT=360 #después de 6 minutos cierra la sesión
Útil para terminar las sesiones abiertas que quedaron olvidadas en el sistema...
Enjaular (chroot)
Es una
técnica para configurar un directorio como si fuese la raiz, de manera
que no es posible acceder a ficheros fuera del mismo, tampoco ejecutar
comandos de shell, hacer uso de librerías, etc.
Es muy útil cuando se tiene que hacer manetenimieto del sistema (reparar GRUB, desistalar paquetes, actualizar un paquete, etc.). También para dar acceso a través de la shell vía FTP o SSH a usuarios.
Correcto uso de sudo
Al comando sudo hay que emplearlo con cuidado. Si bien es práctico y sencillo de utilizar, ya que no requerimos de la contraseña de root para ejecutar un comando, es peligroso por el motivo que se mencionó recién.
sudo no reemplaza a su:
- el primero permite obtener los permisos de superusuario (u otro usuario) y ejecutar un comando. Las pólizas de seguridad definen con qué privilegios, si existen, un usuario puede ejecutar sudo y se especifican en el fichero /etc/sudoers.
- el segundo permite convertirse en otro usuario, incluído root. Para ello se requiere saber su contraseña.
Si sólo se tiene acceso privilegiado a través de sudo y "se rompe sudo", se estará en modo single user. Por lo tanto, se debe setear un password para root y asegurarse que puede utilizarse ;)
No se debería emplear sudo para editar archivos o para evitar loguearse como otro como usuario, por ejemplo. Para la primera situación se recurre a grupos de usuarios y permisos específicos para tal tarea.
Editar el fichero /etc/sudoers no es tarea sencilla, pero es la manera de definir las políticas para permitir a ciertos usuarios ejecutar ciertos comandos en un host determinado.
Control de acceso
- Manejo de DAC (Discretionary Access Control): a través de los comandos chmod y chattr(lsattr) para modificar los permisos atributos de un archivo, respectivamente.
-
Manejo de ACL (Access Control List): la mayoría de los usuarios utiliza
la manera tradicional de asignación de permisos sobre un archivo a
través del comando chmod. Para un control más granular se utilizan los comandos getfacl y setfacl.
- Sticky bit (se aplica a directorios):
para prevenir que un usuario borre un fichero del que no es propietario
y que se encuentra dentro de un directorio sobre el que tiene permisos
de escritura.
- SUID,SGID (se
aplica a ficheros): para permitir la ejecución de un binario con los
permisos del propietario o del grupo ¡Manejarlo con mucho cuidado!
-Revisar directorios con permisos especiales
Gestión de logs:[root@server ~]# find / -type f -perm 1000 -ls[root@server ~]# find / -perm -o=w ! -type l -ls
Mantener logs del sistema o de un servicio es importantísimo.
Es posible gestionar los mismos con logrotate, que es un proceso que se encarga de rotar, comprimir, eliminar y enviar por mail los logs. Se ejecuta diariamente como una tarea croneada.
Otra opción disponer de un servidor centralizado como ZABBIX para monitorear y analizar logs.
Usar HIDS (Tripwire)
Tripwire es un IDS basado en host que monitorea los cambios que se producen en diferentes puntos del filesystem y almacena todas esas ocurrencias detectadas en su base de datos. La herramienta genera un reporte que se puede enviar vía mail.
Es válido pensar de qué serviría si el sistema ya fue comprometido... bueno, es demasiado útil, ya que al momento de auditar se tiene información sobre qué ocurrió, qué parte del sistema de archivos se vio afectada, etc.
Usar keyloggers
A través de herramientas como Snoopy se puede mantener en archivos de log el registro de los comandos que un usuario ejecuta.
Al igual que Tripwire, provee al administrador una manera controlar y saber qué ocurre en el sistema y saber quién hace qué cosas.
Auditar el servidor
Lynis es una herramienta muy interesante para auditoría de sistemas Linux. Básicamente audita el software instalado para buscar problemas de seguridad. Junto a esta información también buscará información general del sistema, paquetes instalados y errores de configuración. En el informe que genera, además incluye otros aspectos, como los relacionados con networking, soporte para virtualización, firewall, kernel, base de datos, etc.
Es muy sencilla de instalar y utilizar.
Junto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
Junto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
Junto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
Junto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
unto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
unto
a la información relacionada con la seguridad también buscará
información general del sistema, los paquetes instalados y los errores
de configuración. También nos mostrará información sobre diferentes
aspectos extra, como boot loaders, networking, virtualización, procesos
zombie, criptografía, impresoras, firewalls, kernel, bases de datos,
etc. - See more at:
https://www.redeszone.net/gnu-linux/auditoria-completa-de-tu-distribucion-linux-con-lynis/#sthash.nDS5e340.dpuf
Configurar de manera segura los servicios
Es fundamental no dejar la configuración por defecto de ningún servicio. Además de eso hay que mantenerlos actualizados.
Se debe estar pendiente de la lista CVE (Common Vulnerabilities and Exposures) y revisarla periódicamente.
Tunning the kernel
Se modifica el valor de ciertas variables para:
Ignorar todos los paquetes echo:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_allIgnorar todos los mensajes broadcast:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcastsEvitar ataques ICMP redirect:
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirectsEvitar ataques SYN:
echo 1 > /proc/sys/net/ipv4/tcp_syncookiesSi no se tiene soporte para IPv6, desactivarlo.
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
Estas configuraciones no son persistentes, es decir que cuando el sistema se reinicie, las variables tomarán sus valores por defecto. Para que sobrevivan el reinicio, se debe editar el fichero /etc/sysctl.conf, en donde se representan cada una de ellas separadas por puntos en vez de barra inclinada.
Configurar el firewall (iptables)
La política de firewall por defecto de la mayoría de los sistemas Linux es ACCEPT para las cadenas INPUT, OUTPUT y FORWARD, cuando debería ser DROP por defecto. A partir de allí se crean las reglas adecuadas dependiendo de la función que el servidor cumpla.
Bueno, el post se hizo largo. Cualquier aporte es bienvenido.
Las herramientas que mencioné no son las únicas.
Para cada uno de los comandos mencionados, se recomienda consultar el man correspondiente.
Saludos..!
Muy bueno el Blog Verovand..!! Ariel Silvio N.
ResponderBorrar