Listas de Control de Acceso

Cuando activas las listas de control de acceso(ACL), es posible controlar qué puede hacer quién en cada página del wiki.

1. Contenidos

2. Lo básico

En cada nueva instalación las acl están activas por defecto. Para saber cómo desactivarlas Ve a Configuración.

El uso de ACLs en moin es tan sencillo como colocar una línea de control de acceso en la parte superior de la página que estás editando, como por ejemplo:

#acl CiertoUsuario:read,write All:read

/!\ Requieres derechos de admin para poder adicionar o modificar tal línea

Esto le permitirá a CiertoUsuario leer y escribir en tal página, mientras que todo el resto podrá leer pero no editarla (a menos que se haya hecho una configuración especial en el sitio).

Los adjuntos también se protegen con las ACLs de la página a la cual están vinculados cuando se ofrecen a través de los mecanismos de moin.

/!\ Los adjuntos no están protegidos cuando el servidor está configurado con acceso directo para ellos (esto es, cuando se usa la opción attachments en wikiconfig.py).

3. Configuración

Estos son los elementos que se pueden configurar en las ACLs de un sitio moin.

Atributo

Default(Valor inicial)

Descripción

acl_enabled

0

Habilita ACL cuando es verdadero

acl_rights_before

""

se aplica antes que los de la página o los valores por defecto

acl_rights_after

""

se aplica después que los de la página o los valores por defecto

acl_rights_default

"Trusted:read,write,delete,revert \
Known:read,write,delete,revert \
All:read,write"

Se usanúnicamente si no se ha establecidoningún otro ACL a la página

acl_rights_valid

["read",  "write",  "delete",  "revert",  "admin"]

Estos son los derechos válidos (conocidos) (y el lugar para extenderlos, en caso de ser necesario).

Ahora que ya sabes lo que es, pero qué significa?

Ayuda mucho pensar en el procesamiento de las ACLs en las etapas : antes, durante y después.

4. Sintaxis

La sintaxis para cada línea es de la siguiente forma:

#acl [+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default]

Donde:

/!\ No coloques espacios en blanco entre el nombre y los derechos - All: write,read no es una línea ACL válida.

5. Derechos posibles

Estos son todos los derechos disponibles que puedes usar en las ACLs. Ten en cuenta que no se permite DeletePage ni RenamePage si el usuario no es Conocido, incluso si se otorga un derecho delete.

read
Se otorga a los usuarios para permitir el derecho a leer la página.
write
Se otorga a los usuarios que van a escribir (editar) textos en la página.
delete
Se otorga a los usuarios que pueden borrar la página y sus adjuntos.
revert
Se otorga a los usuarios que pueden revertir la página a una versión anterior.
admin
Se otorga a los usuarios que tienen derechos de administración para la página. Significa aquellos que pueden cambiar los ACL de una página, incluso dando "admin" a otros o eliminando "admin" de los que sea.

/!\ No hay un derecho rename separado: para renombrar una página se requiere que el usuario tenga derechos read, write y delete.

6. Lógica de procesamiento

Cuando un usuario trata de acceder a un recurso protegido por ACLs, estas se procesan en el orden en que aparecen. la primera ACL que coincide con el usuario determinará si puede acceder o no al recurso y terminará el procesamiento una vez que haya coincidencia con una entrada las ACL.

(!) Debido a este algoritmo de la primera coincidencia es indispensable que ordenes tus ACLs: primero los usuarios, después los grupos especiales, a continuación los grupos más generales, siguiendo los Known(conocidos) y finalmente All (todos).

Por ejemplo, la siguiente ACL dice que CiertoUsuario puede leer y escribir en los recursos protegidos por tal ACL, miemtras que cualquier miembro de CiertoGrupo (excepto CiertoUsuario, si es parte del grupo) puede además administrarlo, y cualquier otro puede leerlo.

#acl CiertoUsuario:read,write CiertoGrupo:read,write,admin All:read

Hay dos modificadores adicionales para hacer el sistema más flexible: los prefijos '+' y '-'. Cuando los usas, el procesamiento se detiene si y solo si un usuario específico coincide, asignándole los permisos dados por la ACL, pero continuará si está buscando otro permiso (u otro usuario). Con '+' se otorga el permiso, con '-' se niega (en caso de que se detenga).

Por ejemplo, si CiertoUsuario es miembro de CiertoGrupo, la ACL anterior se habría escrito como:

#acl -CiertoUsuario:admin CiertoGrupo:read,write,admin All:read

Este ejemplo es solamente especial para CiertoUsuario, porque cuando se busca el permiso admin para CiertoUsuario, se le negará y se detiene el procesamiento. En cualquier otro caso, continua.

O incluso:

#acl +All:read -CiertoUsuario:admin CiertoGrupo:read,write,admin

+All:read significa que cuando cualquier usuario solicita el permiso de lectura, le será otorgado y termina el procesamiento. En cualquier otro caso, el procesamiento continuará. Si el permiso de admin se solicita para CiertoUsuario, se negará y termina el procesamiento. En cualquier otro caso, el procesamiento continuará. Finalmente si un miembro de CiertoGrupo solicita algún permiso le será concedido si se epecificó, y le será negado si no. Todos los demás usuarios no tienen permisos, excepto los dados por la configuración.

Probablemente no desearías usar el segundo o tercer ejemplo de las ACL para alguna página. Aunque son muy útiles en la configuración global.

7. Herencia de permisos predeterminados

En ciertas ocasiones es adecuado dar permisos a alguien sin afectar en gran medida los valores predeterminados. Por ejemplo, supongamos que tienes las siguientes líneas en tu configuración:

acl_rights_default = "ConfiableGrupo:read,write,delete,revert All:read"
acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"

Además deseas darele permiso de escritura "write" a CiertoUsuario en alguna página, pero deseas mantener el comportamiente inicial para todos y el grupo ConfiableGrupo. Lo puedes hacer fácilmente usando la entrada Predeterminada:

#acl CiertoUsuario:read,write Default

Tal acción insertará las líneas de acl_rights_default en el sitio exacto en el cual la palabra Default se haya colocado. En otras palabras, la entrada anterior, con la configuración dada, es equivalente a la siguiente línea:

#acl CiertoUsuario:read,write ConfiableGrupo:read,write,delete,revert All:read

Estudiemos el primer ejemplo de esta sección: acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"

Las ACL se procesan en el orden "before" después "page/default" y después "after", "de izquierda a derecha".

Así comienza a la izquierda de "before" con AdminGrupo:... - coincide si eres miembro del grupo admin. Si coincide, obtienes tales derechos (arwdr) y el procesamiento de las ACL termina.

Si no coincide, el procesamiento de ACL continua con +ConfiableGrupo:admin - que coincide si eres miembro del grupo ConfiableGrupo.

Si coincide, obtendrás los derechos (a) y - ahora la diferencia debido al modificador, - El procesamiento de ACL CONTINÚA! De tal forma que si hay otra coincidencia para un grupo o tu usuario o Known: o All: obtendrás esos derechos también.

Si no coincide, el procesamiento ACL continúa - con la página de ACLs (si hay alguna) o con las ACLs si hay otras (en caso de que no haya páginas ACL) y finalmente con las ACL "after".

A pesar de representar lo mismo, la herencia de los valores predeterminados la ventaja es que mantiene cualquier otro cambio que se haga a los valores predeterminados.

8. Grupos

Los grupos de usuarios facilitan especifica derechos para grupos más grandes. Normalmente el nombre de la página del grupo debe terminar con Grupo, por ejemplo, AmigosGrupo. Esto le permite a MoinMoin reconocerlo como una lista de usuarios. Este patrón predeterminado se puede cambiar(p.e. para otros idiomas, etc.), mira AyudaSobreConfiguración.

Solamente los amigos de CiertoUsuario pueden leer y editar esta página:

#acl CiertoUsuario:read,write CiertoUsuario/AmigosGrupo:read,write

CiertoUsuario/AmigosGrupo sería una página en la cuál los elementos de la lista de primer nivel representarían un nombre de usuario en tal grupo:

#acl CiertoUsuario:read,write,admin,delete,revert
 * PepitoPérez
 * SutanoApellido
 * MenganoMartínez

Una página llamada AdminGrupo podría definir un grupo con tal nombre y podría estar protegida por ACLs:

#acl AdminGrupo:admin,read,write All:read
 * CiertoUsuario
 * OtroUsuario
   * Esto no correspondería a un usuario
Cualquier otro texto en el primer nivel no es tenido en cuenta.

/!\ Una lista de primer nivel es aquella con solamente un espacio antes del asterisco (y debe haber otro espacio después del asterisco). Lo siguiente no funcionará:

  * cierto usuario
-- dos espacios, por lo tanto no funciona.

Puedes configurar qué páginas se consideran como páginas de definición de grupos (p.e. para wikis en otro idioma):

page_group_regex =  '[a-z]Group$'    # este es el valor predeterminado

/!\ Si los cambios en la página del grupo no surten efecto, espera a que MoinMoin reconstruya el caché removiendo todos los archivos en el directorio ruta_a_tu_instancia_de_wiki/data/cache/wikidicts/

9. Casos de uso

9.1. Wiki de una comunidad pública en Internet

El punto más importante es usar las ACLs solamente en aquellos casos en los que sean necesarias. Los wikis dependen de la apertura de la información y la libertad de edición. Usan seguridad suave para limpiar contenidos no deseados. Por lo que en general no se necesitan ACLs. Sí las usas demasiado, puedes destruir la forma en que el wiki funciona.

Esta es la razón por la cual las ACLs no deberían usarse (predeterminadamente) o, en caso de que se usen, el archivo wikiconfig.py debería lucir como:

acl_rights_before = 'NombreEditorWiki:read,write,admin,delete,revert +AdminGrupo:admin ChicoMalo:' 

Los parámetros iniciales de acl_rights_default deberían funcionar para tí:

acl_rights_default = 'Known:read,write,delete,revert All:read,write' 

Un buen consejo es tener un grupo selecto de administradores confiables en AdminGrupo (Deberían entender claramente como funciona un wiki y podrían destruir accidentalemente la forma en que un wiki funciona: gracias a su apertura, no a ser cerrado y protegido!).

Si usas AdminGrupo, deberías crear una página llamada AdminGrupo y usarla para definir las personas que tienen derechos de administración.

Especificar a ChicoMalo como se mostró, básicamente lo segrega - no puede leer o editar nada con tal cuenta. Sólo tiene sentido si se hace temporalmente, de otra forma, mejor borra esa cuenta. Por supuesto, este ChicoMalo puede trabajar anónimamente, así que no es una protección real (Aquí es donde se aplica la seguridad suave).

9.2. Wiki como un CMS sencillo

Si quieres usar un wiki para crear contenido web de forma rápida, pero no quieres ediciones hecas por el público (solamente por ciertos webmasters), podrías querer usar algo como lo siguiente en wikiconfig.py:

acl_rights_default = 'All:read' 
acl_rights_before  = 'WebMaster,OtherWebMaster:read,write,admin,delete,revert' 

Todos pueden leer, pero solamente los webmaster pueden hacer de todo. Siempre que ellos puedan trabajar en una nueva página, pueden colocar

#acl All: 

para que nadie más pueda ver una página que no está lista. Cuando esté terminada, no olvides eliminar esta línea de nuevo, para usar los acl_rights_default.

Algunas páginas podrían aceptar también comentarios del público(Por ejemplo ComentariosVarios), podrías dar más derechos sobre esa página:

#acl All:read,write 

9.3. Wiki en una Intranet

Si quieres usar un wiki en tu intranet y confías en tus usuarios (no hacen acciones hostiles, como por ejemplo, bloquear a otros usuarios o secuestro de páginas) para usar la funcionalidad de administración de forma razonable, podrías usar:

acl_rights_default = 'Known:admin,read,write,delete,revert All:read,write'
acl_rights_before  = 'WikiAdmin,GranJefe:read,write,admin,delete,revert' 

De forma que todos podrían leer, escribir cambiar derechos de ACLs, WikiAdmin y el GranJefe podrían hacer cualquier cosa, los usuarios registrados podrían tener derechos de administración gracias a acl_rights_default (obteniéndolas, a menos que se haya especificado otra ACL para cierta página).

Consecuencias:

9.4. Wiki como una página pública de una compañía

Si deseas usar un wiki como la página de la compañía, y no deseas que cualquier individuo pueda cambiar los contenidos, podría interesarte algo como esto :

acl_rights_default = "ConfiableGrupo:admin,read,write,delete,revert All:read"
acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"

Que significa:

9.5. Comentarios en páginas de sólo-lectura

Puedes adicionar comentarios de forma sencilla a la página de sólo-lectura usando una subpágina con permisos de escritura, para permitir a otros escribir en ella. Por ejemplo, puedes definir CiertaPágina así:

#acl CiertoUsuario:read,write All:read
'''Contenido de sólo-lectura'''

...

''' Comentarios de Usuarios '''
<<Include(CiertaPágina/Comentarios)>>

en dónde CiertaPágina/Comentarios luce así:

#acl All:read,write
Añade tus comentarios acerca de CiertaPágina