====== Seguridad Linux ====== ===== Qué hace a Linux seguro ===== Linux es un sistema multiusuario, puede ser usado por diferentes personas y evita que uno pueda acceder a los recursos personales de otro usuario. **root** es el superusuario, tienen todos los poderes y permisos. Esta cuenta debe ser segura ya que puede hacer de todo. Ventajas de un sistema multiusuario: * Permisos de los ficheros. * Cada archivo tiene un propietario. * Los permisos pueden ser dados a otras cuentas y usuarios según sea necesario. * Cada cuenta solo puede manejar sus procesos (root puede hacer todo). * Comprometer una cuenta no compromete necesariamente todo el sistema. ¿Está Linux a salvo de ataques? Si lo comparamos con Windows, desde el punto de vista de un atacante: * Hay más ordenadores con Windows instalado que con Linux. * Los usuarios de Linux suelen ser avanzados y tienen más conocimientos sobre seguridad de los sistemas que los de Windows. Linux es de código abierto: * No se necesita confiar en una compañía y su software privativo. * Es prácticamente imposible colar código malicioso en el kernel de linux sin que uno de los miles de desarrolladores se den cuenta * Al ser de código abierto, es más fácil que se descubran agujeros de seguridad y se solucionen antes. Gestión de software centralizada: * Los paquetes son gestionados mediante gestores de paquetes. * Las distribuciones de Linux proporcionan repositorios de software libres de virus y probados. * Facilidad para estar siempre al día con las últimas actualizaciones de seguridad. * Se actualizan todas las aplicaciones instaladas a la vez. ===== Buenas prácticas ===== ==== Minimizar el software instalado y servicios ==== * Si no es necesario un programa, no instalarlo. * Si no se necesita un servicio, no arrancarlo. * Si ya no se necesita un programa o servicio, detenerlo y desinstalarlo. ==== Ejecutar servicios en sistema diferentes ==== No tener en una misma máquina diferentes servicios como puede ser un servidor web, una base de datos, un sistema de compartición de ficheros... Si por un fallo de uno de los servicios, un atacante logra acceso, puede comprometer el resto. ==== Cifrar la transmisión de información ==== Para evitar ataques de //Man-in-the-middle//. * Utilizar sFTP en lugar de FTP. * Utilizar SSH en lugar de telnet * Utilizar SNMP v3 en lugar de SNMP v3 * HTTPS en lugar de HTTP ==== Evitar compartir cuentas ==== * Cada persona debe tener su propia cuenta de usuario. * Cada servicio debe tener su propia cuenta. ==== Evitar logins automáticos de root ==== * No permitir login automático de cuentas compartidas. * Los usuarios deben iniciar sesión en sus cuentas personales y a partir de ahí cambiar a una compartida. * Controlar y monitorizar el acceso con ''sudo''. ==== Mantenimiento de cuentas ==== * Mantener una política fuerte de uso de contraseña. * Crear y usar un proceso para eliminar el acceso (si alguien ya no necesita la cuenta o abandona la empresa). ==== Autenticación multifactor ==== * Algo que sabes + algo que tienes o eres (contraseña y teléfono para recibir la contraseña de un solo uso o //One Time Password//) ==== Principio de la menor autoridad ==== * Solo privilegios de root cuando sea necesario. * Evitar lanzar servicios como root. * Usar permisos restrictivos que permitan a la gente o servicios suficiente acceso para realizar su trabajo. ==== Monitorizar la actividad del sistema ==== * Revisar logs de sistema y aplicaciones habitualmente. * Enviar los logs a un sistema central de logs. ==== Usar un cortafuegos ==== * El kernel de Linux incluye un sistema de filtrado de paquetes: netfilters. Con **iptables** se puede gestionar Netfilters. * Permitir solo conexiones de red desde los orígenes deseados. ==== Cifrar información ==== * El cifrado protege la información almacenada en el sistema. ===== Seguridad física ===== * Mantener cerrados los acceso a los sistemas (sala de ordenadores). * Mantener controles de acceso. * Limitar el acceso a cada habitación. * Permitir el acceso solo por necesidad. * Escoltar a los visitantes. * Registrar las visitas. ==== Single User Mode ==== Para arrancar un sistema Linux en //Single User Mode// basta con añadir ''s'' (''S'' o también ''1'') a la línea del GRUB que indica dónde está el kernel: linux /vmlinuz-3.19.0-15-generic root=/dev/mapper/ubuntu-vg-root ro s Si el sistema utiliza **systemd**, añadimos ''systemd.unit=rescue.target'' o la abreviación ''rescue'': linux /vmlinuz-3.19.0-15-generic root=/dev/mapper/ubuntu-vg-root ro rescue Esto nos permitirá arrancar el sistema con el usuario root. Dependiendo del sistema, no nos preguntará por la contraseña. ==== GRUB ==== Si tenemos acceso al gestor de arranque GRUB, podemos pasar la opción ''init=/bin/bash'' en la línea del kernel para que arranque el intérprete bash como root. Para evitarlo, debemos establecer una contraseña para poder modificar el GRUB. En el fichero ''/etc/grub.d/40-custom'': # Usuario que podrá modificar GRUB set superusers="root" password root topsecret Si queremos cifrar la contraseña, podemos usar el comando ''grub2-mkpasswd-pbkdf2''. Para aplicar los cambios en la configuración del GRUB: update-grub ==== Deshabilitar reinicio desde teclado ==== Para que no tenga efecto la combinación ''Ctrl'' + ''Alt'' + ''Supr'': # En SystemD systemctl mask ctrl-alt-del.target systemctl daemon-reload ===== Cifrado del disco ===== * dm-crypt * LUKS (front-end de dm-crypt) Si hacemos el cifrado durante la instalación de un sistema, será más sencillo. Este cifrado del disco permite que cada vez que arranquemos el sistema, se pida la clave de cifrado para poder montar el disco y continuar con el arranque del sistema operativo. Cifrar un dispositivo elimina toda la información que pudiera haber en él. Si queremos asegurarnos de que no hay ninguna información en el dispositivo antes de cifrarlo, podemos usar **shred**: sudo shred -v -n 1 /dev/sdX Lo que hace este comando es escribir datos aleatorios en el dispositivo. Usamos el programa **cryptsetup**: # Inicializamos el dispositivo: sudo cryptsetup luksFormat /dev/sdX # Abrimos el dispositivo en /dev/mapper/opt sudo cryptsetup luksOpen /dev/sdX opt A partir de entonces podremos utilizar este dispositivo de bloques como cualquier otro: # Instalar sistema de ficheros mkfs -t ext4 /dev/mapper/opt Lo montamos desde ''/etc/fstab'': /dev/mapper/opt /opt ext4 defaults 0 0 Para que se pueda desifrar y montar el dispositivo cifrado al arrancar el sistema, hay que crear el fichero ''/etc/crypttab'' y añadir: opt /dev/sdX none lunks Si no tenemos acceso a los dispositivos de bloques, podemos hacer que un fichero se comporte como un dispositivo de bloques (usará ''/dev/loop0''): # Creamos un directorio sudo mkdir /datos # Creamos un fichero en ese directorio con el tamaño de 100M sudo fallocate -l 100M /datos/opt # Ciframos el fichero sudo crytpsetup luksFormat /datos/opt # Lo abrimos sudo cryptsetup luksOpen /datos/opt opt # Creamos un sistema de ficheros sudo mkfs -t ext4 /dev/mapper/opt # Montamos sudo mount /dev/mapper/opt /opt ==== Convertir un dispositivo en LUKS ==== En realidad no hay una conversión como tal, ya que perderemos la información que contenga el dispositivo. * Realizar copia de seguridad los datos. * Borrar el dispositivo utilizando **shred** o ''dd if=/dev/urandom of=/dev/sdX''. * Instalar LUKS. * Resturar la copia de seguridad en el dispositivo ya cifrado.