Guía de bastionado Linux, basado en RedHat Enterprise Linux

Esta es una guía que he desarrollado para un cliente, por lo tanto hay aspectos que se adaptan a sus necesidades (como iptables). Pero ha grandes rasgos puede ser utilizada en cualquier ámbito. También he desarrollado un script modular que automatiza todo el proceso, para más información ir a este post: Script modular para el bastionado de GNU/Linux

1.     Principios genéricos

A la hora de instalar, configurar y administrar un servidor, se debe:

  • Cifrar todos los datos que se transmiten a través de la red, son particularmente importante los datos relativos a nombres de usuario y contraseñas
  • Minimizar la cantidad de programas y servicios instalados y en ejecución para minimizar el riesgo potencial ante vulnerabilidades
  • Utilizar medidas de seguridad adicionales como: SELinux, IPtables, Apparmor
  • Auditar los elementos críticos y/o de mayor riesgo de cada servidor
  • Minimizar la instalación de varios servicios en un mismo servidor, para reducir el riesgo de que un servicio comprometido afecte a otros servicios
  • Realizar un buen seguimiento de las cuentas de usuario, crear una política de contraseñas sólida y forzar su uso así como eliminar las cuentas de usuarios innecesarias o que ya no se utilicen
  • Revisar los logs de sistema y de aplicación de manera rutinaria. Enviar los logs a un servidor de logs
  • Evitar el inicio de sesión con el usuario root. Los administradores deben usar el comando sudo para ejecutar comandos como root. Utilizar el comando visudo para editar el archivo /etc/sudoers, este comando comprueba la sintaxis del archivo antes de guardarlo
  • Utilizar la metodología del menor privilegio en todos los ámbitos

2.     Instalación básica

2.1.    Entorno de instalación seguro

El entorno ideal sería instalar el SO desde DVD sin que esté conectado a la red hasta que se hayan completado los pasos de esta guía, sin embargo habrán ocasiones en las que esto no sea posible, en esos casos se debe asegurar que:

  • El servidor debe estar protegido por un cortafuegos (Firewall)
  • No debe ser accesible desde Internet
  • No debe tener acceso a Internet, los parches de actualizaciones se instalarán desde un repositorio interno
  • Si existe algún servidor comprometido en el mismo segmento de red, no se debe realizar la instalación hasta que se haya solucionado la incidencia o se desconecte de la red el servidor comprometido o el servidor a instalar

2.2.    Particionado

Se deben mantener en particiones independientes los directorios en los que pueden escribir los usuarios, esto evita, entre otras cosas, la creación de links duros (hardlink) a programas con el setuid activado y permite un control granulado de las opciones de mount, además las particiones deben realizarse sobre LVM (gestor de volúmenes lógicos) sobre ext4 de esta forma su tamaño puede variar en caliente sin ser necesario desmontar la partición ni mover datos o apagar el servidor. Se deben asignar los privilegios mínimos a través de las opciones de mount:

  • Noexec en todo lo posible (evita la ejecución de binarios, aunque no de scripts)
  • Nodev en todos los puntos de montaje excepto en la raíz “/” o “/dev” (evita el uso de dispositivos en el punto de montaje)
  • Nosetui en todos los puntos de montaje excepto en la raíz “/” (previene el uso del bit setuid en el punto de montaje)
  • Monta /var/tmp con la opción bind a /tmp o crea un enlace simbólico

En el archivo /etc/fstab se suele utilizar la opción defaults que equivale a las opciones: rw, suid, dev, exec, auto, nouser y async (Estas opciones pueden variar según la distribución utilizada, para más información ejecuta man fstab y localiza la descripción de las opciones incluidas por la opción defaults.)

Es importante crear una partición exclusiva para /var/log/audit

Un archivo /etc/fstab de ejemplo:

LABEL=/ / ext3 defaults 1 1LABEL=/tmp /tmp ext3 defaults,nosuid,noexec,nodev 1 2LABEL=/var/log/audit /var/log/audit ext3 defaults,nosuid,noexec,nodev 1 2LABEL=/home /home ext3 defaults,nosuid,nodev 1 2LABEL=/var /var ext3 defaults,nosuid 1 2LABEL=/boot /boot ext3 defaults,nosuid,noexec,nodev 1 2/tmp /var/tmp ext3 defaults,bind,nosuid,noexec,nodev 1 2

tmpfs /dev/shm tmpfs defaults,nosuid,noexec,nodev 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda6 swap swap defaults 0 0

 

2.3.    Instalación de paquetes imprescindibles del sistema

Se debe realizar una instalación del sistema base, sin seleccionar ningún grupo de paquetes durante la instalación, e instalar a posteriori los paquetes requeridos. De esta forma evitamos que se instalen programas, librerías o extensiones que no hagan falta.

Sigue el asistente de instalación hasta que llegues a las siguientes pantallas:

RedHat

Seguir la instalación hasta el selector de grupos de paquetes

 

Donde debes seleccionar la opción Mínimo (Minimal en inglés)

Debian

Seguir la instalación hasta la pantalla de Selección de software

 

Donde debes seleccionar la opción de sistema estándar (Standard System en inglés)

2.4.    Política de robustez en las contraseñas

Hay que asegurar que se cumplen los requisitos de la política de contraseñas de la organización a fin de dificultar ataques de:

  • Predicción
  • Diccionario
  • Fuerza bruta

2.5.    Configuración de las interfaces de red (NIC)

No se debe utilizar DHCP para realizar la configuración de las interfaces de red. Esto evita el riesgo de posibles vulnerabilidades en el protocolo y de ser susceptibles a un ataque de carrera por un servidor DHCP malicioso

Estos son los pasos a seguir si el sistema ya está instalado y usa DHCP:

RedHat

Hay que ejecutar el comando

system-config-network

Y seguir los pasos del asistente Configuración del dispositivo > (interfaz deseada y especificar los parámetros de conexión, debe ser algo parecido a esto

 

Debian

Hay que editar el archivo /etc/network/interfaces cuyo contenido para la interfaz eth0 y el ejemplo anterior sería este:

iface eth0 inet static
address 192.168.0.34
netmask 255.255.255.0gateway 192.168.0.1

Los DNS hay que especificarlos en el archivo /etc/resolv.conf

nameserver 8.8.8.8nameserver X.X.X.X

3.     Protección de la red

La estrategia a seguir para la configuración de red es:

  • Minimizar los protocolos utilizados
  • Minimizar las direcciones de red a las que escucha el servidor
  • Minimizar los puertos en los que escucha el servidor

Seguir los siguientes pasos

Detectar si IPv6 está habilitado 1 Ejecutar el comandoifconfig | grep inet6Si devuelve algún resultado es que ipv6 está activo. Ej:inet6 addr: fe80::250:56ff:fe96:72/64 Scope:Link inet6 addr: ::1/128 Scope:Host
Deshabilitar la carga del módulo IPv6 1 Añadir la siguiente línea:install ipv6 /bin/trueal archivo/etc/modprobe.conf (en RedHat < 6)O al archivo/etc/modprobe.d/ipv6.conf (en RedHat > 6) RedHat
1 Crear el archivo/etc/modprobe.d/blacklist-ipv6.confy añadir la línea:blacklist ipv6 Debian/ Ubuntu
Comprobar si se está ejecutando zeroconf 1 Ejecutar el comando ps -e | grep avahiSi devuelve algún resultado es que avahi está activo. Ej:415 ?        00:02:18 avahi-daemon416 ?        00:00:00 avahi-daemon
Deshabilitar el servicio zeroconf  1  Añadir la líneaNOZEROCONF=yesAl archivo /etc/sysconfig/network RedHat
2 yum -y remove avahi RedHat
apt-get –y remove avahi-daemon Debian
Detectar los servicios que esperan conexiones externas 1 sudo netstat -tuanp | grep LISTENLa salida del comando debe ser parecida a esta:tcp 0 0 127.0.0.1:631  0.0.0.0:* LISTEN 466/cupsdtcp 0 0 0.0.0.0:3000   0.0.0.0:* LISTEN 12151/ntoptcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 23294/5
Deshabilitar los servicios innecesarios (si es posible eliminar los paquetes) 1 Ejecutar los comandosls -1 /etc/init.d > serviciosyls -1 /etc/init >> servicios En /etc/init.d se encuentran los scripts de gestión del sistema SystenV tradicional.En /etc/init se encuentran los servicios adaptdos al sistema upstart
2 Revisa el archivo servicios creado en el paso anterior y localiza los servicios innecesarios Si desconoces algún servicio y no puedes documentarte sobre su utilidad, no lo elimines
3 Ejecutar el comandochkconfig <service> offpara cada servicio que haya que deshabilitar RedHat
Ejecutar el comandoupdate-rc.d -f <service> removepara cada servicio que haya que deshabilitar Debian/Ubuntu
Configurar ip tables

 

3.1.    Parámetros de sistema que mejoran la seguridad en las comunicaciones

Linux permite su configuración mediante parámetros de control del sistema (sysctl). Se utilizarán algunos de ellos para proteger al sistema ante situaciones que introducen riesgo en las comunicaciones. El archivo /etc/sysctl.conf debe contener las siguientes líneas:

net.ipv4.icmp_echo_ignore_broadcasts = 1 Evita la respuesta a broadcast icmp para prevenir el ataque smurf
net.ipv4.icmp_ignore_bogus_error_responses = 1 Activa la protección ante mensajes icmp incorrectos
net.ipv4.tcp_syncookies = 1 Habilita syncookies como protección ante ataques de tipo SYN flood
net.ipv4.conf.all.log_martians = 1net.ipv4.conf.default.log_martians = 1 Activa el log para paquetes falsos (spoofed), encaminados en el origen (source routed) y redirigidos (redirect)
net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.default.accept_source_route = 0 Deniega paquetes encaminados en el origen (source routed)
net.ipv4.conf.all.rp_filter = 1net.ipv4.conf.default.rp_filter = 1 Habilita el filtrado de paquetes de camino inverso (reverse path)
net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.default.accept_redirects = 0net.ipv4.conf.all.secure_redirects = 0net.ipv4.conf.default.secure_redirects = 0 Impide la modificación de las tablas de rutas desde el exterior
net.ipv4.ip_forward = 0net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.default.send_redirects = 0 Evita el encaminado de paquetes

4.     Sincronización de la fecha y hora

A la hora de investigar acciones que suceden en más de una máquina, es necesario que sus tiempos estén sincronizados, hay que configurar un servidor de tiempo que sea el mismo para todos los servidores. Para configurar un servidor de tiempo hay que seguir estos pasos

1 Instalar el paquete ntpdyum install ntp RedHat
Instalar el paquete ntpdapt-get install ntp Debian
2 Editar el archivo/etc/ntp.confY asegurate que existe la líneaserver X.X.X.X
3 chkconfig ntpd on RedHat
update-rc.d ntp defaults Debian

 

5.     Verificar los permisos de algunos archivos importantes

Hay que verificar los permisos de los archivos: passwd, shadow, group y gshadow mediante los comandos. Si en la instalación por defecto estos archivos tienen permisos más restrictivos, no deben modificarse.

cd /etcchown root:root passwd shadow group gshadowchmod 644 passwd groupchmod 400 shadow gshadow

6.     Control de acceso

Debe evitarse el uso del usuario root en favor del comando sudo ya que el usuario root es compartido restando sentido al auditado del sistema.

Las acciones a realizar son las siguientes:

  • Impedir el inicio de sesión al usuario root tanto en local como en remoto
  • La limitación del uso del comando su,
  • La configuración de sudo para mejorar el auditado del acceso como root
  • Que cada administrador tenga su usuario y no lo comparta nunca
  • Reemplazar el algoritmo MD5 por SHA512 para los hashes de las contraseñas
  • Impedir el uso de contraseñas antiguas y realizar varias comprobaciones para asegurar que la nueva contraseña diverge suficiente de la antigua (pam_unix)

Los pasos a seguir son:

1-      Ejecutarel siguiente comando para cada usuario que requiera privilegios de administrador

usermod -G wheel -a usuario RedHat
usermod -G adm -a usuario Debian/Ubuntu

Donde usuario es el nombre de usuario de cada administrador.

2-      Editar el archivo /etc/pam.d/su y asegurarse de que contiene la línea

auth required pam_wheel.so use_uid RedHat
auth required pam_wheel.so group=adm Debian/Ubuntu

3- Limitar el uso de sudo a miembros de un grupo de administradores, editando el archivo /etc/sudoers mediante el comando visudo (este comando comprueba la sintaxis del archivo antes de guardarlo) y asegurarse de que contiene la línea

%wheel ALL=(ALL) ALL RedHat
%adm ALL=(ALL) ALL Debian/Ubuntu

A partir de ahora todos los usuarios que requieran la ejecución de los comandos su y sudo deben ser miembros del grupo wheel o adm según la distribución.

4- Desactivar el inicio de sesión local al usuario root. Editar el archivo /etc/shadow y sustituir el campo de la contraseña de root por un ! los dos primeros campos de la línea deben ser iguales a los de la siguiente línea.

root:!:15538:0:99999:7:::

5- Mejorar el sistema de contraseñas: hash, recordar contraseñas antiguas y realizar comprobaciones a las nuevas cuando se cambie una de ellas. Editar el archivo /etc/pam.d/system-auth (en RedHat) o /etc/pam.d/common-password (en Debian) y asegurarse de que contiene la línea

password sufficient pam_unix.so obscure sha512 shadow nullok try_first_pass use_authtok remember=10

Editar el archivo /etc/login.defs y asegúrar que contiene las siguientes líneas

MD5_CRYPT_ENAB noENCRYPT_METHOD SHA512

En RedHat el archivo /etc/libuser.conf debe contener la línea

crypt_style = sha512

 

También puede ser interesante el uso de algunos módulos pam (plugable authentication modules):

  • Pam_tally2 desactiva una cuenta de usuario tras varios intentos consecutivos de autenticación fallidos
  • Pam_limits limita el número de sesiones concurrentes
  • Pam_inicio de sesiónuid impide el inicio de sesión si no está iniciado el servicio de auditoría auditd
  • Pam_access impide el inicio de sesión por origen, consola o cuenta de usuario
  • Pam_time impide el inicio de sesión por horario

6.1.    Establecer el mensaje corporativo de inicio de sesión

Todos los servidores corporativos deberán  mostrar el siguiente mensaje cuando un usuario intente iniciar sesión en ellos

AGREGAR AQUÍ EL TEXTO DESEADO
Para configurarlo copiar el texto en el archivo /etc/motd

6.2.    Crear usuarios sin SHELL o inicio de sesión

En determinadas circunstancias es útil tener usuarios que puedan iniciar sesión pero no tengan acceso a una SHELL, por ejemplo para usuarios de FTP. Para crear usuario sin Shell hay que ejecutar el comando

useradd -M -s /sbin/nologin Nombre_de_usuario

Donde -M indica que no se creará el directorio HOME del usuario, si es necesario que tenga HOME hay que quitar este parámetro del comando, y -s indica la SHELL que se le asigna al usuario, al especificar /sbin/nologin se asigna una SHELL que impide el inicio de sesión en el sistema

7.     Enviar los registros del sistema (logs) a un servidor remoto

El envío de logs a un servidor remoto evita el borrado de evidencias en caso de que un ataque exitoso consiga acceso root o con privilegios suficientes para modificar logs

En caso de usar syslogd el archivo /etc/syslog.conf debe contener la siguiente línea

auth.info,authpriv.info,user.crit           @X.X.X.X

Si se ha denegado la salida del tráfico mediante reglas de iptables habrá que permitir la salida al puerto 514 UDP mediante el comando

iptables -I OUTPUT -p udp -d X.X.X.X –dport 514 -j ACCEPT

En caso de usar rsyslogd el archivo /etc/rsyslogd.conf debe contener la siguiente línea

auth.info,authpriv.info,user.crit           @@X.X.X.X:PUERTO

Si se ha denegado la salida del tráfico mediante reglas de iptables habrá que permitir la salida al puerto 514 TCP mediante el comando

iptables -I OUTPUT -p tcp -d X.X.X.X –dport PUERTO -j ACCEPT

NOTA: Si el puerto utilizado para rsyslog no es el 514 o el 6514, en RedHat se debe permitir el uso del puerto al binario rsyslog desde las políticas de SELinux.

8.     At y Cron

Permitir el uso de cron y at tan solo al usuario root ejecutando los siguientes comandos

rm /etc/{cron.deny,at.deny}echo root > /etc/cron.allowecho root > /etc/at.allow

9.     SSHD

Para mejorar la  seguridad del servicio SSH se deben realizar las siguientes acciones:

  • Permitir tan solo el protocolo ssh2
  • Si el servidor tiene más de una IP pensar bien en cuantas debe escuchar
  • Impedir el inicio de sesión como root
  • Impedir el uso de contraseñas en blanco
  • Impedir el uso de autenticación basada en host
  • Establecer un límite de tiempo para el inicio de sesión
  • Establecer un número máximo de intentos antes de bloquear la sesión
  • Establecer un tiempo de sesión inactiva a 5 minutos
  • Ignorar los archivos rhosts y shosts
  • Limitar el  inicio de sesión a un grupo de usuarios del sistema
  • Separar los privilegios de los procesos de SSH
  • Configurar el mensaje de inicio de sesión

Editar el archivo /etc/ssh/sshd_config y asegurarser de que contiene las líneas

Protocol 2PermitRootLogin noPermitEmptyPasswords noHostbasedAuthentication noUsePrivilegeSeparation yesIgnoreRhosts yesMaxAuthTries 3

LoginGraceTime 120

ClientAliveInterval 300

ClientAliveCountMax 0

Banner /etc/ssh/ssh_banner

AllowGroups wheel (en RedHat)

AllowGroups adm (en Debian)

ListenAddress ip_del_servidor

Donde ip_del_servidor es la dirección ip en la que escuchará el servicio SSH, la dirección  para que escuche en todas es es 0.0.0.0, aunque no es lo recomendable.

Para configurar el mensaje de inicio de sesión hay que editar el archivo /etc/ssh/ssh_banner e insertar el texto

AGREGAR AQUÍ EL TEXTO DESEADO

10.  Auditar el sistema

El auditado del sistema es una herramienta muy potente, pero que mal utilizada puede volver inservible el servidor más potente, así que hay que utilizarla con precaución y planificación. Los pasos genéricos que debemos seguir son:

  • Instalar el paquete auditd
  • Localizar los archivos críticos y/o de mayor riesgo para los servicios que ofrece el servidor
  • Configurar auditd para que se inicie junto al sistema
  • Configurar el núcleo para que audite procesos que se inician antes que el servicio auditd
  • Añadir los archivos críticos al servicio auditd

Al configurar auditd hay que:

  • Tener /var/log/audit en su una partición propia
  • Ajustar max_log_file y num_logs para que usen el máximo posible del espacio de la partición de logs
  • Ajustar space_left de forma que permita al administrador tener tiempo para liberar espacio ante una alerta de poco espacio disponible
  • En el caso de que se llene el disco se ejecutará la acción definida por disk_full_action, todos los accesos deben ser terminados ya que no hay capacidad de auditar

Una vez instalado y configurado hay que revisar el resultado del comando aureport regularmente

Para instalar y arrancar auditd durante el inicio del sistema ejecutar estos comandos

yum install auditd
chkconfig auditd on
RedHat
apt-get install auditd
update-rc.d auditd default
Debian/Ubuntu

Una vez obtenido el listado de los archivo a auditar hay que agregarlos al archivo /etc/audit/audit.rules

-w ruta_completa_del_archivo -p permisos -k palabra_clave
-La palabra_clave servirá para buscar eventos relacionados con este registro, es como una categoría para de evento-Los permisos existentes son:r: lecturaw: escriturax: ejecucióna: cambios en los atributos

Debe existir una línea de este tipo para cada archivo a auditar. Debe existir una partición independiente para los logs de auditd, si no existe añádela y asegúrate que esté montada en /var/log/audit mediante el comando

mount | grep audit Este comando debe devolver algo similar a esto:/dev/sda4 on /var/log/audit type ext4 …Si no devuleve nada es que no se está montando una partición exclusiva para auditd

Editar el archivo /etc/audit/auditd.conf y asegurarse de que:

  • La multiplicación de max_log_file * num_logs es menor que el tamaño de la partición de /var/log/audit o de la partición que contenga el punto de montaje /var
  • El valor de space_left no sea demasiado bajo y permita un tiempo razonable para intervenir en caso de fallo en la rotación de logs
  • Establecer la acción a realizar en caso de que se llene la partición de logs de audit mediante la variable disk_full_action, los valores más interesantes son:
    • halt: apaga el servidor
    • suspend: auditd deja de agregar datos a los logs
    • syslog: inserta un mensaje de alerta en los logs del sistema

Para auditar los procesos que se inician antes del servicio auditd, hay que modificar las opciones de inicio del núcleo editando las opciones del gestor de arranque GRUB, en RedHat y Grub1 hay que editar el archivo /etc/grub.conf y asegurarse de que la línea del kernel contiene la variable audit=1, ejemplo:

        kernel /vmlinuz-2.6.32-220.el6.i686 ro root=/dev/mapper/vg_snortsrv-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=es rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=128M rd_LVM_LV=vg_snortsrv/lv_swap LANG=es_ES.UTF-8 rd_LVM_LV=vg_snortsrv/lv_root rd_NO_DM audit=1

En Debian y Grub 2 hay que editar el archivo /etc/default/grub y asegurarse de que existe la siguiente línea:

GRUB_CMD_LINUX_DEFAULT=”quiet splash audit=1”

Una vez editado este archivo hay que ejecutar el comando

grub-mkconfig

A partir de aquí hay que familiarizarse con el comando aureport y ejecutarlo con regularidad

11.  Mantener el sistema actualizado

Hay que asegurar que los servidores cumplen con la política de aplicación de actualizaciones de la compañía

12.  Deshabilitar los dispositivos innecesarios

Si existen dispositivos que no van a ser utilizados la mejor opción es desactivarlos para prevenir posibles errores en sus módulos, también hay que desactivar el soporte a medios extraíbles (usb, firewire). Para ello se deben desactivar los dispositivos innecesarios impidiendo la carga de su módulo por parte del SO

Ejecutarlos comandos

lspci –v
lsusb
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)Subsystem: VMware VMXNET3 Ethernet ControllerPhysical Slot: 192Flags: bus master, fast devsel, latency 0, IRQ 19Memory at d9d05000 (32-bit, non-prefetchable) [size=4K]Memory at d9d04000 (32-bit, non-prefetchable) [size=4K]Memory at d9d02000 (32-bit, non-prefetchable) [size=8K]

I/O ports at 5000 [size=16]

[virtual] Expansion ROM at dc700000 [disabled] [size=64K]

Capabilities: <access denied>

Kernel driver in use: vmxnet3

Kernel modules: vmxnet3

….
….
….

:e para el eventoegore.chivos tienen permisos restrictivosEstudiar su resultado y decidir qué dispositivos son innecesarios. localizar sus módulos y agrégarlos, uno por línea, al archivo /root/rmmodules, ahora ejecutar el comando

for module in $(cat /root/rmmodules); do echo install $module /bin/true >> /etc/modprobe.d/no-$module; done

Este comando desactiva la carga automática de los módulos pero no impide que se puedan cargar manualmente, para evitar su carga manual la mejor opción es eliminar los módulos, para eso ejecutar el comando

 

mkdir /root/modulos-innecesarios && for module in $(cat /root/rmmodules); do ruta=$(find /lib/modules/$(uname -r) -name $module\*) && mv $ruta /root/modulos-innecesarios && echo $ruta >> /root/modulos-innecesarios/rutas.txt; done

Este comando mueve los módulos al directorio /root/modulos-innecesarios una vez se esté seguro de que los módulos no son necesarios se puede eliminar.

13.  Deshabilitar servicios innecesarios

La mayoría de instalaciones tendrán servicios instalados que no sean necesarios, esto se debe a que se adaptan a un público genérico, pero si el servidor cumple una función específica no los necesitará. También podemos encontrar servidores antiguos que tengan instalados servicios obsoletos y cuyo uso es totalmente desaconsejable. Hay que localizar todos los servicios que existen en el servidor y eliminar los que no necesitemos, en caso de duda no hay que eliminar el servicio.

Algunos servicios que no deben existir en ningún caso son:

  • rlogin, rsh, rexec, rcp…: Usar ssh en su lugar
  • talk

Ejecutar el comando

yum erase rsh-server rsh talk talk-server RedHat
apt-get remove rsh-client rsh-server talkd talk inetutils-talk inetutils-inetd micro-inetd openbsd-inetd rinetd rlinetd xinetd Debian/Ubuntu

 

Los siguientes servicios deben sustituirse por sus homólogos más seguros:

  • telnet: Usar ssh en su lugar
  • ftp, tftp: Usar sftp o ftps en su lugar, en el caso de necesitar tftp y no se pueda limitar su uso por IP intentar que tan solo esté activo el tiempo necesario para realizar la tarea requerida
  • NIS: Usar openLDAP o Fedora directory server
  • Anacron: usar cron nativo
  • Inetd: si es posible no utilizar ninguno de estos servicios, ni no usar xinetd

14.  Desactivar el bit SUID y SGID en el máximo de programas

El uso de estos permisos es tan necesario como potencialmente peligroso, así que hay que buscar los binarios que existen en el sistema con este bit establecido y eliminarlo de todos los que sea posible, para encontrar estos ejecutables hay que ejecutar el comando:

find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -print La salida de este commando es un listado de archivos similar a esto:/bin/ping/bin/umount/bin/mount/bin/fusermount/bin/su/bin/ping6

/sbin/unix_chkpwd

….

….

 

 y para desactivar este permiso se ejecuta el comando:

chmod -s ruta_al_ejecutable

Algunos ejecutables en los que se puede desactivar a no ser que se sea necesaria su función son:

Archivo

Función

ping6 Ping a IPv6
mount.nfs Monta puntos NFS
mount.nfs4 Monta puntos NFS
umount.nfs Desmonta puntos NFS
umount.nfs4 Desmonta puntos NFS
netreport Notifica a procesos sobre cambios en las interfaces de red
chage Contraseñas
chfn Cambia el finger del usuario
chsh Cambia la Shell de usuario
crontab Cron
lockfile Procmail
rcp, rlogin, rsh No deberían existir
wall Mensajes entre usuarios por consola
write Mensajes entre usuarios por consola
Xorg Servidor gráfico
ksu Kerberos
ssh-keysign Autenticación por host de ssh
gnome-pty-helper Gnome, Xorg
ccreds_validate Caché de autenticación de los módulos pam
suexec CGIs de Apache
userisdnctl ISDN
usernetctl Control de las interfaces de red por los usuarios

 

15.  Asegurar la máquina físicamente

Para reducir la capacidad de acción en el caso de conseguir acceso físico al servidor se debe:

  • Desactivar el arranque desde cualquier dispositivo excepto el disco duro que contiene el SO
  • Establecer una contraseña para acceder a la BIOS
  • Proteger el gestor de arranque GRUB mediante contraseña
  • Deshabilita el arranque interactivo en el caso de que la distribución lo soporte
  • En caso de que el servidor disponga de ILO o similar hay que configurarla en una VLAN propia que se utilice exclusivamente para gestión, si no se va a utilizar la ILO hay que desactivarla desde la BIOS

A parte de las acciones que se realicen desde la BIOS hay que seguir los siguientes pasos

1
Ejecutarel comando
grub-md5-crypt 
Indicar la contraseña elegida y repetirla. Editar el archivo
/etc/grub.conf
Y asegúrarse de que existe, y no está comentada, la línea
password --md5 password-hash-del-paso-anterior
Ejecuta

chown root:root /boot/grub/grub.conf

chmod 600 /boot/grub/grub.conf
RedHatGRUB1
Ejecutarel comando
grub-mkpasswd-pbkdf2
Copiar a partir de grub.pbkdf2
Editar el archivo
/etc/grub.d/01_user_logins
Y añadir las líneas
cat<<EOF
set superusers=”bootadm”
password_pbkdf2 bootadm grub.pbkdf2
EOF
Ejecutar los comandos:

chown root:root / etc/grub.d/01_user_logins

chmod 700 / etc/grub.d/01_user_logins
Debian/UbuntuGRUB2
2
Editar el archivo
/etc/sysconfig/init
Y asegurarse de que existe, y no está comentada, la línea
PROMPT=no
RedHat

 

16.  SELinux y Apparmor

Tanto SELinux como Apparmor mejoran la seguridad de Linux implementando control de acceso obligatorio (MAC) limitando de esta manera el poder del usuario root y mejorando el detalle de los privilegios que se le pueden asignar a los procesos. Las distribuciones basadas en RedHat tienen SELinux configurado y activado por defecto, mientras que Ubuntu tiene Apparmor. No se deben desactivar estos sistemas de seguridad

Para comprobar que SELinux está activado ejecutar el comando

sestatus | grep status | grep enabled

Si no devuelve ningún resultado es que SELinux está desactivado, para activarlo se deben seguir estos pasos

1
Editar el archivo
/etc/selinux/config
Y Asegurarse de que contiene la línea
SELINUX=enforcing
2
Asegurarse de que en el archivo
/etc/grub.conf
Ninguna línea de kernel contenga alguno de estos argumentos

selinux=0

enforcing=0
Estos valores NO deben existir

 

 

17.  Habilitar la comprobación de integridad

Tener una buena política de comprobación de integridad facilita enormemente la tarea de localizar el punto de entrada de un ataque así como los archivos modificados o a los que han tenido acceso. Utilizaremos las herramientas:

  • Amtu (Abstract Machine Test Utility): Realiza comprobaciones de seguridad en CPU, HD, red y memoria
  • Aide: Utilidad para la comprobar la integridad de archivos

Sigue estos pasos

yum insall amtu RedHat
apt-get install amtu
Debian/Ubuntu
Editar el archivo
/etc/crontab
Y asegurarse de que existe, y no está comentada, la línea
23 6 * * 1 root $(which amtu) -msinp
Esto ejecuta amtu cadaLunes a las 6:23 de la madrugada
yum insall aide
RedHat
apt-get install aide
Debian/Ubuntu
Editar el archivo
/etc/aide.conf
Y adaptarlo a las necesidades específicas
/usr/sbin/aide --init
Crea la base de datos inicial
Copiar los archivos:
/var/lib/aide/aide.db.new.gz
/etc/aide.conf
/usr/sbin/aide
A un medio de solo lectura o que no esté conectado a la red ni a un servidor de forma permanente
Se debe utilizar un medio de solo lectura ej: DVD-R para esta tarea

2 comentarios en “Guía de bastionado Linux, basado en RedHat Enterprise Linux

    1. abdulet Autor

      Hola Alumno,

      Gracias por el comentario, la verdad es que hace años de esto y no he vuelto a revisarlo. Actualmente no uso Linux en el trabajo y no me sobra el tiempo fuera de él. Así que, si te apetece, puedes comentar los errores a los que te refieres y actualizo el post con tus apreciaciones.

      Gracias
      Saludos

      Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.