meta data de esta página
Bastionado de Centos
Asegurar la máquina físicamente
Lo primero es asegurarnos de que a la máquina física no se puede acceder sin permiso. Además en caso de que el servidor disponga de tarjeta de acceeso remoto tipo ILO o similar, hay que configurarla en una VLAN propia que se utilice exclusivamente para gestión, si no se va a utilizar dicha tarjeta hay que desactivarla.
En caso de que no podamos restringir dicho acceso o para una mayor seguridad:
- 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
Instalación
Siempe que sea posible hay que instalar el SO desde DVD sin que esté conectado a la red hasta que se hayan completado el bastionado. Descargarnos la imagen desde el sitio oficial y verificar la integridad de la misma.
En caso contrario el equipo debe de instalarse desde un segmento de la red aislado del resto, sin acceso desde el exterior y con un acceso a internet restringido.
Elegir siempre la instalación mínima y posteriormente añadir sólo los servicios o paquetes necesarios para la función a realizar.
Particionado
- las particiones deben realizarse sobre LVM y formateadas como ext4 de esta forma su tamaño puede variar en caliente.
- La carpeta home de los usuarios y en general cualquier otra donde los usuarios puedan escribir, deben de estar en particiones independientes, 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
- 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
Red
Para el bastionado de la red tenemos que tener en cuenta lo siguiente:
- Deshabilitar los protocolos que no se utilizen
- Verificar los puertos en los que escucha el servidor y deshabilitar los innecesarios
- Restringir el acceso a los puertos abiertos a direcciones concretas
system-config-networko editando el fichero correspondiente a nuestra tarjeta, que se encuentra en la ruta /etc/sysconfig/networking/devices
Los DNS hay que especificarlos en el archivo /etc/resolv.conf
Deshabilitar IPV6 si no lo utilizamos
Para ver si tenemos IPV6 activo ejecutamos
ifconfig | grep inet6
Para deshabilitarlo sin reiniciar el sistema, ejecutar:
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
otra forma sería:
sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1
Deshabilitar Zeroconf
Comprobar si se está ejecutando Zeroconf
ps -e | grep avahiSi devuelve algún resultado es que avahi está activo. Para deshabilitarlo: Añadir la línea NOZEROCONF=yes Al archivo /etc/sysconfig/network y eliminar el paquete
yum -y remove avahi
Detectar sevicios en escucha
Ejecutar
sudo netstat -tuanp | grep LISTEN
Si tenemos servicios innecesarios en /etc/init.d se encuentran los scripts de gestión del sistema SystenV tradicional y en /etc/init se encuentran los servicios adaptdos al sistema upstart. Para ver que servicios tenemos ejecutamos
ls -1 /etc/init.d > servicioso bien
ls -1 /etc/init >> servicios
Para deshabilitar un servicio determinado
chkconfig <service> off
Otras mejoras de seguridad en la red
Se utilizarán algunos parámetros de control de sysctl 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
Sincronización de la fecha y hora
Hay que configurar todos los servidores para que se sincronizen con el mismo servidor de tiempo, ya que es muy necesario a la hora de investigar acciones que suceden en más de una máquina
Para configurar un servidor de tiempo hay que seguir estos pasos:
- Instalar el paquete ntpd
yum install ntp
- Editar el archivo/etc/ntp.conf y poner nuestro servidor de tiempo el primero de la lista
server X.X.X.X
- chkconfig ntpd on
Control de acceso
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 es diferente de la antigua (pam_unix)
Crear usuarios con privilegios de administrador
Ejecutar el siguiente comando para cada usuario que requiera privilegios de administrador
usermod -G wheel -a usuario
Editar el archivo /etc/pam.d/su y asegurarse de que contiene la línea
auth required pam_wheel.so use_uid
Limitar el uso de sudo a miembros de un grupo de administradores
Editando el archivo /etc/sudoers mediante el comando visudo y asegurarse de que contiene la línea
%wheel ALL=(ALL) ALL
A partir de ahora todos los usuarios que requieran la ejecución de los comandos su y sudo deben ser miembros del grupo wheel
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:!:14698:0:99999:7:::
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 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
Crear usuarios sin SHELL
Hay determinados casos en los que puede ser util 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 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
Mesaje de inicio
Establecer el mensaje corporativo de inicio de sesión, para ello copiamos el texto en el archivo /etc/motd
Enviar los logs a un servidor remoto
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
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 UDP mediante el comando
iptables -I OUTPUT -p udp -d X.X.X.X –dport 514 -j ACCEPT
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
Bastionar el acceso por SSH
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 definir 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
Editamos el archivo /etc/ssh/sshd_config y añadimos o cambiamos las líneas:
LoginGraceTime 120 ClientAliveInterval 300 ClientAliveCountMax 0 Banner /etc/ssh/ssh_banner AllowGroups wheel ListenAddress ip_por_donde_escucha
Auditar el sistema
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
Para instalar y arrancar auditd durante el inicio del sistema ejecutar estos comandos
yum install auditd chkconfig auditd on
Una vez instalado y configurado hay que revisar el resultado del comando aureport regularmente
Una vez obtenido el listado de los archivo a auditar hay que agregarlos al archivo /etc/audit/audit.rules
Actualizar el sistema
Mantener el sistema actualizado con los últimos parches
Deshabiliar dispositivos innecesarios
Para ver los dispositivos ejecutar
lspci -v
lsusb
Una vez localizados, deshabilitar los módulos innecesarios
Deshabilitar servicios innecesarios
Algunos servicios que no deben existir en ningún caso son:
- rlogin
- rsh
- rexec
- rcp
- telnet → Usar ssh en su lugar
- talk
Revisar los permisos en los ficheros
Desactivar el bit SUID y SGID en el máximo de programas Para buscar que archivos tienen el bit SUID/SGID activado ejecutar
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f -print
Revisar el listado que aparece por si hay alguno al que podamos quitarselo
para desactivar este permiso
chmod -s ruta_al_ejecutable
Habilitar la comprobación de integridad
La comprobación de integridad nos ayuda a localiza el punto de entrada de un ataque así como los archivos modificados o a los que han tenido acceso. Para esta tarea podemos utilizar estas herramientas:
- Amtu (Abstract Machine Test Utility): Realiza comprobaciones de seguridad en CPU, HD, red y memoria
- Aide(Advanced Intrusion Detection Environment): Utilidad para la comprobar la integridad de archivos
Scripts de bastionado
Referencias
Búsqueda de archivos con suid/sgid
find / -type t\ (-perm 04000 -o - perm -02000\) -exec ls -la {} \
Buscar otros archivos peligrosos
find / name -rhosts -name .netrc