===== 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**.
* **-** Fichero regular.
* **d** Directorio.
* **b** Dispositivos orientados a bloques.
* **c** Dispositivos orientados a caracteres.
* **p** Pila.
* **l** Enlace simbólico.
* **s** Socket.
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**.
* **r** Lectura (4)
* **w** Escritura (2)
* **x** Ejecución (1)
**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**.
* Cualquier intento de acceder a los datos de un archivo, debe tener permiso de lectura. Cualquier intento de modificar los datos de un archivo, debe tener permiso de escritura. Cualquier intento de ejecutar un archivo (un programa o una secuencia de comandos) requiere el permiso de ejecución.
* Un intento de listar los archivos en un directorio requiere permiso de lectura para el directorio, pero no en los archivos dentro.
* Añadir un archivo a un directorio, borrar un archivo que contenga o renombrarlo, requiere de permiso de escritura para el directorio, pero los ficheros que contiene no necesitan de permiso de escritura para ser eliminados o renombrados. Un fichero con propietario y permisos únicamente para el usuario "X" puede ser borrado por el usuario "Y" mientras que el directorio donde se encuentre el fichero sea propiedad de "Y" y tenga permiso de escritura sobre el mismo. Lo que NO se podrá hacer es modificar su contenido pese a que pueda eliminar o renombrar el fichero. En el caso de directorios, si están vacíos, se podrán borrar, pero si hay subcarpetas o ficheros dentro, se necesitará tener permisos de escritura sobre el padre de las mismos.
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.
* Se necesita permiso de ejecución en directorios para poder ser accedidos mediante "cd". Este permiso de ejecución a veces es nombrado como permiso de búsqueda, ya que es necesario para conocer los números de inodo de los ficheros que contiene.
**Comandos para manejar los permisos, propietario y grupo principal**.
* chmod Establece privilegios sobre el fichero o directorio: Lectura r Escritura w Ejecución x.
* umask Establece los permisos predeterminados de ficheros y directorios al crearlos.
* chown Define el usuario propietario y el 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**.
* **-R** Cambia de manera descendente los atributos de directorios y sus contenidos. Ignora enlaces simbólicos.
* **-V** Salida de charttr más descriptiva, mostrando además la versión del programa.
* **-v** Ver el número de versión del programa.
**Operadores**.
* **+** Hace que se añadan los atributos especificados a los atributos existentes de un archivo.
* **-** Hace que se eliminen los atributos especificados de los atributos existentes de un archivo
* **=** Hace que se reemplacen los atributos existentes por los atributos especificados.
**Atributos**.
* **A** Establece que la fecha del último acceso (atime) no se modifica.
* **a** Establece que el archivo sólo se puede abrir en modo de adjuntar para escritura.
* **c** Establece que el archivo es comprimido automáticamente en el disco por el núcleo del sistema operativo. Al realizar lectura de este archivo, se descomprimen los datos. La escritura de dicho archivo comprime los datos antes de almacenarlos en el disco.
* **D** Cuando se trata de un directorio, los datos se escriben de forma sincrónica en el disco. Es decir, los datos se escriben inmediatamente en lugar de esperar la operación correspondiente del sistema operativo. Es equivalente a la opción "dirsync" de mount, pero aplicada a un subconjunto de archivos.
* **d** Establece que el archivo no sea candidato para respaldo al utilizar la herramienta dump.
* **e** Indica que el archivo o directorio utiliza extensiones (extents) para la cartografía de bloques en la unidad de almacenamiento, particularmente de sistemas de archivos Ext4. Cabe señalar que chattr es incapaz de eliminar este atributo.
* **i** Establece que el archivo será inmutable. Es decir, se impide que el archivo sea eliminado, renombrado, que se pueden apuntar enlaces simbólicos hacia éste o escribir datos en el archivo.
* **j** En los sistemas de archivos ext3 y ext4, cuando se montan con las opciones "data=ordered" o "data=writeback", se establece que el archivo será escrito en el registro por diario (Journal). Si el sistema de archivos se monta con la opción "data=journal" (opción predeterminada), todo el sistema de archivos se escribe en el registro por diario y por lo tanto el atributo no tiene efecto.
* **s** Cuando un archivo tiene este atributo, los bloques utilizados en el disco duro son escritos con ceros, de modo que los datos no se puedan recuperar por medio alguno. Es la forma más segura de eliminar datos.
* **S** Cuando el archivo tiene este atributo, sus cambios son escritos de forma sincrónica en el disco duro. Es decir, los datos se escriben inmediatamente en lugar de esperar la operación correspondiente del sistema operativo. Es equivalente a la opción sync de mount.
* **u** Cuando un archivo con este atributo es eliminado, sus contenidos son guardados permitiendo recuperar el archivo con herramientas para tal fin.
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**.
* Los permisos, propietario y grupo del enlace duro serán los mismos que el del archivo original.
* Si se modifica la ubicación el archivo original el enlace duro no se rompe.
* No se pueden crear enlaces duros de carpetas ni a ficheros entre distintos puntos de montaje.
* Los enlaces duros ocupan menos tamaño en el disco duro que los enlaces simbólicos.
* El acceso al contenido a través de un enlace duro es más rápido que en los enlaces simbólico.
**Usos de los enlaces duros**.
* Evita la necesidad de copiar ficheros de gran tamaño si se quiere tener en varias ubicaciones.
* Permite tener un archivo en múltiples ubicaciones. Útil hacer diferentes clasificaciones de ficheros, por ejemplo películas, eliminando la necesidad de copiar el mismo fichero.
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**.
* SUID en scripts: [[scripts_con_suid]]
* Configurar permisos predeterminados al crear nuevos ficheros / Directorios en Linux: [[acl_en_gnu_linux| ACLs en GNU/Linux]]