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
TDC / TOC
- 1. Principios genéricos
- 2. Instalación básica
- 3. Protección de la red
- 4. Sincronización de la fecha y hora
- 5. Verificar los permisos de algunos archivos importantes
- 6. Control de acceso
- 7. Enviar los registros del sistema (logs) a un servidor remoto
- 8. At y Cron
- 9. SSHD
- 10. Auditar el sistema
- 11. Mantener el sistema actualizado
- 12. Deshabilitar los dispositivos innecesarios
- 13. Deshabilitar servicios innecesarios
- 14. Desactivar el bit SUID y SGID en el máximo de programas
- 15. Asegurar la máquina físicamente
- 16. SELinux y Apparmor
- 17. Habilitar la comprobación de integridad
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 |
Aqui existen un monton de errores, posiblemente se deba actualizar esta informacion
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