unix - una - ¿Cuándo puedo o debo usar chmod g+s en un archivo o directorio?
dar permisos a un usuario en linux (8)
Establecer directorios g + s hace que todos los archivos nuevos creados en dicho directorio tengan su grupo establecido en el grupo del directorio.
Esto puede ser realmente útil para fines de colaboración si tiene Umask configurado para que los archivos tengan escritura de grupo de manera predeterminada.
Nota: Esta es la forma en que funciona en Linux, podría funcionar de manera completamente diferente en Solaris.
Recientemente, al implementar en un nuevo entorno (Solaris 9), uno de los pasos fue copiar un conjunto de archivos y directorios a su nueva ubicación y luego aplicar el bit de UID de grupo (usando "chmod -R g + s") a todos archivos en el árbol de directorios dando un modo de -rwxr-s --- a todo. El resultado fue que ninguno de nuestros scripts de shell se ejecutaría a menos que se abrieran y volvieran a guardarse individualmente. Debo agregar que antes habíamos configurado g + s en la carpeta principal de destino antes de copiar archivos; esto había establecido el modo inicial en todos los directorios nuevos en drwxr-s --- pero los archivos tenían un modo de -rwxr-x ---
Habiendo finalmente descubierto qué paso causó el problema, pudimos cortar ese paso y continuar.
Sin embargo, me gustaría entender qué significa el bit "s" cuando se aplica a directorios y archivos, con la esperanza de que esto explique por qué tuvimos el problema en primer lugar.
Para archivos ejecutables, esto significa que cuando se ejecuta el archivo, se ejecuta como el grupo que posee el archivo, no el grupo del usuario que ejecuta el archivo.
Esto es útil si desea que los usuarios puedan asumir los permisos de un grupo en particular solo para ejecutar un comando.
Sin embargo, también es un riesgo de seguridad ya que permite a los usuarios elevar sus permisos. Debe saber que los scripts con este conjunto de bits no harán nada que permita a los usuarios abusar de estos permisos adicionales.
Para los archivos, significa que el archivo se ejecuta como el grupo que posee el archivo, no el usuario del grupo que ejecuta el archivo. Se puede usar cuando se quiere permitir que el usuario haga algo para lo que no tiene el privilegio. Por ejemplo, para un DBMS que uso, es común permitir que todos hagan copias de seguridad de las bases de datos. Aunque solo el grupo ''dbms'' tiene acceso de lectura / escritura al archivo de la base de datos, el programa de copia de seguridad tiene g + s configurados para permitir que cualquiera acceda a la base de datos a través de él, pero no directamente.
Para los directorios, significa que los directorios recién creados serán propiedad del grupo que posee el directorio, no del usuario del grupo que creó el archivo. Un buen ejemplo para esto es el espacio web del proyecto sourceforge.net. Imagine 3 desarrolladores que mantienen el sitio web del proyecto. Ahora, si uno de ellos crea un archivo, solo él puede escribir en él (de forma predeterminada). Para evitar esto, todos los usuarios en el mismo proyecto también están en el mismo grupo, y el directorio tiene el privilegio rws para ese grupo, por lo que quien crea el archivo, se crea como legible y escribible para el grupo.
Más información sobre setuid y setgid aquí
Para un ejecutable, g+s
anula la identificación del grupo que el ejecutable ejecutará como (normalmente se hereda del padre).
$ cp `which id` id-test $ ./id-test uid=1001(user1) gid=1001(group1) groups=1001(group1),2001(project1) $ chgrp project1 id-test $ chmod g+s id-test $ ./id-test uid=1001(user1) gid=1001(group1) egid=2001(project1) groups=1001(group1),2001(project1)
(egid es "identificación de grupo efectiva" - generalmente lo mismo que gid, "identificación de grupo", pero aquí diferente).
Para un directorio, g+s
anula la identificación del grupo que tendrán los nuevos archivos y directorios (generalmente se hereda del creador).
$ mkdir project $ chgrp project1 file1 $ umask 0022 $ touch project/file1 $ ls -l project/file1 -rw-r--r-- 1 user1 group1 0 file1 $ chmod g+s project $ touch project/file2 $ ls -l project/file2 -rw-r--r-- 1 user1 project1 0 file2
Es posible que aún necesite jugar con umask
para obtener los mejores resultados; se requiere algo al menos tan permisivo como 0007
para la escritura compartida, y se requiere algo al menos tan permisivo como 0027
para la lectura compartida.
$ umask 0077 $ touch project/file3 $ ls -l project/file3 -rw------- 1 user1 project1 0 file3 $ umask 0027 $ touch project/file4 $ ls -l project/file4 -rw-r----- 1 user1 project1 0 file4 $ umask 0007 $ touch project1/file5 $ ls -l project1/file5 -rw-rw---- 1 user1 project1 0 file5
Cuando necesite usarlo: solucione el problema de propiedad del archivo SVN cuando usa svn + ssh. Alguien me dijo que solo sucede en BDB, pero también tuve ese problema en el almacenamiento de FSFS. Básicamente, cuando desee mantener la propiedad de los archivos secundarios dentro de un directorio coherente cuando haya otros usuarios escribiendo cosas en él, deberá usar u + s / g + s.
Para ampliar un poco su problema específico, ya se ha observado que los archivos ejecutables de sgid pueden causar problemas otorgando permisos a los usuarios que normalmente no tienen. Si bien este es un problema para cualquier ejecutable, crea una condición de carrera potencialmente explotable en el caso de los scripts (específicamente los "archivos que se ejecutan mediante un intérprete externo identificado por un #! Al principio del archivo") que puede ser utilizado para ejecutar cualquier código arbitrario con los permisos del guión.
Las derivadas de Unix han implementado varios esquemas a lo largo de los años para mitigar o eliminar esta vulnerabilidad, la mayoría de los cuales han incluido alguna forma de prohibir por completo la ejecución de guiones suid o sgid o requerir que pases unos pocos aros para habilitarlo (generalmente en una secuencia de comandos por script). Uno de estos esquemas sería la causa de su incapacidad para ejecutar los scripts luego de encender su bandera sgid.
Aquí hay una explicación muy útil de SGID (chmod g + s): http://www.linuxnix.com/sgid-set-sgid-linuxunix/
SGID (Establecer ID de grupo en la ejecución) es un tipo especial de permisos de archivo dados a un archivo / carpeta. Normalmente en Linux / Unix cuando se ejecuta un programa, hereda los permisos de acceso del usuario que ha iniciado sesión. SGID se define como otorgar permisos temporales a un usuario para ejecutar un programa / archivo con los permisos de los permisos del grupo de archivos para convertirse en miembro de ese grupo para ejecutar el archivo. En palabras simples, los usuarios obtendrán los permisos del Grupo de archivos al ejecutar una Carpeta / archivo / programa / comando.