¿Por qué FreeBSD perdió la máscara w pero Debian la retuvo?

10

Estoy tratando de entender la diferencia de comportamiento entre las ACL de FreeBSD y las ACL de Linux. En particular, el mecanismo de herencia para las ACL predeterminadas.

Usé lo siguiente en Debian 9.6 y FreeBSD 12:

$ cat test_acl.sh
#!/bin/sh

set -xe

mkdir storage
setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage

touch outside
cd storage
touch inside
cd ..

ls -ld outside storage storage/inside

getfacl -d storage
getfacl storage
getfacl outside
getfacl storage/inside

umask

Obtengo el siguiente resultado de Debian 9.6:

$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r--  1 aaa aaa    0 Dec 28 11:16 outside
drwxr-xr-x+ 2 aaa aaa 4096 Dec 28 11:16 storage
-rw-rw----+ 1 aaa aaa    0 Dec 28 11:16 storage/inside

+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---

+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::rwx
default:mask::rwx
default:other::---

+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--

+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx          #effective:rw-
mask::rw-
other::---

+ umask
0022

Tenga en cuenta que los archivos outsidey insidetienen permisos diferentes. En particular, el outsidearchivo tiene -rw-r--r--, que es el predeterminado para este usuario y el insidearchivo tiene -rw-rw----, respetando las ACL predeterminadas que asigné al storagedirectorio.

La salida del mismo script en FreeBSD 12:

$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ ls -ld outside storage storage/inside
-rw-r--r--  1 aaa  aaa    0 Dec 28 03:16 outside
drwxr-xr-x  2 aaa  aaa  512 Dec 28 03:16 storage
-rw-r-----+ 1 aaa  aaa    0 Dec 28 03:16 storage/inside

+ getfacl -d storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::rwx
mask::rwx
other::---

+ getfacl storage
# file: storage
# owner: aaa
# group: aaa
user::rwx
group::r-x
other::r-x

+ getfacl outside
# file: outside
# owner: aaa
# group: aaa
user::rw-
group::r--
other::r--

+ getfacl storage/inside
# file: storage/inside
# owner: aaa
# group: aaa
user::rw-
group::rwx      # effective: r--
mask::r--
other::---

+ umask
0022

(Tenga en cuenta que Debian getfacltambién mostrará las ACL predeterminadas incluso cuando no se utiliza -ddonde no lo hace FreeBSD, pero no creo que las ACL reales storagesean diferentes).

Aquí, los archivos outsidey insidetambién tienen diferentes permisos, pero el insidearchivo no tiene el permiso de escritura grupal que tiene la versión de Debian, probablemente porque la máscara en Debian retuvo wmientras que la máscara en FreeBSD perdió el w.

¿Por qué FreeBSD perdió la wmáscara pero Debian la retuvo?

Roxy
fuente
1
¿Qué getfacl storagemuestra en ambos sistemas?
Mikel
¿Funciona de manera idéntica si no utiliza bit de grupo fijo ( g+s)?
sebasth
@Mikel He actualizado el contenido original de la pregunta para mostrar la getfaclinformación.
Roxy
@sebasth He actualizado la pregunta original para eliminar el bit setgid. Es irrelevante
Roxy
Después de configurar ACL en storage, ls debería mostrar+ , de manera similar, esperaría que la getfaclsalida sea similar a la que obtuvo en el sistema Debian. ¿ setfaclDevolvió el código de salida de éxito?
sebasth

Respuestas:

1

En resumen, diría (suponga) que usan umask de manera diferente.

0022 es exactamente grupo-otro sin establecer W. Puede cambiar umask para eliminar la prohibición de escritura y verificar el resultado.

Citando Solaris, también conocido como SunOS manual (y comentarios también) ya que parece estar bastante relacionado: "... umask (1) no se aplicará si el directorio contiene entradas de ACL predeterminadas ..."

poige
fuente
1
¿Uno está bien y el otro está mal? ¿Hay un estándar al que se supone que esto se adhiera?
Roxy
No soy un experto en esto, pero (irónicamente) el hombre WEB de FreeBSD tiene entrada para la implementación "canónica" (posiblemente) (SunOS) que dice explícitamente que umask no debe contarse: freebsd.org/cgi/man.cgi?query= setfacl & manpath = SunOS + 5.10
poige
"... umask (1) no se aplicará si el directorio contiene entradas de ACL predeterminadas ..."
poige
La página de manual de FreeBSD no se menciona umask, por lo que parece ser un comportamiento poco definido. ¿Se supone que la implementación de ACL de FreeBSD funciona igual que SunOS?
Roxy
Obviamente, no (menciona) porque de lo contrario se vería claramente una contradicción entre las cosas declaradas y hechas.
Poige