Sep 20, 2009

Almacenamiento compartido en red: GFS2 + NFS (II)

En esta segunda parte del artículo Almacenamiento compartido en red: GFS2 + NFS, vamos a ver cómo securizar la infraestructura con SELinux, TCP wrappers e iptables.

SELinux

Si se tiene activado SELinux con la opción de enforcing (bloqueo), éste va a impedir el funcionamiento normal del servidor centos01 bloqueando ciertas acciones que en base a las políticas de seguridad que trae por defecto, no son correctas o no están permitidas.

La solución pasa por crear un módulo de política local para SELinux que permita dichos accesos. Este módulo se puede generar a partir de los eventos registrados en el archivo audit.log.

Primero vamos a activar SELinux en modo permisivo en el nodo centos01. Dicha opción habrá que establecerla en su fichero de configuración. También habrá que reiniciar la máquina para que todos los ficheros se etiqueten correctamente.
[root@centos01 ~]# vim /etc/selinux/config
...
SELINUX=permissive
SELINUXTYPE=targeted

SELinux en modo permisivo registrará las alertas de seguridad en el fichero audit.log pero no bloqueará las acciones.

A continuación vamos a vaciar el fichero audit.log del nodo centos01; seguidamente detendremos e iniciaremos el cluster y a partir de los eventos registrados en el archivo audit.log, generaremos un módulo de política local (cluster.te) y lo instalaremos.
[root@centos01 ~]# >/var/log/audit/audit.log

[root@centos01 ~]# service clvmd stop
[root@centos01 ~]# service rgmanager stop
[root@centos01 ~]# service cman stop
[root@centos01 ~]# service gfs2 stop

[root@centos01 ~]# service gfs2 start
[root@centos01 ~]# service cman start
[root@centos01 ~]# service rgmanager start
[root@centos01 ~]# service clvmd start

[root@centos01 ~]# audit2allow -m local -l -i /var/log/audit/audit.log > cluster.te

[root@centos01 ~]# cat cluster.te
module local 1.0;

require {
type ccs_t;
type tmpfs_t;
type initrc_t;
class sem { unix_read write unix_write associate read destroy };
class shm { write unix_read unix_write associate read destroy };
class file { read write };
}

#============= ccs_t ==============
allow ccs_t initrc_t:sem { unix_read write unix_write associate read destroy };
allow ccs_t initrc_t:shm { write unix_read unix_write associate read destroy };
allow ccs_t tmpfs_t:file { read write };

Antes de poder instalar el módulo, habrá que compilarlo (cluster.mod) y obtener el paquete de seguridad correspondiente (cluster.pp), el cual ya podremos instalar en el nodo centos01.
[root@centos01 ~]# checkmodule -M -m -o cluster.mod cluster.te

[root@centos01 ~]# semodule_package -o cluster.pp -m cluster.mod

[root@centos01 ~]# semodule -i cluster.pp

Y ya por último, para activar SELinux en modo enforcing (bloqueante) ejecutaremos el comando setenforce 1. Y para hacer que este cambio sea persistente tras sucesivos reinicios de la máquina, activaremos esta opción en el fichero de configuración de SELinux.
[root@centos01 ~]# setenforce 1

[root@centos01 ~]# cat /etc/selinux/config
...
SELINUX=enforcing
SELINUXTYPE=targeted

TCP wrappers

Para securizar el servidor centos01 con TCP wrappers, vamos a habilitar los servicios portmap (demonio de asignación de puertos dinámicos) y mountd (demonio encargado de la gestión de volúmenes NFS) para el rango de direcciones IP de los nodos centos02 y centos03.
[root@centos01 ~]# cat /etc/hosts.deny
ALL: ALL

[root@centos01 ~]# cat /etc/hosts.allow
sshd: ALL
portmap: 192.168.1.
mountd: 192.168.1.

Para que el servicio NFS pueda ser posteriormente protegido por iptables, tendremos que añadir los siguientes puertos al fichero /etc/sysconfig/nfs.
[root@centos01 ~]# cat /etc/sysconfig/nfs
...
MOUNTD_PORT="4002"
STATD_PORT="4003"
LOCKD_TCPPORT="4004"
LOCKD_UDPPORT="4004"
RQUOTAD_PORT="4005"

Iptables

Los puertos que hay que abrir en iptables son los utilizados por los servicios cman (Cluster Manager, 5404 y 5405 UDP), NFS (Network File System, 111 TCP y UDP, 2049 TCP y UDP, 4002:4005 TCP y UDP), modclusterd (16851 TCP) y dlm (Distributed Lock Manager, 21064 TCP).

A continuación se muestra el contenido del fichero de configuración de iptables para el nodo centos01.
[root@centos01 ~]# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport ssh -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p udp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p udp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 4002:4005 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p udp --dport 4002:4005 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p udp -m multiport --dport 5404,5405 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 16851 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 21064 -j ACCEPT
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j REJECT
COMMIT

[root@centos01 ~]# service iptables restart

[root@centos01 ~]# chkconfig iptables on

No comments:

Post a Comment