Los sistemas operativos FreeBSD admiten dos tipos de listas de control de accesos para los sistemas de archivos ZFS: POSIX.1e (las mismas que soporta Linux) y NFSv4 (parte del protocolo NFS versión 4).

Anteriormente expliqué detalladamente cómo implementar y trabajar con ACLs POSIX en Linux, en esta oportunidad voy a demostrar cómo trabajar con ACLs NFSv4 en FreeBSD.



En FreeBSD, las herramientas getfacl y setfacl son diferentes a las que se encuentran disponibles en las distribuciones GNU/Linux, ya que son un desarrollo propio del proyecto, y soportan ambos formatos de ACLs anteriormente mencionados. Sin embargo comparten la mayoría de las opciones de línea de comandos. Por ejemplo, la versión de seftacl de FreeBSD comparte las opciones -mMxXbknd de la versión de GNU/Linux, sin embargo no posee la opción -R (para correr de manera recursiva sobre un árbol de directorio, una opción muy utilizada) e incluye otra opciones adicionales.

setfacl de GNU/Linux:

root@debian:~# setfacl --help
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl        modify the current ACL(s) of file(s)
  -M, --modify-file=file  read ACL entries to modify from file
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file
  -b, --remove-all        remove all extended ACL entries
  -k, --remove-default    remove the default ACL
      --set=acl           set the ACL of file(s), replacing the current ACL
      --set-file=file     read ACL entries to set from file
      --mask              do recalculate the effective rights mask
  -n, --no-mask           don't recalculate the effective rights mask
  -d, --default           operations apply to the default ACL
  -R, --recursive         recurse into subdirectories
  -L, --logical           logical walk, follow symbolic links
  -P, --physical          physical walk, do not follow symbolic links
      --restore=file      restore ACLs (inverse of `getfacl -R')
      --test              test mode (ACLs are not modified)
  -v, --version           print version and exit
  -h, --help              this help text

setfacl de FreeBSD:

root@fbsd11:~ # setfacl 
usage: setfacl [-bdhkn] [-a position entries] [-m entries] [-M file] [-x entries] [-X file] [file ...]

Para el caso de la herramienta getfacl sucede algo similar, algunas opciones coinciden y otras son totalmente diferentes. A su vez, la salida para las ACLs en formato POSIX.1e son idénticas.

Cuando las ACLs son en formato NFSv4 la salida cambia, pues este formato posee diferentes campos. Veamos un ejemplo:

root@fbsd11:/zdata/www/webapp # getfacl files/
# file: files/
# owner: www
# group: www
            owner@:rwxp--aARWcCos:-------:allow
            group@:rwxp--a-R-c--s:-------:allow
         everyone@:------a-R-c--s:-------:allow

Se observa que el formato de cada entrada es diferente y posee un mayor número de campos. Esto se debe a que, el filesystem en cuestión está montado con soporte para ACLs en formato NFSv4:

root@fbsd11:~ # mount | grep www
zdata/www on /zdata/www (zfs, local, noatime, noexec, nosuid, nfsv4acls)

Las entradas de una ACL NFSv4 cuentan con cuatro o cinco campos separados por dos puntos (:).

  • Un tag, que define si el permiso aplica sobre usuarios, grupos o todo el mundo (user, group, owner@, group@ o everyone@).
  • Un calificador (sólo para tags user y group) que identifica al usuario o grupo.
  • Los permisos de acceso:
    • r (lectura)
    • w (escritura)
    • x (ejecución)
    • p (append, agregar datos)
    • D (eliminar hijo)
    • d (eliminar)
    • a (leer atributos)
    • A (escribir atributos)
    • R (leer atributos extendidos)
    • W (escribir atributos extendidos)
    • c (leer ACL)
    • C (escribir ACL)
    • o (cambiar dueño)
    • s (sincronizar)
  • Los flags de herencia de los permisos aplicados.
  • El tipo de ACL, que puede ser allow (permitir) o deny (denegar).

d (DELETE) indica si el conjunto de usuarios sobre el cual aplica la ACL tiene permisos para eliminar el archivo/directorio. D (DELETE_CHILD) sólo aplica sobre directorios e indica si el conjunto de usuarios sobre el cual aplica la ACL tiene permisos para eliminar un archivo o subdirectorio dentro del mismo.

A modo de ejemplo, examinemos la ACL del directorio files/ listada anteriormente:

  • owner@:rwxp--aARWcCos:-------:allow: el usuario dueño del directorio (usuario "www", de acuerdo a los permisos Unix del v-nodo) puede leer, escribir, ejecutar, agregar datos, leer y escribir los atributos, leer y escribir los atributos extendidos, leer y escribir la ACL, cambiar el ownership y sincronizar.
  • group@:rwxp--a-R-c--s:-------:allow: el grupo dueño del directorio (grupo "www", de acuerdo a los permisos Unix del v-nodo) puede leer, escribir, ejecutar, agregar datos, leer los atributos, leer los atributos extendidos, leer la ACL y sincronizar.
  • everyone@:------a-R-c--s:-------:allow: el resto del mundo sólo puede leer los atributos, leer los atributos extendidos, leer la ACL y sincronizar.

Supongamos que se requiere que el usuario y grupo "webadmin" sean capaces de leer y escribir sobre dicho directorio. Para modificar una ACL NFSv4 se utiliza la misma herramienta setfacl al igual que con las ACLs POSIX. Salvo que la sintaxis de la ACL corresponde con la versión de ACL que utiliza el sistema de archivos subyacente.

Con la opción -m se modifica la ACL de un archivo/directorio al igual que la versión de GNU/Linux:

root@fbsd11:/zdata/www/webapp # setfacl -m u:webadmin:rwxp::allow files
root@fbsd11:/zdata/www/webapp # setfacl -m g:webadmin:rwxp::allow files

Si el usuario/grupo sobre el que aplica la ACL especificada no está definidio, se agrega una nueva entrada. Si se aplica sobre un usuario/grupo ya definido en la ACL actual, se modifica la entrada existente.

Estos comandos indican que se modifique la ACL del directorio "files". El primer comando permite (allow) que el usuario "webadmin" (u:webadmin) sea capaz de leer, escribir, modificar y agregar datos (rwxp). La segunda entrada es idéntica, pero aplica sobre el grupo "webadmin".

El resultado es el siguiente:

root@fbsd11:/zdata/www/webapp # getfacl files/
# file: files/
# owner: www
# group: www
    group:webadmin:rwxp----------:-------:allow
     user:webadmin:rwxp----------:-------:allow
            owner@:rwxp--aARWcCos:-------:allow
            group@:rwxp--a-R-c--s:-------:allow
         everyone@:------a-R-c--s:-------:allow

Finalmente cabe destacar que, sobre cualquier filesystem, sólo es posible aplicar ACLs del formato con el cual fue montado. Si el sistema de archivos fue montado con soporte para ACLs NFSv4, no es posible agregar una ACL POSIX (y viceversa).

Referencias

man acl
man getfacl
man setfacl


Tal vez pueda interesarte


Compartí este artículo