{{tag>centos bastionado seguridad}}
===== 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
En Centos para configurar la red ejecutar system-config-network o 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 [[http://es.wikipedia.org/wiki/Zeroconf|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 > servicios o bien ls -1 /etc/init >> servicios
Para deshabilitar un servicio determinado chkconfig off
si es posible eliminar los paquetes
== 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
Para configurar el mensaje de inicio de sesión hay que editar el archivo /etc/ssh/ssh_banner e insertar el texto
==== Auditar el sistema ====
Ojo activar el sistema de auditoria puede volver inutilizable el servidor más potente, así que hay que usarlo 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
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 ====
* http://www.eugeniabahit.com/proyectos/jackthestripper
* http://abdulet.net/?p=594
==== Referencias ====
* http://www.cyberciti.biz/tips/linux-security.html
* http://mundogeek.net/traducciones/odonovan.html
* http://www.cica.es/Seguridad/guia-de-seguridad-en-una-estacion-linux.html
* http://www.cica.es/Seguridad/seguridad-en-los-ficheros-protecciones.html
* www.sans.org/resources/policies
* http://abdulet.net/?p=591
* https://www.ccn-cert.cni.es/pdf/guias/series-ccn-stic/guias-de-acceso-publico-ccn-stic/3674-ccn-stic-619-implementacion-de-seguridad-sobre-centos7/file.html
=== 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