Aug 25, 2009

Almacenamiento compartido en red: GFS2 + iSCSI (II)

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

SELinux

Si se tiene activado SELinux con la opción de enforcing (bloqueo), éste va a impedir el funcionamiento normal del cluster 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 todos los nodos. Dicha opción habrá que establecerla en su fichero de configuración. También habrá que reiniciar las máquinas para que todos los ficheros se etiqueten correctamente.
[... ~]# 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 de uno de estos nodos (por ejemplo en centos01); seguidamente detendremos e iniciaremos el cluster en todos los nodos 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 gfs2 restart
[root@centos01 ~]# service cman restart
[root@centos01 ~]# service rgmanager restart
[root@centos01 ~]# service clvmd restart

[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 todos los nodos (el mismo paquete generado en centos01 lo utilizaremos en centos02 y centos03).
[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) en todos los nodos 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.
[... ~]# setenforce 1

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

Iptables

Los puertos que hay que abrir en iptables son los utilizados por los servicios cman (Cluster Manager, 5404 y 5405 UDP), tgtd (3260 TCP), 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 (igual que para los otros dos nodos pero con el puerto empleado por el target iSCSI).
[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 udp -m multiport --dport 5404,5405 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp --dport 3260 -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

Y para los nodos centos02 y centos03:
[... ~]# 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 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

[... ~]# service iptables restart

[... ~]# chkconfig iptables on

No comments:

Post a Comment