SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 27 de julio de 2009

Introducción a los permisos en HDFS

Introducción
El sistema HDFS implementa un sistema de permisos muy similar a POSIX. Cada uno de los archivos tiene un propietario(user) y un grupo (group). Hasta aquí es similar a la implementación de POSIX, sin embargo HDFS no almacena el user_id y group_id sino que guarda un String con sus valores además el usuario root será aquel que lanze el proceso de Hadoop, es decir, que cualquiera con acceso local a la máquina puede ser root para Hadoop.

Esto supone que la configuración de la seguridad sea muy importante, como ya comenté en el post Instalación de Hadoop, una de las recomendaciones es que no se permita hacer login en el cluster a los usuarios.

Por ello, vamos a establecer unos niveles de seguridad mayores que nos permitan mantener en buenas condiciones nuestra instalación para poder llevarla a producción de una forma óptima.

Limitar el Acceso a nuestro NameNode
Hadoop nos permite incluir una lista de equipos permitidos (y equipos excluidos) los cuales pueden acceder a nuestro NameNode, las propiedades de configuración son las siguientes:
  • dfs.hosts, full path al archivo que contiene los hosts permitidos. Si está vacía (por defecto) todos los hosts pueden acceder
  • dfs.hosts.exclude, full path al archivo que contiene los hosts denegados. Si está vacía (por defecto) no hay ninguno denegado
  • hadoop.security.authorization, habilita el control de acceso al sistema de hadoop (es necesario editar el archivo $HADOOP_HOME/conf/hadoop-policy.xml)

Configuración de IPFilter para limitar el acceso al NameNode
Después de muchas horas con la configuración de Hadoop a vueltas, no he sido capaz de hacer funcionar de una forma sencilla el sistema de autorizaciones. Creo que existe algún tipo de incopatibilidades entre Solaris y la implementación aunque no lo veo muy claro.

Por lo tanto, he buscado la solución más sencilla que consite en activar el firewall IPFilter e incluir los DataNodes y NameNodes en un pool permitiendo su acceso y denegando al resto. Sé que es una solución muy drástica, sin embargo creo que es mucho más efectiva ya que no implica problemas con la resolución de userid o groupid, así que vamos allá.

Activación de IPFilter
Lo primero que debemos hacer es activar IPFilter para ello, ejecutaremos el siguiente comando
# ipf -E
Creamos el pool de nuestro cluster de Hadoop
La configuración de IPFilter nos permite crear un pool de direcciones y referirnos a ellos como pool/_id_ de esta forma es más sencillo gestionar un cluster. También es cierto que con nuestra configuración podemos incluir todas las reglas sin pool ya que son sólo 3 datanode y 1 namenode
# vi /etc/ipf/ipf.conf

# permitimos el acceso a nuestro NameNode
pass in quick from pool/20 to any
pass out quick from any to pool/20

# denegamos el acceso al NameNode
block in quick from any to any port=54310
block in quick from any to any port=54311

:wq!
Y creamos el Pool
# vi /etc/ipf/ippool.conf

table role = ipf type = tree number = 20
{ 10.1.1.3/32, 10.1.1.4/32, 10.1.1.5/32, 10.1.1.6/32 };

:wq
Ya está, cargamos los pool y las reglas y ya está
# ipf -E
# ipf -Fa
# ippool -F
0 objects flushed
# ippool -f /etc/ipf/ippool.conf
# ipf -f /etc/ipf/ipf.conf
He utilizado los comando ipf -Fa para hacer un flush de las reglas al igual que un ippool -F de esta forma todos los filtros están desde cero.

Conclusiones
La conclusión que obtenido es que la implementación de ACL actual en Hadoop no está tan pulida como otras, además de que la documentación es ambigua y difusa. Todo esto me ha hecho perder mucho tiempo en investigación sobre la definición de los parámetros. Sin embargo, IPFilter es un firewall muy maduro que aporta muchas soluciones (no tantas como pf de OpenBSD) para limitar el acceso al NameNode.

Espero que la configuración os sirva de startup ya que como siempre, cada Solaris es un Mundo.


Refrencias

No hay comentarios:

Publicar un comentario en la entrada