Ejercicios Endurecimiento de sistemas (system hardening). Francisco Javier Cervigon Ruckauer

Ejercicios Endurecimiento de sistemas (system hardening)

Ejercicio: Restaurar la copia de seguridad para la unidad

En esta unidad se va aprender a robustecer un servidor Linux. Para que el ejercicio resulte más realista, es necesario comenzar en un escenario diferente al que viene por defecto con NETinVM. Aprovechando la posibilidad de realizar y restaurar copias del estado de las máquinas UML, se prodecerá a restaurar un estado preparado específicamente para este ejercicio en el que el servidor dmzc tiene una configuración poco segura.
El estado está almacenado en el fichero "uml_machines_2015-07-30_10-04_hardening.tgz", incluido como copia de seguridad en la NETinVM del curso. (La descripción de cómo hacer copias de seguridad y cómo restaurarlas está incluida en la demostración "Copias de seguridad de las UMLs").
Aviso
Al restaurar una copia de seguridad se elimina el estado actual de las UML. Por lo tanto, se recomienda realizar una copia de seguridad antes.
Acciones a realizar:
  1. Comprobar que las máquinas UML están paradas.
  2. Realizar, si no se ha hecho antes, una copia del estado actual y etiquetarlo adecuadamente renombrando el fichero resultante.
  3. Restaurar la copia de seguridad indicada.

Ejercicio: Preparar una configuración de UMLs personalizada

Para los ejercicios siguientes, se va a utilizar dmzc como ejemplo de servidor poco seguro en el que ir aplicando las diferentes medidas para robustecer los sistemas. Durante los ejercicios se van a usar las siguientes máquinas UML:
  • dmzc. Ejemplo de servidor mal configurado.
  • fw. Necesario para que dmzc pueda acceder a las diferentes redes UML y a Internet.
  • exta. Máquina con acceso desde la red externa.
  • inta. Máquina con acceso desde la red interna.

Para que solamente se pongan en marcha las UMLs indicadas, será necesario modificar el guión "uml_run_my_uml.sh". (La forma de hacerlo se describe en la unidad Ejercicio: Puesta en marcha de un cierto conjunto de UMLs).
Acciones a realizar:
  1. Editar el guión "uml_run_my_uml.sh" para que solamente se ejecuten las máquinas indicadas.
  2. Lanzar las máquinas UML usando el icono "Run my UMLs".
  3. Comprobar que efectivamente se han puesto en marcha las máquinas esperadas.

Ejercicio: Aplicar parches

Cada distribución de Linux tiene su propias herramientas para la gestión de paquetes, pero en todas existe la opción de instalar actualizaciones. En el caso de Debian, la herramienta de gestión de paquetes se denomina apt-get, y la forma de actualizar el sistema es ejecutar las siguientes órdenes:
apt-get update
apt-get upgrade

La primera actualiza la información sobre los paquetes disponibles en los repositorios. Y la segunda permite aplicar las actualizaciones disponibles. Esta segunda orden muestra la lista de cambios que se realizarán en el sistema y solicita confirmación antes de continuar.
Aviso: esta copia de dmzc tiene una lista anticuada de repositorios, por lo que es necesario ejecutar antes la orden "sh /mnt/tmp/update_apt-get.sh" como "root" en dmzc. (En caso de haber borrado este fichero, se puede descargar de nuevo: update_apt-get.sh. Si se descarga en "base", es necesario guardarlo en la carpeta "/home/user1/uml/mntdirs/tmp/").
Acciones a realizar:
  1. Ejecutar la orden "sh /mnt/tmp/update_apt-get.sh".
  2. Actualizar la máquina dmzc.

Durante la actualización, puesto que se actualiza la librería del sistema ("libc"), es normal que se sugiera reiniciar algunos servicios. Se debe seleccionar "Ok" en el cuadro de diálogo que aparece.
Tras la actualización, si se intenta una nueva actualización, apt-get upgrade debería indicar que no hay cambios pendientes:
root@dmzc:~# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Acción a realizar: comprobar que no quedan cambios pendientes en dmz

Ejercicio: Limitar los servicios en ejecución

Lógicamente, la mejor forma de reducir los servicios en ejecución es no instalar (o eliminar) los paquetes de los servicios que no se van a utilizar.  De todas formas, desactivar los servicios en Debian es sencillo, pues basta con usar la orden insserv.
Sin embargo, lo primero es saber qué servicios están en ejecución. Para ello se puede usar la orden netstat o, la más reciente, ss. Por ejemplo, con netstat
root@dmzc:~# netstat --inet --listen -np
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program 
name
tcp        0      0 0.0.0.0:59646           0.0.0.0:*               LISTEN      
1189/rpc.statd  
tcp        0      0 0.0.0.0:2049            0.0.0.0:*               LISTEN      
-               
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      
1175/portmap    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
1386/apache2    
tcp        0      0 0.0.0.0:45840           0.0.0.0:*               LISTEN      
-               
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
1509/sshd       
tcp        0      0 0.0.0.0:36089           0.0.0.0:*               LISTEN      
1369/rpc.mountd 
udp        0      0 127.0.0.1:941           0.0.0.0:*                           
1189/rpc.statd  
udp        0      0 0.0.0.0:49362           0.0.0.0:*                           
1369/rpc.mountd 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           
1175/portmap    
udp        0      0 0.0.0.0:36209           0.0.0.0:*                           
-               
udp        0      0 0.0.0.0:2049            0.0.0.0:*                           
-               
udp        0      0 0.0.0.0:48280           0.0.0.0:*                           
1189/rpc.statd  
root@dmzc:~#

El resultado informa de que hay procesos escuchando en 7 puertos TCP y en 6 de UDP.   Muchos puertos están asociados con servicios bien conocidos, y están incluidos en el fichero "/etc/services". La orden "netstat" puede consultar este fichero y dar una salida más fácil de leer si eliminamos la opción "-n" (de numeric). 
De los puertos asignados,  en TCP están en escucha el 2049 (nfs),  111 (sunrpc), el 80 (www) y el 22 (ssh). Además, "netstat" nos indica que, por ejemplo, en el puerto 22 de TCP está escuchando el proceso con identificador (PID) 1509 y que el programa que está ejecutando este proceso en "sshd".  Puesto que no están enlazados con ninguna dirección concreta, todos los servicios pueden ser usados desde cualquier IP. Sin embargo, el puerto 2049 no está asociado con ningún proceso, lo que indica que es el propio núcleo de Linux el que está escuchando. De forma similar se puede observar que en UDP están abiertos también los puertos 111 (sunrpc) y 2049 (nfs). 
Los puertos no asignados pueden haber sido usados por cualquier aplicación. Sin embargo, si está en marcha el servidor portmap (servicio 111, sunrpc), las aplicaciones que usan RPC (Remote Procedure Calls) pueden registrarse con el portmapper para que los clientes sepan a qué puertos deben conectarse. Éste es el caso de  servicios asociados a NFS como el estado (status, ofrecido por rpc.statd), cerrojos (nlockmgr, ofrecido directamente por el núcleo en este caso) o el montaje de sistemas NFS (mountd, ofrecido por rpc.mountd). La forma de saber qué puertos están usando los servidores que usan RPCs es usar la orden "rpcinfo":
root@dmzc:~# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  48280  status
    100024    1   tcp  59646  status
    100021    1   udp  36209  nlockmgr
    100021    3   udp  36209  nlockmgr
    100021    4   udp  36209  nlockmgr
    100021    1   tcp  45840  nlockmgr
    100021    3   tcp  45840  nlockmgr
    100021    4   tcp  45840  nlockmgr
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100005    1   udp  49362  mountd
    100005    1   tcp  36089  mountd
    100005    2   udp  49362  mountd
    100005    2   tcp  36089  mountd
    100005    3   udp  49362  mountd
    100005    3   tcp  36089  mountd
root@dmzc:~#

Acción a realizar: comprobar los servicios activos en dmzc usando netstat (o ss) y rpcinfo.
Lo siguiente es averiguar el nombre de los servicios que lanzan a los procesos que están aceptando conexiones. Aunque en este caso más o menos coinciden, puede ser necesario realizar cierta tarea de averiguación. Los nombres de los servicios se corresponden con los guiones de intérprete de órdenes que están alojados en el directorio "/etc/init.d".
Una vez se sabe el nombre del servicio, será necesario hacer dos cosas:
  1. Parar el servicio. Para ello se utiliza la orden "service nombre_de_servicio stop".
  2. Cambiar la configuración para que el servicio no se ponga en marcha la próxima vez que arranque el sistema. Para ello se usa la orden "insserv" con la opción "-r".

Acciones a realizar:
  1. Parar los servicios "nfs-kernel-server", "nfs-common", "portmap" y "apache2".
  2. Cambiar la configuración del sistema para que estos servicios no se activen en el próximo arranque.
  3. Rearrancar dmzc.
  4. Comprobar que solamente ofrece el servicio SSH.
Francisco Javier Cervigon Ruckauer

No hay comentarios:

Publicar un comentario