Obtener nuevos archivos para heredar permisos de grupo en Linux

87

Tengo un problema con los permisos en un servidor Linux. Estoy acostumbrado a BSD. Cuando un directorio es propiedad de un grupo, el usuario que lo posee no pertenece a www-data, los archivos creados en él serán propiedad de ese grupo. Esto es importante porque quiero que el servidor web pueda leer los archivos (que no ejecutaré como root), pero para que el usuario pueda poner nuevos archivos en el directorio. No puedo poner a los usuarios en www-data porque luego pueden leer los sitios web de todos los demás usuarios.

Quiero que el servidor web lea todos los sitios web, quiero que los usuarios puedan cambiar los suyos.

Los permisos se establecen así en las carpetas en este momento ...

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

Es un comportamiento estándar en BSD que los permisos funcionen de esta manera. ¿Cómo consigo que Linux haga esto?

John Tate
fuente
2
¿Puedes usar ACL?
slm

Respuestas:

128

Parece que está describiendo la funcionalidad de bit setgid donde, cuando un directorio que lo tiene configurado, forzará a los archivos nuevos creados dentro de él a tener su grupo configurado en el mismo grupo que está configurado en el directorio padre.

Ejemplo

$ whoami
saml

$ groups
saml wheel wireshark

configurar un directorio con permisos + propiedades

$ sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ sudo chown saml.apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml apache 4096 Feb 17 20:10 somedir/

toca un archivo como saml en este directorio

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml apache 0 Feb 17 20:11 somedir/afile

Esto le dará aproximadamente lo que parece que desea. Sin embargo, si realmente desea exactamente lo que ha descrito, creo que tendrá que recurrir a la funcionalidad de listas de control de acceso para obtener eso (ACL).

ACL

Si desea obtener un poco más de control sobre los permisos en los archivos que se crean en el directorio, somedirpuede agregar la siguiente regla de ACL para establecer los permisos predeterminados de esta manera.

antes de

$ ll -d somedir
drwxr-s---. 2 saml apache 4096 Feb 17 20:46 somedir

establecer permisos

$ sudo setfacl -Rdm g:apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml apache 4096 Feb 17 20:46 somedir/

Observe que +al final, eso significa que este directorio tiene ACL aplicadas.

$ getfacl somedir
# file: somedir
# owner: saml
# group: apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:apache:r-x
default:mask::r-x
default:other::---

después

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: apache
user::rw-
group::r-x              #effective:r--
group:apache:r-x        #effective:r--
mask::r--
other::---

Observe con los permisos predeterminados ( setfacl -Rdm) configurados para que los permisos sean ( r-x) por defecto ( g:apache:rx). Esto obliga a que los archivos nuevos solo tengan rhabilitado su bit.

slm
fuente
Eso parece proporcionar la funcionalidad que quería, gracias.
John Tate
Esto parece resolver mi problema similar también. Sin embargo, no entiendo bien la última oración: "Esto obliga a los archivos nuevos a que solo tengan habilitado su bit r". ¿Por qué el permiso x no está habilitado? ¿Hay alguna manera de habilitarlo por defecto?
yaobin
1
@yaobin Creo que es una cuestión de seguridad, realmente no quieres tener un archivo ejecutable por defecto
cdarken
Esto no funciona con unzip?
datasn.io
@ datasn.io: mira la página de manual de unzip. Específicamente el -Xinterruptor.
slm
37

TL: DR; para hacer que los nuevos archivos hereden el grupo de la carpeta del contenedor, haga lo siguiente:

$ chmod g+s somefolder

Nota: está implícito en la respuesta aceptada, esto es solo un fragmento.

alo Malbarez
fuente
3
setgid significa que los nuevos archivos y carpetas tendrán el grupo correcto, pero recuerde que si mueve los archivos al árbol, no tendrán configurado el propietario correcto. El enfoque ACL hace frente a eso (en general).
Chris Morgan
@ChrisMorgan ¿cómo se las arregla? Las soluciones de la respuesta aceptada no hicieron nada para los archivos movidos en mi caso.
Dan M.
@DanM .: con los modos de archivo, establece permisos que no se heredan; pero con las ACL, establece permisos que se heredan (aunque los hijos pueden especificar sus propias ACL que anulan eso), que se verifican en tiempo de ejecución.
Chris Morgan
@ChrisMorgan sí. ¿Cómo haces eso? La solución que usa la respuesta aceptada del formulario ACL no funciona.
Dan M.
10

Como complemento a la respuesta de slm, tenga en cuenta que, en un sistema de archivos ext2 / 3/4, puede replicar el comportamiento BSD que describe utilizando la bsdgroupsopción de montaje en la partición. Desde la mount(1)página del manual:

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.
user60039
fuente