Cómo configurar las ACL predeterminadas de Linux de manera diferente para directorios y archivos

9

Tengo algunas ACL definidas en un directorio así:

# owner: root
# group: root
user::rwx
group::r--
mask::r-x
other::r--
default:user::r--
default:group::r--
default:mask::r-x
default:other::r--

Me gustaría que cualquier archivo nuevo creado en esa carpeta sea u: apache: r-- y que los directorios nuevos sean u: apache: rx. ¿Cómo especifico esa intención usando ACL?

He probado el -dm u:apache:rXy no parece hacer nada diferente en comparación con solorx

overt htdocs # getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:apache:r--
group::r--
mask::r-x
other::r--
default:user::r--
default:user:apache:r--
default:group::r--
default:mask::r--
default:other::r--

overt htdocs # setfacl -dm u:apache:rx .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

overt htdocs # rm blah.txt
overt htdocs # setfacl -dm u:apache:rX .
overt htdocs # touch blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r-x                 #effective:r--
group::r--
mask::r--
other::r--

El permiso X mayúscula solo parece ser útil para configurar los permisos actuales, no para configurar los permisos predeterminados:

overt htdocs # setfacl -x u:apache blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::r--

overt htdocs # setfacl -m u:apache:rX blah.txt
overt htdocs # getfacl blah.txt
# file: blah.txt
# owner: root
# group: root
user::r--
user:apache:r--
group::r--
mask::r--
other::r--
joshperry
fuente

Respuestas:

6

Bueno, pero tu ejemplo hace exactamente lo que quieres;)

Mira el segundo:

htdocs abierto # setfacl -dm u: apache: rx.
htdocs abiertos # touch blah.txt
htdocs abiertos # getfacl blah.txt
# file: blah.txt
# propietario: root
# grupo: raíz
usuario :: r--
usuario: apache: rx #eficaz: r--
grupo :: r--
máscara :: r--
otro :: r--

La línea importante es:

user:apache:r-x #effective:r--

Aunque acl está configurado en rx, efectivamente es r-- para archivos. Es por la máscara.

Y la máscara siempre será solo rw para archivos si el usuario la creó con los permisos rw para usuario. (No estoy 100% seguro, pero la máscara no puede ser menos restrictiva que los permisos básicos).

Así que efectivamente obtienes r-- para archivos y rx para directorios.
Debido a que los directorios creados tendrán un usuario: rx -> la máscara será rx -> el permiso efectivo será rx.
Para los archivos: tendrán r-- por lo que la máscara será r-- y los permisos efectivos para las ACL también serán r--. (Si crea un archivo y le otorga permisos de usuario :: rx, la máscara se modificará y los usuarios de acl también obtendrán la x)

seda
fuente
Totalmente perdido el #effectivetexto! Gracias por la explicación de cómo las máscaras efectúan permisos efectivos.
joshperry
2

Desafortunadamente, simplemente no hay forma de hacer esto con las ACL de Linux. Es cierto que la máscara parecerá hacer exactamente lo que desea, en lo que respecta a los permisos efectivos. Pero la próxima vez que realice una operación que recalcule la máscara de derechos, bam , todos sus archivos serán ejecutables.

También podría resignarse a esperar que todos los archivos en una ACL sean ejecutables. Eso es realmente solo una conveniencia más que una característica de seguridad, y siempre que no coloque esas carpetas en su $ PATH, no debería ser un problema. Si todavía le molesta, la única opción es colocar sus carpetas controladas por ACL en un sistema de archivos montado sin opción de ejecución.

Rashkae
fuente
1

-d (o --default) se usa para establecer los valores predeterminados en el directorio para que las cosas creadas en él hereden los permisos (como parece estar haciendo).

Aquí hay un resumen rápido. http://www.vanemery.com/Linux/ACL/linux-acl.html#default

No es posible tener archivos con un valor predeterminado y los directorios tienen un valor predeterminado diferente.

Podrías ejecutar un script fuera de cron que haga un setfacl en todos los directorios cada minuto, aunque eso es menos que ideal para una solución.

buscar / ruta / a / top / dir-tipo d -exec setfacl -dm u: apache: rx {} \;

o

find / path / to / top / dir -type d | xargs setfacl -dm u: apache: rx

aspitzer
fuente
1

Esta publicación sobre ACL y máscaras realmente me ayudó a comprender cómo hacer lo que quería y por qué.

La parte que faltaba de mi comprensión era que, al crear un archivo, el núcleo utiliza un conjunto de permisos predeterminado de 0666 y para los nuevos directorios 0777. Por lo tanto, los directorios predeterminados tendrán el conjunto de bits de ejecución (transversal).

La máscara ACL es básicamente una forma de establecer un nivel umaskde directorio / archivo / usuario.

joshperry
fuente