Tabla de Contenidos

[FORT] Tema 1: Fortificando el sistema operativo

Un sistema operativo recién instalado es siembre inseguro. Normalmente tiene cierto número de vulnerabilidades que se originan de:

Que es endurecer el sistema operativo (Hardening)

Proceso de configurar el sistema operativo para que sea lo más seguro posible. Implica:

Principios de la securización del sistema

Para lograr esto se debe:

Posibles amenazas y vulnerabilidades

Para un sistema de información las amenazas pueden venir de:

Si se explota una vulnerabilidad de nuestro sistema es posible que: Nuestro sistema deje de rendir como debe La información de nuestro sistema es destruida o filtrada

Aplicaciones seguras

El software en un sistema fortificado debe ser fiable y seguro que hace lo que tiene que hacer y lo hace bien:

Principios de seguridad

Tenemos 2 principales principios de seguridad:

Principio de varias lineas de defensa

Tenemos que asumir que todas las medidas de seguridad implementadas van a fallar:

Restricción de privilegios

Cada usuario debe tener los permisos mínimos para hacer la tarea que está haciendo. Generalmente en los sistemas se tienen más privilegios de los necesarios, lo que puede ser un problema de seguridad.

Se recomienda que las aplicaciones se ejecuten virtualizadas.

Fases de la securización

Securizando el Arranque

Es una de las partes que más dependen del hardware. En intel coexisten 2 métodos de arranque: BIOS o Legacy y UEFI:

ARM utilizaun sistema de Arranque similar a UEFI, mientras que SBCs como raspberry usan BIOS.

Proceso de arranque

  1. Se ejecuta el código de la BIOS (Firmware) guardado en una ROM.
    • Se realiza un POST (Power On Self Test)
    • Se hace una prueba de la memoria
  2. Tras eso viene el cargador, un programa lo suficientemente simple para ser ejecutado por el firmware y lo suficientemente sofisticado como para cargar el Sistema Operativo. En linux se usa GRUB (Grand Unified Boot Loader).
    • El cargador debe saber donde está el kernel para cargar el sistema operativo.
    • El cargador debe esta en el primer bloque de memoria
    • Es un archivo en un formato especial llamado .EFI en el caso de UEFI (localizados en /boot/efi/EFI).
    • Linux es un sistema operativo modular, por lo que se carga lo que es necesario en el arranque, haciendo que sea muy rápido.
    • En el caso de Linux el cargador debe saber donde están los diferentes módulos del sistema (Directorio /boot para kernel y /lib/modules para los módulos).
    • Los módulos se almacenan en el initrd agrupados (Initial Ram Disk).
    • Con “efibootmgr” se puede modificar el orden de arranque UEFI.
    • Con “efibootmgr -v” se pueden ver los archivos de arranque UEFI.
    • El cargador tiene un archivo de configuración que le dice que sistema operativo tiene que cargar.
  3. Arranca el sistema operativo

Configurar Consola del Grub

ls #Para ver las particiones
set root=hd0,msdos3 #Seleccionamos partición
ls / #Vemos que hay en la partición en cuestión
linux /boot/vmlinux-amd64 #Le decimos donde está el kernel a GRUB
initrd /boot/initrd-nombre root=/dev/sda1 #Le decimos donde está Initrd y donde están los ficheros al GRUB
boot

Vulnerabilidades en el proceso de arranque

Se le debe poner una contraseña al Firmware para cambiar la configuración (También se puede hacer para cada vez que se arranca, pero esto hace que sea tedioso arrancarlo.) Introduciendo parámetros en GRUB es posible acceder al Root del equipo, lo que es una vulnerabilidad muy grave.

Securizando el sistema de Ficheros

Tenemos dos aproximaciones al uso de discos y particiones en linux:

Posibles amenazas para el sistema de archivos

Securización de Aplicaciones

Identificar y eliminar aplicaciones no utilizadas

Hay 2 tipos de aplicaciones:

Cuando se instala una distribución de linux hay muchas aplicaciones que no son necesarias de las cuales se puede prescindir. Se pueden poner límites a las configuraciones en /etc/security/limits.conf. Estos límites son por sesión, estos límites tienen uno hard y uno soft. El límite soft se puede superar, siempre y cuando no sobrepase el límite hard. Para limitar una aplicación podemos usar:

Limitar recursos de aplicaciones con cgroups

Los cgroups son jerárquicos. Para crear un cgroup hacemos lo siguiente

cd /sys/fs/cgroup/ #Ruta de los cgroups
mkdir prueba #Creamos nuevo cgroup

Los ficheros del cgroup son como los ficheros de proc. Ahora el directorio /prueba debería estar poblado por numerosos archivos. Para añadir un proceso al cgroup hacemos lo siguiente:

echo 2007 > cgroup.procs #Metemos el proceso 2007 en cgroup.procs

Para limitar el consumo de cpu hacemos:

echo 10000 1000000 > cpu.max #Por cada 100000 de CPU se asigna 10000 de CPU al programa.

Para limitar el consumo de memoria:

echo 5000000 > memory.high #Se limita a 500000 de memoria el uso del programa

se pueden parar todos los procesos del cegroup con:

echo 1 > csgroup.freeze

Para liberar los programas se usa:

 echo 0 > csgroup.freeze

Ejecución en jaulas chroot

El programa que se ejecuta en estas jaulas no puede subir del directorio en el que se ejecuta. Antiguamente se usaba para testear software y para servidores FTP. Se suele usar cuando se arranca un medio de instalación. Para tener un entorno ChRoot funcional se hace lo siguiente:

Entorno de virtualización

La creación de containers es muy simple, utilizamos lxc: <Code> lxc-create </code>

Se pueden ver los contenedores que se pueden crear en /usr/share/

lxc-create -t alpine -n NOMBRE_CONTENEDOR #En este caso alpine sería el tipo de contenedor

Para arrancar el container usamos el siguiente comando:

lxc-start -F -n NOMBRE_CONTENEDOR #el -F indica que es en primer plano y el -n el nombre del contenedor.

Para parar el contanier se usa:

lxc-stop -n NOMBRE_CONTENEDOR

Los containers tienen usuarios predefinidos que se suelen indicar al crear el container. Podemos ejecutar algo en el container con:

lxc-attach -n NOMBRE_CONTENEDOR /bin/sh #Por ejemplo, ejecutamos un shell en el container

Una vez conectados así al contanier le podemos poner una contraseña con el comando “passwd root” y podemos crear un usuario nuevo en esta con “useradd -m NOMBRE”. Podemos ver los container arrancados y sus ips con:

lxc-ls -f

Para entrar en un container que no se ha iniciado con -F podemos usar SSH contra su IP. lxc crea una interface llamada bridge 0 para conectar los containers mediante NAT como si fuera virtualbox. para configurar la red de un container vamos a la dirección:

cd /var/lib/lxc

Aquí hay una carpeta por container, para configurar uno vamos al que queramos y modificamos el archivo config. Dentro de este se pueden ajustar más parámetros, como el autoarranque o la memoria entre otros. Mediante NFTables podemos comunicar el container con el exterior para que pueda prestar servicios. Esto nos permite arrancar aplicaciones de forma aislada. Dentro de /var/lib/lxc/NOMBRE_CONTAINER/rootfs podemos encontrar los archivos usandos dentro del container. Estos aparecen como pertenecientes al usuario que creó el container, a pesar de ello la máquina los puede usar, esto se debe a que comparte los identificadores con la máquina HOST

Mandatory Access Control

Hay 2 tipos:

SELinux

Usado por Fedora. Permisos por archivos, todo tiene una etiqueta (Archivos, procesos, etc…) que dice que puede acceder a que. Solo se admiten los acceso permitidos por las etiquetas. Para convertir una máquina en SELinux primero hay que instalar los siguientes paquetes:

apt install selinux-basics selinux-utils selinux-policy-defualt auditd 

Tras es activamos selinux con el siguiente comando:

selinux activate

esto crea un archivo /.autorelabel para etiquetar los ficheros no etiquetados. Selinux necesita EXT4. Si se usa Selinux no se puede compartir el directorio home entre dos distros que no lo usen. Selinux tiene 2 modos:

También añade al grub en /boot/grub/grub.cfg el modo security = selinux. En /etc/selinux/config podemos cambiar el modo de selinux de permisive a enforce.

Para ver los avisos generados por selinux podemos usar el siguiente comando:

audit2why -a

APParmor

Usado por debuan. Permisos por aplicación indicando donde puede acceder y donde no. Para habilitar un programa con apparmor usamos el comando:

apparmor_parser /etc/apparmor.d/usr.bin.programa

Por defecto el programa se pondrá en modo enforce. Para saber el estado de las aplicaciones en apparmor usamos

aa-status

para que al usar un programa simplemente mande un warning usamos complain:

aa-complain /usr/bin/programa

Securización de las cuentas de usuarios

Se trata de endurecer la autenticación y evitar que algunos usuarios tengan más permisos de los que deberían.

Comandos

Obtener ID de una partición

blkid /dev/sda4 

Crear un grupo de volúmenes

Ponemos el nómbre que le queremos dar al grupo y los volúmenes que queremos usar para crear este.

vgcreate GRUPOVOLS /dev/sda4

Estender un grupo de volúmenes

Primero ponemos el grupo a modificar y después los volúmenes que queramos añadir.

vgextend GRUPOVOLS /dev/sdb1 /devsdb2 /dev/sdb3

Mostrar grupo de volúmenes

vgdisplay

Crear un volúmen lógico

Con -L indicamos el tamaño, después el grupo de volúmenes que vamos a utilizar y finalmente el nombre del volúmen lógico.

lvcreate -L 15G GRUPOVOLS VOLUMILLO

La ubicación resultante está en: /dev/GRUPOVOLS/VOLUMILLO