meta data de esta página
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| seguridad:asegurar_linux [242015/04/ 09:17] – [Bastionado de Centos] luisca | seguridad:asegurar_linux [022023/05/ 08:04] (actual) – [Referencias] lc | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | {{tag> | ||
| + | ===== 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, | ||
| + | * 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 | ||
| + | |||
| + | < | ||
| + | En Centos para configurar la red ejecutar < | ||
| + | |||
| + | Los DNS hay que especificarlos en el archivo / | ||
| + | </ | ||
| + | |||
| + | == Deshabilitar IPV6 si no lo utilizamos == | ||
| + | Para ver si tenemos IPV6 activo ejecutamos < | ||
| + | |||
| + | Para deshabilitarlo sin reiniciar el sistema, ejecutar: | ||
| + | |||
| + | < | ||
| + | echo 1 > / | ||
| + | |||
| + | otra forma sería: | ||
| + | <sxh> | ||
| + | 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 [[http:// | ||
| + | Para deshabilitarlo: | ||
| + | Añadir la línea **NOZEROCONF=yes** Al archivo / | ||
| + | |||
| + | == Detectar sevicios en escucha == | ||
| + | Ejecutar < | ||
| + | |||
| + | 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 | ||
| + | < | ||
| + | |||
| + | Para deshabilitar un servicio determinado < | ||
| + | |||
| + | <note warning> | ||
| + | |||
| + | == 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 / | ||
| + | * 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 -> | ||
| + | * net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.default.accept_source_route = 0 -> | ||
| + | * 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 < | ||
| + | * Editar el archivo/ | ||
| + | * 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 | ||
| + | < | ||
| + | |||
| + | Editar el archivo / | ||
| + | < | ||
| + | |||
| + | == Limitar el uso de sudo a miembros de un grupo de administradores == | ||
| + | Editando el archivo / | ||
| + | < | ||
| + | |||
| + | 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. | ||
| + | < | ||
| + | |||
| + | == 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 / | ||
| + | < | ||
| + | |||
| + | Editar el archivo / | ||
| + | < | ||
| + | |||
| + | En RedHat el archivo / | ||
| + | < | ||
| + | |||
| + | |||
| + | |||
| + | 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: | ||
| + | < | ||
| + | |||
| + | 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 / | ||
| + | |||
| + | == Mesaje de inicio == | ||
| + | | ||
| + | |||
| + | ==== Enviar los logs a un servidor remoto ==== | ||
| + | En caso de usar syslogd el archivo / | ||
| + | < | ||
| + | |||
| + | En caso de usar rsyslogd el archivo / | ||
| + | < | ||
| + | |||
| + | 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 | ||
| + | < | ||
| + | |||
| + | |||
| + | ==== At y Cron ==== | ||
| + | Permitir el uso de cron y at tan solo al usuario root ejecutando los siguientes comandos | ||
| + | < | ||
| + | |||
| + | ==== 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 / | ||
| + | < | ||
| + | LoginGraceTime 120 | ||
| + | ClientAliveInterval 300 | ||
| + | ClientAliveCountMax 0 | ||
| + | Banner / | ||
| + | AllowGroups wheel | ||
| + | ListenAddress ip_por_donde_escucha | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Auditar el sistema ==== | ||
| + | |||
| + | <note warning> | ||
| + | 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 / | ||
| + | * 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, | ||
| + | |||
| + | Para instalar y arrancar auditd durante el inicio del sistema ejecutar estos comandos | ||
| + | <sxh> | ||
| + | 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 / | ||
| + | |||
| + | ==== Actualizar el sistema ==== | ||
| + | Mantener el sistema actualizado con los últimos parches | ||
| + | |||
| + | ==== Deshabiliar dispositivos innecesarios ==== | ||
| + | |||
| + | Para ver los dispositivos ejecutar | ||
| + | < | ||
| + | < | ||
| + | |||
| + | Una vez localizados, | ||
| + | |||
| + | ==== 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 | ||
| + | < | ||
| + | |||
| + | Revisar el listado que aparece por si hay alguno al que podamos quitarselo | ||
| + | |||
| + | para desactivar este permiso | ||
| + | < | ||
| + | |||
| + | ==== 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): | ||
| + | |||
| + | ==== Scripts de bastionado ==== | ||
| + | * http:// | ||
| + | * http:// | ||
| + | ==== Referencias ==== | ||
| + | * http:// | ||
| + | * http:// | ||
| + | * http:// | ||
| + | * http:// | ||
| + | * www.sans.org/ | ||
| + | * http:// | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | === Búsqueda de archivos con suid/sgid === | ||
| + | < | ||
| + | |||
| + | === Buscar otros archivos peligrosos === | ||
| + | < | ||