En los sistemas operativos tipo Unix , un identificador de usuario (a menudo abreviado como ID de usuario o UID ) es un valor que se utiliza para identificar a un usuario. El UID, junto con el identificador de grupo (GID) y otros criterios de control de acceso, se utiliza para determinar a qué recursos del sistema puede acceder un usuario. El archivo de contraseñas asigna nombres de usuario textuales a UID. Los UID se almacenan en los inodos del sistema de archivos Unix , los procesos en ejecución, los archivos tar y el ahora obsoleto Servicio de Información de Red (NIS) . En entornos compatibles con POSIX , el comando de shell proporciona el UID del usuario actual, así como más información como el nombre de usuario y los identificadores de grupo primario y suplementario (GID) y los nombres de grupo.id
Atributos del proceso
El estándar POSIX introdujo tres campos UID diferentes en la tabla de descriptores de proceso, para permitir que los procesos privilegiados asuman diferentes roles de forma dinámica:
ID de usuario efectivo
El UID efectivo ( euid) de un proceso se utiliza para la mayoría de las comprobaciones de acceso. También se utiliza como propietario de los archivos creados por ese proceso.
ID de usuario del sistema de archivos
Linux también tiene un ID de usuario del sistema de archivos ( fsuid) que se utiliza explícitamente para el control de acceso al sistema de archivos. Coincide con a euidmenos que se establezca explícitamente lo contrario. Puede ser el ID de usuario de rootruid solo si , suid, o euides root. Siempre que euidse cambia el , el cambio se propaga al fsuid.
La intención es fsuidpermitir que los programas (por ejemplo, el servidor NFS ) se limiten a los derechos del sistema de archivos de un determinado usuario uidsin otorgarle uidpermiso para enviarle señales. Desde el kernel 2.0, la existencia de fsuidya no es necesaria porque Linux se adhiere a las reglas SUSv3 para el envío de señales, pero fsuidse mantiene por razones de compatibilidad. [ 1 ]
ID de usuario real
El UID real ( ruid) y el GID real ( rgid) identifican al propietario real del proceso y afectan los permisos para enviar señales. Un proceso sin privilegios de superusuario puede enviar señales a otro proceso solo si el ruidUID del remitente coincide con el GID euiddel receptor . Dado que un proceso hijo hereda sus credenciales de su padre, un hijo y un padre pueden enviarse señales entre sí.ruidsuid
ID de usuario guardado
El ID de usuario guardado se utiliza cuando un programa que se ejecuta con privilegios elevados necesita realizar temporalmente algún trabajo sin privilegios; cambiar euidde un valor privilegiado (normalmente 0) a algún valor sin privilegios (cualquier cosa que no sea el valor privilegiado) hace que el valor privilegiado se almacene en suid. Posteriormente, el de un programa euidse puede volver a establecer al valor almacenado en suid, de modo que se puedan restaurar los privilegios elevados; un proceso sin privilegios puede establecer su euida uno de solo tres valores: el valor de ruid, el valor de suid, o el valor de euid.
Convenciones
Tipo
POSIX requiere que el UID sea de tipo entero . La mayoría de los sistemas operativos tipo Unix representan el UID como un entero sin signo. El tamaño de los valores UID varía entre los diferentes sistemas; algunos sistemas operativos UNIX usaban valores de 15 bits, lo que permitía valores de hasta 32767 , mientras que otros, como Linux (antes de la versión 2.4), admitían UID de 16 bits , lo que hacía posible 65536 identificadores únicos. La mayoría de los sistemas modernos tipo Unix (por ejemplo, Solaris 2.0 en 1990, Linux 2.4 en 2001) han cambiado a UID de 32 bits , lo que permite 4.294.967.296 ( 2³² ) identificadores únicos.
Áreas reservadas
La especificación Linux Standard Base Core especifica que los valores UID en el rango de 0 a 99 deben ser asignados estáticamente por el sistema y no deben ser creados por las aplicaciones, mientras que los UID de 100 a 499 deben reservarse para la asignación dinámica por parte de los administradores del sistema y los scripts posteriores a la instalación. [ 2 ]
Debian Linux no solo reserva el rango 100–999 para usuarios y grupos del sistema asignados dinámicamente, sino que también asigna de forma centralizada y estática usuarios y grupos en el rango 60000–64999 y reserva además el rango 65000–65533. [ 3 ]
Systemd define una serie de rangos UID especiales, incluidos [ 4 ].
- 60001-60513: UID para directorios de inicio gestionados por systemd-homed
- 61184-65519 (0xef00-0xffef): UID para usuarios dinámicos
En FreeBSD , los porteadores que necesitan un UID para su paquete pueden elegir uno libre del rango 50 a 999 y luego registrar la asignación estática. [ 5 ] [ 6 ]
Algunos sistemas POSIX asignan UID para nuevos usuarios a partir de 500 ( macOS , Red Hat Enterprise Linux hasta la versión 6), otros a partir de 1000 (Red Hat Enterprise Linux desde la versión 7, [ 7 ] openSUSE , Debian [ 3 ] ). En muchos sistemas Linux, estos rangos se especifican en /etc/login.defs, para useraddy herramientas similares.
Las asignaciones centrales de UID en redes empresariales (por ejemplo, a través de servidores LDAP y NFS ) pueden limitarse a usar solo números de UID muy superiores a 1000 y fuera del rango 60000–65535, para evitar posibles conflictos con los UID asignados localmente en los equipos cliente. Cuando se crean nuevos usuarios localmente, el sistema local debe verificar y evitar conflictos con los UID ya existentes en NSS. [ nota 1 ]
La virtualización a nivel del sistema operativo puede reasignar identificadores de usuario, por ejemplo, utilizando espacios de nombres de Linux , y por lo tanto necesita asignar rangos en los que se asignan los UID y GID reasignados:
- snapd asigna UID y GID al rango 524288-589823 (0x80000-0x8ffff).
- systemd-nspawn asigna automáticamente rangos de UID por contenedor utilizando el rango 524288-1879048191 (0x80000-0x6fffffff) [ 4 ]
Los autores de systemd recomiendan que los sistemas de virtualización a nivel del sistema operativo asignen 65536 (2 16 ) UID por contenedor y los asignen sumando un múltiplo entero de 2 16 . [ 4 ]
Valores especiales
- 0: El superusuario normalmente tiene un UID de cero (0). [ 8 ]
- −1: El valor
(uid_t) -1está reservado por POSIX para identificar un argumento omitido. [ 9 ] - 65535: Este valor aún se evita porque era el valor de retorno de error de la API cuando uid_t era de 16 bits.
- Nadie: Históricamente, al usuario " nobody " se le asignó el UID por varios sistemas operativos, aunque también se utilizan
-2otros valores como 2 15 −1 = 32,767, como por ejemplo por OpenBSD . [ 10 ] Para la compatibilidad entre UID de 16 bits y 32 bits, muchas distribuciones de Linux ahora lo establecen en 2 16 −2 = 65,534; el kernel de Linux devuelve por defecto este valor cuando un UID de 32 bits no cabe en el valor de retorno de las llamadas al sistema de 16 bits. [ 11 ] Fedora Linux asigna el último UID del rango asignado estáticamente para uso del sistema (0–99) a nobody: 99, y llama a 65534 en su lugarnfsnobody.
Alternativas
NFSv4 fue diseñado para ayudar a evitar colisiones de identificadores numéricos al identificar usuarios (y grupos) en paquetes de protocolo utilizando nombres textuales "usuario@dominio" en lugar de números enteros. Sin embargo, mientras los núcleos de los sistemas operativos y los sistemas de archivos locales sigan utilizando identificadores de usuario enteros, esto conlleva pasos de traducción adicionales (utilizando procesos demonio idmap), lo que puede introducir puntos de fallo adicionales si los mecanismos de asignación de UID locales o las bases de datos se configuran incorrectamente, se pierden o se desincronizan. La parte "@dominio" del nombre de usuario podría utilizarse para indicar qué autoridad asignó un nombre en particular, por ejemplo, en forma de
- un nombre de dominio Kerberos
- un nombre de dominio de Active Directory
- el nombre de un proveedor de sistema operativo (para asignaciones específicas de la distribución)
- el nombre de un ordenador (para asignaciones específicas de dispositivos)
Pero en la práctica, muchas implementaciones existentes solo permiten establecer el dominio NFSv4 a un valor fijo, lo que lo vuelve inútil.
Véase también
Notas
- ↑ para ambos rangos de asignación: cuando se realiza una asignación de UID, primero se comprueba si hay colisiones en NSS y se elige un UID diferente si se encuentra una entrada.
Referencias
- ↑ Kerrisk, Michael. La interfaz de programación de Linux . No Starch Press, 2010, pág. 171.
- ↑ "9.3. Rangos de UID" . Refspecs.linuxfoundation.org . Consultado el 24 de septiembre de 2016 .
- 1 2 "Manual de políticas de Debian – Sección 9.2.2: Clases UID y GID" . Debian.org . 18 de julio de 2019. Consultado el 26 de julio de 2019 .
- 1 2 3 "Usuarios, grupos, UID y GID en sistemas systemd" . GitHub . Consultado el 26 de septiembre de 2020 .
- ↑ "FreeBSD Porter's Handbook" . Freebsd.org . Consultado el 24 de septiembre de 2016 .
- ↑ "Capítulo 6. Consideraciones especiales" .
- ↑ "Cambios en el sistema RHEL7" . Certdepot.net . 17 de enero de 2016. Consultado el 22 de marzo de 2017 .
- ↑ "Getpwuid" . Pubs.opengroup.org . Consultado el 24 de septiembre de 2016 .
- ↑ "Chown" . Pubs.opengroup.org . Consultado el 24 de septiembre de 2016 .
- ↑ "Informe de problema de NetBSD n.° 6594: las credenciales predeterminadas "nobody" (32767:9999) no coinciden con las predeterminadas de mountd (-2:-2)" . GnaNFSv4ts.netbsd.org . Consultado el 24 de septiembre de 2016 .
- ↑ "Espacios de nombres en funcionamiento, parte 5: Espacios de nombres de usuario" . Lwn.net . Consultado el 24 de septiembre de 2016 .
- Unix
- Tecnología del sistema de archivos Unix