|
¿En las ACLs añades al rootdn o la condicción "by *none"? Un error común es añadir el rootdn a las ACLs; Cuando es un usuario que tiene implícitos permisos totales sobre todo el directorio, las ACLs no afectan al rootdn.
Otro error es poner como última condición en una ACL “ by * none” la cual también esta implícita y no es necesario escribirla.
| ACLs globales Las ACLS en el bloque de las directivas globales (las escritas antes de definir los backend), afectarán a todos los backend. Se debe proteger en este bloque solo las siguientes partes del directorio: rootDSE y cn=Subschema. |
|
¿Permites acceso de lectura a todo el mundo al rootDSE? Es una entrada especial que provee información sobre el propio servidor, da información sobre qué controles, características y extensiones serán comprendidas y están habilitadas en el servidor. Su DN es una cadena vacía; Se debe permitir su lectura a todo el mundo.
access to dn= "" by * read
¿Permites acceso de lectura a los usuarios autenticados al registro cn=Subschema? Es un registro especial donde se almacena toda la información de los esquemas, incluyendo la definición de atributos y de objectclass, también las reglas de búsqueda, formatos, sintaxis y estructuras. Se debe permitir leer a los usuarios autenticados:
access to dn=”cn=Subschema” by user read
|
| ACLs en los Backend Las directivas especificadas en los backend sobreescribirán a las globales. |
|
¿Tienes definidas ACLs relacionadas con el origen de la conexión?. En primer lugar se deben escribir las reglas relacionadas con el origen de la conexión, es decir, limitar desde que IPs o nombre de dominio se pueden conectar ciertas cuentas administrativas o grupos.
¿En el proveedor controlas los accesos del usuario réplica? Este usuario debe tener acceso a toda las ramas que se van a replicar, o a todo el directorio si la réplica es completa.
'access to * by dn="cn=replica,dc=ejemplo,dc=es" read by * break'
Además no debe ser afectado por los límites (sizelimit o timelimit). En el proveedor se debe controlar desde donde se podrá conectar dicho usuario, es decir solo desde los ldap consumidores y que las conexiones se realicen sobre TLS para asegurar la confidencialidad en la comunicación:
'access to dn=” cn=replica,dc=ejemplo,dc=es” by peername.ip=”192.168.13.12” tls_ssf=128 auth'
¿Tienes definidas ACLs para el atributo userPassword?. Se debe restringir lo más posible, de hecho ningún usuario debería poder leerlo. Con el tipo de acceso =xw solo se permite autenticar contra el atributo y actualizarlo pero no leerlo.
'access to attrs=userPassword,usalPassword by self =xw by anonymous auth'. Se permite a algun otro usuario acceso a este atributo, por ejemplo para administradores que creen nuevas cuentas o que tengan permiso para bloquearlas cambiando las password. Debe estar controlados lo mas posible. 'by dn=”usuario privilegiado” =xw'
¿Permites a los usuarios cambiar todos sus atributos?. Por ejemplo posixAccount es una clase para permitir usar LDAP con NIS . En esta clase se requieren los atributos gidNumber, uidNumber, homeDirectory, uid y cn, y se permiten los atributos descripción gecos loginShell y userPassword. No se debe permitir a los propios usuarios modificar la mayoría de estos atributos ya que podrían escalar privilegios en los sistemas.
¿Utilizas los grupos para crear ACLs? Se pueden dar permisos a todos los usuarios que pertenezcan a un grupo. Ejemplo: 'access to dn.subtree=”cn=personas,dc=ejemplo,dc=es” by group=”cn=administradores,ou=grupos,dc=ejemplo,dc=es” write by self read'
En este ejemplo se permite escribir en la rama personas al grupo de administradores y leer al propio usuario, el resto no tiene acceso.
[OJO] Los grupos deben pertenecer al objectClass groupOfNames y sus miembros se especifican con el atributo member, en otro caso se debe especificar en la ACL ej: 'access to dn.subtree=”ou=personas,dc=ejemplo,dc=es” by group/grupoUsal/memberUid=”cn=adminUsal,ou=grupos,dc=ejemplo,dc=es” write by * break'
Se puede expresar ACLs con expresiones regulares; Además se pueden agrupar dichas expresiones entre paréntesis para poder ser utilizadas como variables en las frases “by”. ¿Sigues los siguientes consejos cuando diseñas ACLs con expresiones regulares para evitar errores frecuentes?
Es preferible “.+” que “.*” dn.regex=”.*,dc=ejemplo,dc=es” En este caso la expresión puede abarcar cualquier rama del dominio ejemplo.es pero también el propio dominio ya que .* implica ninguno o mas caracteres.
Utilizar marcas de principio y fin “^.+,dc=ejemplo,dc=es$”
Utilizar ámbitos en lugar de expresiones regulares es más eficiente, en este caso dn.children=dc=usal,dc=es
Preferible usar la expresión “[^,]+” que “.*” ya que la segunda puede abarcar mas RDNs de los esperado: ejemplo dn.regex=”cn=.*,dc=ejemplo,dc=es” podría resultar en cn=personas,dc=ejemplo,dc=es pero también cn=admin,ou=grupos,dc=ejemplo,dc=es.
¿Utilizas "set" al diseñar ACLs? Se pueden diseñar ACLs complejas utilizando set, permite operadores booleanos y acceso a valores de atributos. Crea reglas compuestas por condiciones unidas por los operadores unión e intersección.
¿Sueles utilizar el comando slapacl para testear las ACLs? Existe desde la versión 2.3, se utiliza para testear si las ACLs escritas tienen el comportamiento deseado. Este comando no se conecta con el servidor a través del protocolo LDAP, sino que arranca su propio SLAPD . Se le puede pasar cualquier nivel de log con el parámetro -d. Se utiliza:
slapacl -x -D”que DN trata de acceder al directorio” -b”Recurso al que pretende acceder” “atributo/tipo de privilegio” -d nivel de log
Ejmplo:
slapacl -D"uid=inma,dc=ejemplo,dc=es" -b "uid=reyes,dc=ejemplo,dc=es" "userPassword/write"
Resultado:
authcDN: "uid=inma,dc=ejemplo,dc=es”
write access to userPassword: DENIED
|
|