Los sistemas operativos similares a Unix identifican a un usuario por un valor llamado identificador de usuario , a menudo abreviado como ID de usuario o UID . 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ña 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 . En entornos compatibles con POSIX , el comando de la línea de comandosid
proporciona el UID del usuario actual, así como más información, como el nombre de usuario, el grupo de usuarios principal y el identificador de grupo (GID).
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 dinámicamente:
ID de usuario efectivo
El UID ( euid
) efectivo 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. El GID ( egid
) efectivo de un proceso también afecta el control de acceso y también puede afectar la creación de archivos, dependiendo de la semántica de la implementación específica del kernel en uso y posiblemente de las opciones de montaje utilizadas. De acuerdo con la semántica de BSD Unix, la propiedad grupal otorgada a un archivo recién creado se hereda incondicionalmente de la propiedad grupal del directorio en el que se crea. De acuerdo con la semántica de AT&T UNIX System V (también adoptada por las variantes de Linux), un archivo recién creado normalmente recibe la propiedad de grupo especificada por egid
el proceso que crea el archivo. La mayoría de los sistemas de archivos implementan un método para seleccionar si se debe usar la semántica BSD o AT&T con respecto a la propiedad grupal de un archivo recién creado; La semántica BSD se selecciona para directorios específicos cuando se establece el permiso S_ISGID (s-gid). [1]
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 el a euid
menos que se establezca explícitamente lo contrario. Puede ser el ID de usuario de la raíz sólo si ruid
, suid
o euid
es root. Siempre que euid
se cambia, el cambio se propaga a 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 algunos dados uid
sin dar ese uid
permiso para enviarles señales. Desde el kernel 2.0, la existencia de fsuid
ya no es necesaria porque Linux se adhiere a las reglas de SUSv3 para enviar señales, pero fsuid
permanece por razones de compatibilidad. [2]
ID de usuario guardada
La ID de usuario guardada ( suid
) se utiliza cuando un programa que se ejecuta con privilegios elevados necesita realizar un trabajo sin privilegios temporalmente; el cambio euid
de un valor privilegiado (normalmente 0
) a algún valor no privilegiado (cualquier cosa que no sea el valor privilegiado) hace que el valor privilegiado se almacene en suid
. [3] Posteriormente, un programa euid
puede volver a establecerse en el valor almacenado en suid
, de modo que se puedan restaurar los privilegios elevados; un proceso sin privilegios puede establecer su euid
en uno de sólo tres valores: el valor de ruid
, el valor de suid
o el valor de euid
.
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 señalar otro proceso solo si el remitente ruid
o el euid
receptor coincide con ruid
o suid
. Debido a que un proceso hijo hereda sus credenciales de su padre, un hijo y un padre pueden enviarse señales entre sí.
Convenciones
Tipo
POSIX requiere que el UID sea un tipo entero. La mayoría de los sistemas operativos similares a Unix representan el UID como un número entero sin signo. El tamaño de los valores de UID varía entre los diferentes sistemas; algunos sistemas operativos UNIX [ cuál? ] usaba valores de 15 bits, lo que permitía valores de hasta 32767 [ cita requerida ] , mientras que otros como Linux (antes de la versión 2.4) admitían UID de 16 bits , lo que posibilitaba 65536 ID únicos. La mayoría de los sistemas modernos similares a 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 32 ) ID únicos.
Rangos reservados
La especificación del núcleo básico estándar de Linux especifica que los valores de UID en el rango de 0 a 99 deben ser asignados estáticamente por el sistema y no deben ser creados por 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 después de la instalación. guiones. [4]
Debian Linux no solo reserva el rango 100–999 para grupos y usuarios 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 además reserva el rango 65000–65533. [5]
Systemd define una serie de rangos de UID especiales, incluidos [6]
- 60001-60513: UID para directorios de inicio administrados por systemd-homed
- 61184-65519 (0xef00-0xffef): UID para usuarios dinámicos
En FreeBSD, los porteros que necesitan un UID para su paquete pueden elegir uno gratis del rango de 50 a 999 y luego registrar la asignación estática. [7] [8]
Algunos sistemas POSIX asignan UID para nuevos usuarios a partir de 500 ( macOS , Red Hat Enterprise Linux hasta la versión 6), otros comienzan en 1000 (Red Hat Enterprise Linux desde la versión 7, [9] openSUSE , Debian [5] ). En muchos sistemas Linux, estos rangos se especifican en /etc/login.defs
, para useradd
y herramientas similares.
Las asignaciones de UID centrales en redes empresariales (p. Ej., A través de servidores LDAP y NFS ) pueden limitarse a usar solo números de UID muy por encima de 1000 y fuera del rango 60000–65535, para evitar posibles conflictos con los UID asignados localmente en los equipos cliente.
La virtualización a nivel de sistema operativo puede reasignar identificadores de usuario, por ejemplo, utilizando espacios de nombres de Linux y, por lo tanto, es necesario asignar rangos en los que se asignan los UID y GID reasignados:
- snapd asigna UID y GID en el rango 524288-589823 (0x80000-0x8ffff)
- systemd-nspawn asigna automáticamente los rangos de UID por contenedor utiliza el rango 524288-1879048191 (0x80000-0x6fffffff) [6]
Los autores de systemd recomiendan que los sistemas de virtualización a nivel de SO deben asignar 65536 (2 16 ) UID por contenedor y asignarlos agregando un múltiplo entero de 2 16 . [6]
Valores especiales
- 0: el superusuario normalmente tiene un UID de cero (0). [10]
- −1:
(uid_t) -1
POSIX reserva el valor para identificar un argumento omitido. [11] - 65535: este valor aún se evita porque era el valor de retorno de error de API cuando uid_t era de 16 bits.
- Nadie: Históricamente, varios sistemas operativos le asignaban UID al usuario " nadie "
-2
, aunque también se utilizan otros valores como 2 15 −1 = 32,767, como OpenBSD . [12] Para la compatibilidad entre UID de 16 bits y 32 bits, muchas distribuciones de Linux ahora lo configuran en 2 16 −2 = 65,534; el kernel de Linux devuelve de forma predeterminada este valor cuando un UID de 32 bits no encaja en el valor de retorno de las llamadas al sistema de 16 bits. [13] Fedora Linux asigna el último UID del rango asignado estáticamente para uso del sistema (0-99) a nadie: 99, y en su lugar llama a 65534nfsnobody
.
Alternativas
NFSv4 tenía la intención de ayudar a evitar colisiones de identificadores numéricos identificando usuarios (y grupos) en paquetes de protocolo utilizando nombres textuales "usuario @ dominio" en lugar de números enteros. Sin embargo, mientras los kernels del sistema operativo y los sistemas de archivos locales continúen usando identificadores de usuario enteros, esto se produce a expensas de pasos de traducción adicionales (usando procesos de demonio idmap), que pueden introducir puntos de falla adicionales si los mecanismos de mapeo de UID locales o las bases de datos se ponen configurado incorrectamente, perdido o desincronizado. La parte "@dominio" del nombre de usuario podría usarse para indicar qué autoridad asignó un nombre en particular, por ejemplo, en forma de
- un nombre de dominio de Kerberos
- un nombre de dominio de Active Directory
- el nombre de un proveedor de sistema operativo (para asignaciones específicas de distribución)
- el nombre de una computadora (para asignaciones específicas de dispositivos)
Pero en la práctica, muchas implementaciones existentes solo permiten configurar el dominio NFSv4 en un valor fijo, lo que lo vuelve inútil.
Ver también
- setuid
- Poco pegajoso
- Identificador de grupo
- Identificador de proceso
- Permisos del sistema de archivos
- Abierto (llamada al sistema)
- Montaje (Unix)
- Derechos de acceso FAT
- Identificador de seguridad (SID): el equivalente de Windows NT
Referencias
- ^ - Manual de referencia de comandos de usuario de Solaris 10
- ^ Kerrisk, Michael. La interfaz de programación de Linux . No Starch Press, 2010, pág. 171.
- ^ "Setuid desmitificado" (PDF) . Cs.berkeley.edu . Consultado el 24 de septiembre de 2016 .
- ^ "9.3. Rangos de UID" . Refspecs.linuxfoundation.org . Consultado el 24 de septiembre de 2016 .
- ^ a b "Manual de políticas de Debian - Sección 9.2.2: Clases UID y GID" . Debian.org . 2019-07-18 . Consultado el 26 de julio de 2019 .
- ^ a b c "Usuarios, grupos, UID y GID en sistemas systemd" . Consultado el 26 de septiembre de 2020 .
- ^ "Manual de FreeBSD Porter" . Freebsd.org . Consultado el 24 de septiembre de 2016 .
- ^ http://www.freebsd.org/doc/en/books/porters-handbook/users-and-groups.html
- ^ "Cambios en el sistema RHEL7" . Certdepot.net . 2016-01-17 . 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 problemas de NetBSD # 6594: las credenciales predeterminadas de" nadie "(32767: 9999) no coinciden con las 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 usuarios" . Lwn.net . Consultado el 24 de septiembre de 2016 .