Usuarios, grupos y permisos de archivos en Linux

LinuxBeginner
Practicar Ahora

Introducción

Linux es un sistema operativo multiusuario. Cada proceso y archivo pertenece a un usuario, y cada usuario tiene un grupo principal y, opcionalmente, grupos suplementarios. En conjunto, la identidad, el propietario y los bits de permisos determinan quién puede leer, modificar, ejecutar o acceder a un recurso.

En este laboratorio, creará un pequeño entorno de equipo mediante cuentas de práctica independientes. Creará un usuario, administrará la pertenencia a grupos, protegerá un archivo, inspeccionará el bloqueo de una cuenta, controlará los permisos predeterminados con umask y configurará directorios con sticky bit y setgid. Todo el trabajo se mantendrá dentro del entorno del laboratorio y no modificará la ruta de inicio de sesión predeterminada de labex.

Inspeccionar identidades y crear un usuario de práctica

En este paso, inspeccionará su identidad actual y creará una cuenta independiente para practicar con permisos. Linux representa a un usuario mediante un nombre de usuario y un ID de usuario numérico (UID). También registra un ID de grupo principal (GID) y cualquier grupo suplementario.

Primero, confirme la identidad del shell actual:

whoami

La salida debe ser labex. Ahora muestre el UID, el grupo principal y los grupos suplementarios asociados con esta cuenta:

id

Los ID numéricos exactos pueden variar, pero la salida los identifica mediante las etiquetas uid, gid y groups.

Crear una cuenta modifica archivos del sistema, por lo que requiere privilegios administrativos. sudo significa “superuser do”: ejecuta el comando siguiente con privilegios elevados después de comprobar que la cuenta actual tiene autorización para hacerlo. Úselo únicamente con el comando que necesita administración y lea el comando completo antes de pulsar Enter.

El comando useradd siguiente utiliza tres opciones:

  • -m crea el directorio personal.
  • -U crea un grupo principal con el mismo nombre.
  • -s /bin/bash selecciona Bash como intérprete de comandos de inicio de sesión de la cuenta.

Cree un usuario de práctica llamado jack:

sudo useradd -m -U -s /bin/bash jack

Inspeccione la cuenta nueva y su directorio personal:

id jack
ls -ld /home/jack

La salida de id debe mostrar jack como usuario y como grupo principal. El listado del directorio debe mostrar que /home/jack existe y pertenece a jack:jack.

Administrar grupos suplementarios

En este paso, creará un grupo de equipo y añadirá usuarios a grupos suplementarios. El grupo principal de un usuario normalmente se convierte en el propietario de grupo de los archivos nuevos. Los grupos suplementarios conceden acceso a otros recursos compartidos.

Cree un grupo llamado developers:

sudo groupadd developers

Las opciones usermod -aG significan “añadir a los grupos suplementarios”. La opción -a es importante: sin ella, -G puede reemplazar las pertenencias suplementarias existentes. Añada jack a developers y sudo:

sudo usermod -aG developers,sudo jack

Registre también a labex como miembro de developers. El shell actual no adquirirá inmediatamente la nueva identidad de grupo; la actualizará de forma segura en el último paso.

sudo usermod -aG developers labex

Inspeccione ambas cuentas:

groups jack
groups labex

La primera salida debe incluir jack, developers y sudo. La segunda debe incluir developers. La pertenencia a sudo permite que una cuenta autenticada solicite privilegios elevados; concédala únicamente a administradores de confianza.

Controlar el propietario y los permisos de un archivo

En este paso, protegerá un informe del equipo con un propietario, un grupo y un modo de permisos específicos. Un listado largo muestra primero el tipo de archivo, seguido de tres grupos de permisos para el propietario, el grupo y los demás usuarios.

Cree un informe vacío en el directorio del proyecto:

touch /home/labex/project/secure-report.txt

Cambie ambos propietarios mediante el formato user:group de chown:

sudo chown jack:developers /home/labex/project/secure-report.txt

Establezca el modo 640:

sudo chmod 640 /home/labex/project/secure-report.txt

En la notación numérica, leer es 4, escribir es 2 y ejecutar es 1. Por lo tanto:

  • El propietario 6 significa lectura y escritura (4 + 2).
  • El grupo 4 significa solo lectura.
  • Los demás usuarios 0 no tienen acceso.

Inspeccione el resultado:

ls -l /home/labex/project/secure-report.txt
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/secure-report.txt

Los campos estables de stat deben indicar owner=jack group=developers mode=640.

Inspeccionar y cambiar el bloqueo de una cuenta

En este paso, practicará el bloqueo y desbloqueo temporal de una cuenta independiente. Linux almacena los hashes de las contraseñas y el estado de las cuentas en /etc/shadow. Un signo ! al principio del campo de contraseña indica que la autenticación mediante contraseña está bloqueada.

La configuración creó una cuenta de práctica llamada contractor. Muestre únicamente el primer carácter de su campo de contraseña para no imprimir nunca el hash. Lea la tubería de izquierda a derecha: getent shadow contractor obtiene el registro shadow de la cuenta; el primer cut usa : como delimitador y selecciona el campo 2; el segundo cut conserva el carácter 1 de ese campo:

sudo getent shadow contractor | cut -d: -f2 | cut -c1

El carácter inicial normalmente debe ser $, que marca el comienzo de un formato moderno de hash de contraseña. Bloquee la cuenta con usermod -L:

sudo usermod -L contractor

Inspeccione de nuevo el primer carácter:

sudo getent shadow contractor | cut -d: -f2 | cut -c1

Ahora debe ser !. Desbloquee la cuenta con usermod -U y confirme que desaparece el signo !:

sudo usermod -U contractor
sudo getent shadow contractor | cut -d: -f2 | cut -c1

En este escenario, el contratista ya no forma parte del equipo. Bloquee la cuenta una última vez, conservando sus archivos:

sudo usermod -L contractor

Bloquear la autenticación mediante contraseña no elimina la cuenta, no borra su directorio personal ni necesariamente termina las sesiones existentes. Es diferente de eliminar un usuario y resulta útil cuando es necesario conservar sus archivos para revisarlos.

Controlar los permisos predeterminados con Umask

En este paso, utilizará umask para controlar los bits de permisos que se eliminan cuando el shell crea archivos y directorios nuevos. Normalmente, los programas parten de un modo máximo de 666 para archivos normales y 777 para directorios. Una máscara 027 elimina el permiso de escritura del grupo y todos los permisos de los demás usuarios.

Cree un espacio de trabajo para el experimento:

mkdir -p /home/labex/project/umask-demo

Guarde la máscara actual para restaurarla más adelante. La sintaxis $(command) se denomina sustitución de comandos: el shell ejecuta el comando que está dentro de los paréntesis y reemplaza toda la expresión por su salida. La asignación guarda ese resultado en original_umask; como ocurre con las demás asignaciones del shell, no debe haber espacios alrededor de =.

original_umask=$(umask)

Aplique la máscara 027 y cree un archivo y un directorio:

umask 027
touch /home/labex/project/umask-demo/private-note.txt
mkdir /home/labex/project/umask-demo/private-dir

Inspeccione los modos numéricos resultantes:

stat -c '%a %n' /home/labex/project/umask-demo/private-note.txt /home/labex/project/umask-demo/private-dir

El archivo debe tener el modo 640, mientras que el directorio debe tener el modo 750. Los archivos no reciben bits de ejecución automáticamente. Restaure la máscara original del shell:

umask "$original_umask"

Cambiar umask afecta a los objetos creados posteriormente; no modifica los permisos de los objetos existentes.

Proteger un directorio compartido con el Sticky Bit

En este paso, configurará un buzón público donde todos puedan crear archivos, pero ningún usuario pueda eliminar archivos cuyo propietario sea otra persona. El modo ordinario 777 concede a todos los usuarios acceso completo al directorio. Añadir el sticky bit cambia las reglas de eliminación dentro del directorio.

Cree el directorio compartido y establezca el modo 1777. El 1 inicial activa el sticky bit.

mkdir /tmp/shared-dropbox
chmod 1777 /tmp/shared-dropbox

Use sudo -u para crear un archivo con cada cuenta de práctica:

sudo -u jack touch /tmp/shared-dropbox/jack-note.txt
sudo -u contractor touch /tmp/shared-dropbox/contractor-note.txt

Ahora intente que jack elimine el archivo del contratista:

sudo -u jack rm /tmp/shared-dropbox/contractor-note.txt

Este fallo es intencionado. Debe aparecer Operation not permitted y el archivo del contratista debe permanecer. Inspeccione el directorio:

ls -ld /tmp/shared-dropbox

Los permisos deben terminar en una t minúscula, por ejemplo drwxrwxrwt. La t minúscula significa que tanto el sticky bit como el permiso de ejecución para los demás usuarios están activos. Una T mayúscula indicaría que el sticky bit está activo, pero falta el permiso de ejecución correspondiente.

Configurar un directorio de equipo con Setgid

En este paso, preparará un directorio privado de colaboración. En un directorio, setgid hace que los elementos nuevos hereden el grupo del directorio en lugar del grupo principal del creador. Esto mantiene los archivos del equipo asociados con un único grupo compartido.

Cree el directorio:

mkdir /home/labex/project/team-share

Haga que jack sea el propietario y que developers sea el grupo propietario:

sudo chown jack:developers /home/labex/project/team-share

Establezca el modo 2770. El 2 inicial activa setgid; 770 concede acceso completo al propietario y al grupo, y deniega el acceso a los demás usuarios.

sudo chmod 2770 /home/labex/project/team-share

Inspeccione el resultado:

ls -ld /home/labex/project/team-share
stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share

El listado largo debe mostrar s en la posición de ejecución del grupo, por ejemplo drwxrws---. La s minúscula significa que tanto setgid como la ejecución del grupo están activos. Una S mayúscula indicaría que setgid está presente, pero falta la ejecución del grupo.

Setuid, representado por una s en la posición de ejecución del propietario, es otro bit especial que suele encontrarse en ejecutables del sistema cuidadosamente controlados. Reconózcalo al leer permisos, pero no lo añada a programas arbitrarios.

Actualizar la pertenencia a grupos y verificar la herencia

En este paso, activará la pertenencia a developers en un shell hijo y demostrará que setgid controla el grupo de un archivo nuevo. Añadir un usuario a /etc/group no actualiza los grupos suplementarios de un shell que ya está en ejecución.

Inicie un shell hijo con developers como grupo activo:

newgrp developers

Es posible que el prompt se actualice. Usted sigue siendo el usuario labex, pero ahora el shell hijo tiene developers como grupo efectivo. Confirme ambas identidades:

id

Cree un archivo en el directorio setgid:

touch /home/labex/project/team-share/labex-note.txt

Inspeccione el archivo nuevo:

stat -c 'owner=%U group=%G mode=%a' /home/labex/project/team-share/labex-note.txt

El propietario debe ser labex, mientras que el grupo debe ser developers. Setgid hereda el grupo propietario; los bits de lectura y escritura del archivo siguen dependiendo del proceso que lo crea y de su umask.

Salga del shell hijo y vuelva a la sesión original del terminal:

exit

El archivo seguirá en su lugar después de cerrar el shell hijo.

Resumen

Practicó el modelo básico de identidad y acceso utilizado por los sistemas Linux. Creó un usuario y un grupo de equipo, administró pertenencias suplementarias, asignó propietarios y tradujo modos de permisos numéricos a reglas de acceso prácticas. También inspeccionó el bloqueo de una cuenta sin exponer su hash de contraseña.

Después pasó de los permisos ordinarios a funciones especiales: umask controló los valores predeterminados, el sticky bit protegió archivos en un directorio público y setgid mantuvo la pertenencia al grupo del equipo en un directorio privado de colaboración. Por último, utilizó newgrp para actualizar la pertenencia al grupo y verificó el grupo heredado en un archivo real.