lunes, 26 de abril de 2010

Authbind y permisos sobre puertos menores a 1024

Authbind permite la configuración del uso de los puertos menores a 1024 a usuarios que no son root. Esta característica del sistema es propia de kubuntu 10.04 y otras distribuciones.

Esto es útil para aplicaciones como Tomcat que usan el usuario tomcat6 para hacer bind a las direcciones y puertos que usan. Hay que tener en cuenta que, actualmente, authbind no puede ser usado con tcp6, solo debemos usarlo con tcp4.

Authbind se configura en /etc/authbind/ y dentro de este directorio encontramos tres subdirectorios que permiten granularidad en la configuración. Funciona así.

  1. Authbind busca primero en el directorio /etc/authbind/byport/ ficheros llamados "[port]" es decir el fichero lleva el nombre del puerto, por ejemplo "25". Si encuentra el fichero y este fichero es ejecutable por el usuario al que queremos permitir el uso del puerto, entonces se autoriza a ese usuario a usar ese puerto en particular, si no, deniega su uso y pasa al paso dos.
  2. En segundo lugar busca en el directorio /etc/authbind/byaddr/ los ficheros con nombre "[ipaddress]:[port]", por ejemplo "192.168.3.125:25". Si el fichero es ejecutable para el usuario le permite su uso en la dirección especificada. Si no, deniega y pasa al punto tres.
  3. En último lugar busca el en el directorio /etc/authbind/byuid/ un fichero llamado "[uid]", es decir, con el nombre del número de identificación de usuario al que queremos permitir el uso de puertos. El fichero tiene permisos de lectura, escritura y ejecución para el usuario al que se le permite el uso y 0 permisos para el grupo y otros. Si se encuentra este fichero, entonces lee linea a linea y va autorizando las direcciones y rangos de puertos que pongan en cada linea al usuario con esa uid. Las lineas tiene el formato [ipaddress]/[netmaskprefix]:[puertoinicial],[puertodestino]. Por ejemplo, la linea 192.168.3.56/32:25,110 permite el uso de los puertos 25 a 110 en la dirección 192.168.3.56. Si no se encuentra el fichero o el fichero está vacío, se deniega el uso de puertos definitivamente.

Pongamos el caso de Alfresco. Cuando desplegamos el war en tomcat 6 en Kubuntu Lucid, Alfresco usa un servidor CIFS/Samba que usa los puertos 445 y 139. Estos puertos no pueden ser accedidos por el usuario tomcat6 ya que no es root, y, por tanto, la aplicación Alfresco tampoco puede usarlos.

Para habilitar los puertos se activa en /etc/default/tomcat6 la directiva authbind=true y se mantiene deshabilitada la seguridad de java #TOMCAT6_SECURITY=no (esto es debido a errores, bugs, con jsvc en los inicios y paradas del servicio tomcat). Esta activación hace que se cree un fichero en /etc/authbind/byuid llamado 113 (es el uid del usuario tomcat6) con permisos 700 (rwx,---,---) para tomcat6. Dentro del fichero se encuentra la linea 0.0.0.0/32:1,1023 que da acceso al usuario tomcat6 a todas las direcciones y a todos los puertos del 1 al 1023 para que puedan ser utilizadas.

Como Alfresco es ejecutado por el usuario tomcat6, ya que es una aplicación war desplegada dentro de Tomcat, esta tendrá permisos para usar esos puertos en esas direcciones evitando tener que redireccionar puertos superiores a 1024 para los servicios que use.

Hasta Kubuntu 10.04 no había oido hablar de esta herramienta. Creo que es bastante útil saber como usarla. Siempre teniendo en mente la seguridad del sistema.

NOTA: Para Tomcat 6, se ha alcanzado consenso entre Debian y Ubuntu con ayuda del creador de Tomcat: The Definitive Guide para usar authbind en vez de jsvc.
Related Posts with Thumbnails