Table of Contents

Administración de usuarios / permisos / grupos / acceso a ficheros en GNU/Linux

Las aplicaciones y afirmaciones de esta guía intentan aclarar el funcionamiento básico de administración de usuarios en GNU/Linux básica en relación al acceso a ficheros / directorios y también a procesos. No se tratará el uso de los comandos como “chmod” o “chown” porque se supone el lector los conoce.

Ficheros y Permisos

Tipos de fichero según prefijo.

Ejemplos de comandos find para buscar ficheros o directorios en base a sus permisos.

# Muetra ficheros con permisos  777
find / -type f -perm 0777
# Muestra todos los directorios sin permisos 775 o 664
find -type d -not -perm 775 -o -type f -not -perm 664
# Buscar ficheros o directorios sin los permisos estándar (775 para directorios y 644 ficheros).
find \! -perm 644 -type f -o \! -perm 755 -type d
# Muestra los ficheros o directorios que no tengan permiso de lectura para el grupo.
find . ! -perm -g+r
# Muestra ficheros con usuario root que tenga como permisos de usuario rwx sin importar el resto(7XX).
find / -user root -perm -u+rwx
# Muestra ficheros con el usuario propietario root que tenga unicamente permisos de usuario rwx (700)
find / -user root -perm -u+rwx

Como se pueden asignar permisos recursivamente pero diferenciando entre ficheros y directorio

chmod no tiene flexibilidad a la hora de asignar unos permisos diferentes entre usuarios y directorios al usarse de manera recursiva. Para ello, como vimos en los ejemplos anteriores, se puede hacer uso del comando “find”.

# Permisos 755 a todos los directorios de forma recursiva a partir del directorio /opt/usuario.
find /opt/usuario -type d -exec chmod 755 {} \;
# Permisos 755 a todos los ficheros de forma recursiva a partir del directorio /opt/usuario.
find /opt/usuario -type f -exec chmod 644 {} \;

Opción X mayúscula del comando chmod.

Una opción de chmod no documentada oficialmente es la opción “X” (mayúscula). El uso de “X” Permite otorgar el permiso de ejecución únicamente a directorios, sin que los archivos contenidos se vean afectados. Pero cuidado porque esto tiene un funcionamiento ampliamente ignorado por muchos usuarios y es que depende de los permisos que los ficheros tengan, estos pueden ser afectados también por dicha opción. Por ejemplo si los ficheros tienen algún tipo de permiso de ejecución, la opción X de chmod también les afectará.

Veamos un ejemplo práctico ejecutando el mismo comando chmod con la opción “X” en directorios que contienen ficheros con diferentes permisos.

#### Ejemplo 1 (Fichero sin permiso de ejecución).
 
ls -lt  directorio_1/
-rw-r--r-- 1 busi busi    0 jun  7 19:44 fichero
drwxr-xr-- 2 busi busi 4096 jun  7 19:43 directorio2
 
chmod -R o+X directorio_1/  ## Se le aplica a "otros" el permiso de ejecución usando X mayúscula.
 
ls -lt  directorio_1/
-rw-r--r-- 1 busi busi    0 jun  7 19:44 fichero
drwxr-xr-x 2 busi busi 4096 jun  7 19:43 directorio2  ## Solo los directorios se ven afectados.
 
##### Ejemplo 2 (Fichero con permiso de ejecución).
 
ls -lt  directorio_1/
-rwxr--r-- 1 busi busi    0 jun  7 19:44 fichero  ## Tiene ficheros de ejecución para el usuario.
drwxr-xr-- 2 busi busi 4096 jun  7 19:43 directorio2
 
chmod -R o+X directorio_1/  ## Se le aplica a "otros" el permiso de ejecución usando X mayúscula.
 
ls -lt  directorio_1/
-rwxr--r-x 1 busi busi    0 jun  7 19:44 fichero  ## Como vemos, esta vez el comportamiento fue diferente.
drwxr-xr-x 2 busi busi 4096 jun  7 19:43 directorio2

Tal vez sea este uno de los motivos por los que esta opción pase tan desapercibida y sea tan poco utilizada.

Propiedad del fichero / directorio según permisos especiales.

t / T Tiene el “sticky bit” activado / Tiene el “sticky bit” activado pero no tiene permisos de ejecución. Actualmente el llamado “sticky bit” en ficheros no tiene ninguna utilidad, se utiliza actualmente unicamente con directorios. Cuando es asignado a un directorio, significa que los elementos que hay en ese directorio sólo pueden ser renombrados o borrados por el propietario del mismo, el propietario del directorio o el usuario root, aunque el resto de usuarios tenga permisos de escritura. En directorios (ej. /tmp) permite que unicamente el propietario y root pueda borrar ficheros, aunque estos tengan permisos de escritura para otros. Al usar chmod el “sticky bit” se puede configurar mediante 1000 / 3000 / +t / -t.

s / S Tiene el SUID y/o SGID activado / Tiene el SUID y/o SGID activado pero carece de permiso de ejecución. El SUID y GID permiten ejecutar el fichero usando los mismos permisos que el propietario (SUID) / o el grupo principal (GID). Al usar chmod SUID usaría el valor 4000 y GID 2000 o bien +s / -s. Para establecer SUID + GID a ala vez 6000. Se debe tener cuidado con este tipo de permiso especial por motivos obvios de seguridad.

SGID sobre directorios. (Define el GID predeterminado para la creación de ficheros / directorios). Al utilizar un GID con esta opción sobre un directorio, los archivos y subdirectorios creados dentro heredarán el identificador del grupo, en lugar del ID del proceso que lo ha creado. Es una manera de establecer un ID de grupo por defecto. Así también forzamos que el ID de grupo de los ficheros y directorios de un determinado directorio sea siempre el mismo, independientemente del proceso que lo cree.

Para propósitos de colaboración entre diferentes usuarios del sistema es muy agradecido. Si se configura el SUID y se tiene una máscara de modo que los archivos tengan permiso de escritura sobre el grupo, diferentes usuarios (diferentes ID / pero mismo GID) podrían trabajar dentro del directorio con permisos de escritura. Cosa que de otra manera no es posible.

Por ejemplo es útil también aplicarlo en directorios con contenido web (/var/www/html) a la hora de evitar problemas con permisos cuando se trabaja directamente con root. Naturalmente esto tiene sentido mientras el usuario web (apache, nginx, nobody, www,..) no tenga también derechos configurados mediante el ID de usuario.

Buscar ficheros con SUID o GUID activado.

# Busca ficheros con root como propietario con SUID activado.
find / -user root -perm -4000
 
# Busca ficheros con root como propietario con SGID activado.
find / -group root -perm -2000
 
# Busca ficheros de cualquier usuario con SUID y SGID activos.
find / -perm -4000 -o -perm -2000
 
# Busca ficheros que no pertenecen a ningún usuario.
find / -nouser
 
# Busca ficheros que no pertenecen a ningún grupo.
find / -nogroup
 
# Busca enlaces simbólicos y muestra a donde apuntan.
find / -type l -ls

Tipos de Permisos.

Permisos predeterminados al crear ficheros y directorios.

Ficheros 644 (-rw-r--r--)
Directorios 655 (drwxr-xr-x)

Ese tipo de permisos es el resultado de aplicar la máscara 022 (predeterminado) a los valores máximos de permisos para ficheros (666) y directorios (777).

Ficheros = 666 - 022 = 644 = -rw-r--r--
Directorios = 777 - 022 = 755 = drwxr-xr-x

Conociendo dicho funcionamiento es muy simple adaptar la máscara a las necesidades. Veamos un ejemplo con máscara 017, la cual sería un poco especial de calcular y qué resultado se obtendría en los ficheros.

Ficheros = 666 - 017 = 660 = -rw-rw----
Directorios = 777 - 017 = 760 = drwxrw----

NOTA:Una máscara 077 otorgaría un valor 600 en ficheros y 700 para directorios.

Nociones básicas sobre permisos, propietario y grupo principal.

Este comportamiento se debe a que los permisos, los ficheros y todos los atributos (tamaño, dispositivo, timestamps,..) son parte del inodo (cada fichero / carpeta tiene su inodo correspondiente). Los directorios son también ficheros con alguna cualidad especial, estos contienen una tabla con una lista de parejas formadas por un número de inodo y nombre identificativo que permite acceder al archivo en cuestión. Recordemos que la estructura de directorios y su contenido es realmente una “ilusión” y los directorios no contienen realmente nada.

Cuando se borrar un fichero, internamente se está borrando esa pareja “inodo - nombre”. Por ese mismo motivo no se pueden borrar subdirectorios que tengan otros privilegios, ya que sobre esas tablas “inodo - nombre” no tenemos ese privilegio. Por eso no podemos tampoco borrar un fichero con permisos de escritura para nuestro usuario que esté contenido en un directorio donde no tenemos permiso de escritura.

Comandos para manejar los permisos, propietario y grupo principal.

Grupos secundarios con credenciales

Es posible establecer una contraseña a un grupo determinado y cada vez que un usuario quiera entrar en dicho grupo deberá ingresar la password. No sería el método recomendado debido a que se debe compartir la contraseña pero puede ser de utilidad.

gpasswd 
Modo de uso: gpasswd [opciones] GRUPO
 
Opciones:
  -a, --add USUARIO               Añade USUARIO al GRUPO
  -d, --delete USUARIO            Elimina USUARIO del GRUPO
  -h, --help                      Muestra este mensaje de ayuda y termina
  -Q, --root CHROOT_DIR           Directory to chroot into
  -r, --remove-password           Elimina la contraseña de GRUPO
  -R, --restrict                  Restringe el acceso a GRUPO a sus miembros
  -M, --members USUARIO,...       Establece la lista de miembros de GRUPO
  -A, --administrators ADMIN,...  Establece la lista de administradores de GRUPO
 
NOTA: Excepto las opciones -A y -M, las opciones no se pueden combinar.
 
Ejemplos:
 
gpasswd grupo   # Modifica / Establece una contraseña para el grupo. Cualquier usuario puede entrar si conoce la password).
gpasswd -a usuario grupo  # Agrega usuarios al grupo. Solo los usuario del grupo podrán usar la contraseña.
gpasswd -M usuario1,usuario2,usuario3 grupo   # Agrega múltiples usuarios la grupo.
gpasswd -d usuario grupo                      # Elimina al usuario del grupo.
gpasswd -A ususario1,ususairo2 grupo          # Pone como administradores del grupo de usuario1 y usuario2.

Entrar dentro de un grupo conociendo la password.

newgrp grupo

ACLs en GNU/Linux

Leer: https://www.busindre.com/acl_en_gnu_linux

Chattr: Atributos de ficheros / carpetas

Chattr opera a nivel de sistema de ficheros y permite cambiar atributos de ficheros / carpeta. Se usa para impedir aun teniendo los permisos correctos, borrados y modificaciones de ficheros. El usuario root sería el único capaz de modificar los ficheros o directorios pero antes necesita necesita cambiar dicho atributo. Se utiliza como una especie de seguro para determinadas carpetas o ficheros.

En el mejor de los casos dificultaría también las acciones en el sistema de archivos por parte de un posible intruso que haya logrado suficientes privilegios en el sistema.

Sintaxis: chattr [-RV] +-=[AacDdijsSu] [-v versión] archivos

Ejemplos.

# Carpeta o fichero inmutable, no se pueda borrar, renombrar, ni escribir en ella mientras no se cambie el atributo (root). Las carpetas y archivos que contenga heredan automáticamente todos los atributos pero sólo en un primer nivel, dentro de esas subcarpetas se podría escribir y borrar con normalidad.
chattr +i carpeta
chattr -i carpeta # Elimina el atributo inmutable.

# Impide borrar y renombrar una carpeta o fichero, pero permite añadir archivos y carpetas (que heredan sus atributos en un primer nivel).
chattr +a carpeta
chattr -a carpeta # Elimina el atributo.

lsattr fichero    # Lista atributos del fichero.
su--ia-Ac-----e---- fichero

Opciones.

Operadores.

Atributos.

Fuente: http://www.alcancelibre.org/staticpages/index.php/como-chattr

sudo

Con sudo también es posible granular permisos en sistemas GNU/Linux. No se verá en esta guía.

Enlaces simbólicos / duros

Enlaces simbólicos: https://es.wikipedia.org/wiki/Enlace_simb%C3%B3lico

Propiedades de los enlaces simbólicos.

Se pueden crear enlaces simbólicos entre carpetas. Los cambios introducidos en el archivo original o en el enlace simbólico afectaran a los dos por igual. Si se borra el archivo original se borra definitivamente, pero el enlace quedará huérfano / roto. Si se borra el enlace, el fichero al que apunta sigue disponible. Si se cambia de ubicación el fichero enlazado, el enlace quedará roto. Los enlaces simbólicos en GNU/Linux siempre tienen todos los permisos (lrwxrwxrwx) y no pueden modificarse. Cualquier modificación de permisos realizada sobre un enlaces simbólico repercutirá únicamente sobre el fichero / directorio enlazado, en sistemas BSD el comportamiento es diferente y se permite establecer permisos personalizados a los enlaces simbólicos. Sí se puede modificar el propietario del enlace simbólico, para ello se debe usar “chmod -h”, en caso contrario la ejecución de chmod repercutirá sobre el archivo / directorio enlazado.

Utilidad de los enlaces simbólicos.

Crear atajos / rutas alternativas. Extiende el sistemas de archivos permitiendo enlazar con carpetas de otros puntos de montaje y tener el fichero accesible desde varias ubicaciones.

Para crear enlaces duros recursivos de todo un directorio se puede usar el comando cp.

cp -rl directorio directorio2

Enlaces duros: https://es.wikipedia.org/wiki/Enlace_duro

Propiedades de los enlaces duros.

Usos de los enlaces duros.

Para crear enlaces duros recursivos de todo un directorio se puede usar el comando cp.

cp -rl directorio directorio2

Nociones básicas sobre UIDs en procesos

RUID es el ID de usuario real y casi nunca cambia. Todos los procesos que inicien desde una shell heredarán su RUID. Un proceso sin privilegios de root puede enviar señales a otro proceso si este tiene el mismo ruid o euid. Por eso procesos hijos pueden comunicarse con su proceso padre.

EUID es el ID efectivo de usuario, es el conocido “UID”. Este normalmente cambia para los procesos que el usuario ejecuta. El UID efectivo de un proceso se usa para la mayoría de las verificaciones de acceso. También se usa como propietario de los archivos creados por el proceso.

SUID (setuid): Como ya comentamos antes, cuando un binario tiene seuid activado, este usa su propio EUID al ser ejecutado para acceder a los archivos del sistema. Se utiliza para permitir que usuarios no privilegiados puedan acceder a tareas que requieren de root. Un ejemplo es el comando passwd para modificar la contraseña, /etc/shadow no está accesible desde usuarios no privilegiados. Los ficheros creados no tendrán el EUID del fichero si no el RUID del fichero que ejecutó el binario con setuid activo.

ps -eo euid,euser,ruid,ruser,suid,suser,fuid,fuser,luid,ouid,pid,ppid,%mem,%cpu,cmd | grep -i passwd

EUID EUSER     RUID RUSER     SUID SUSER     FUID FUSER     LUID OWNER   PID  PPID %MEM %CPU CMD
   0 root      1000 user         0 root         0 root         - 1000   4415  4262  0.0  0.0 passwd

FUID, id de usuario del sistema de archivos. Linux también tiene un ID de usuario del sistema de archivos (fsuid) que se usa explícitamente para el control de acceso al sistema de archivos. Coincide con el euid a menos que se establezca explícitamente lo contrario. Puede ser la ID de root únicamente si ruid, suid o euid es root. Cada vez que se cambia el euid, el cambio se propaga al fsuid.

La intención de fsuid es permitir que los programas (por ejemplo, el servidor NFS) se limiten a los derechos del sistema de archivos de un uid para no implementar otro sistema de acceso propio. Desde kernel 2.0, la existencia de fsuid ya no es necesaria porque Linux se adhiere a las reglas SUSv3 para enviar señales, pero fsuid permanece por razones de compatibilidad.

GID utilizado por procesos en GNU/Linux

Los procesos tienen por norma el mismo UID (EUID) / GID (EGID) que el usuario que los ejecuta. Pero eso no tiene por qué ser siempre así, veamos un ejemplo donde el usuario apache tiene en /etc/passwd definido el GID 510.

grep -i apache /etc/group
apache:x:48:logstash
 
grep -i apache /etc/passwd
apache:x:48:510:Apache:/var/www:/bin/bash
 
############# El usuario apache usado para el servidor web (usa el GID 48).
 
service apache start
 
# No hay ni rastro del GID 512.
ps ax o user,pid,comm,group,gid  | grep -i apache
apache   11580 httpd           apache      48
apache   11581 httpd           apache      48
apache   11582 httpd           apache      48
apache   11583 httpd           apache      48
 
############# El usuario apache desde terminal, ahora sí podemos ver el GID 512 (wwwrun).
 
su - apache -s /bin/bash
 
id
uid=48(apache) gid=510(wwwrun) groups=510(wwwrun),496(logstash)
 
ps ax o user,pid,comm,group,gid  | grep -i "apache.*bash"
apache   32060 bash            wwwrun     510

Forzar uso de un gid determinado al arrancar un proceso con el comando “sg”.

sg www-data -c "sleep 3333"

Enlace de interés.