inicio de sesión y su interno

10

Estoy tratando de entender cómo funcionan los permisos de usuario en Linux. El núcleo arranca y comienza initcomo root, ¿verdad? Init luego ejecuta scripts de inicio y ejecuta getty( agetty), nuevamente como root. Agetty solo lee el nombre de usuario y se ejecuta login, aún como root, creo. Nada interesante todavía. Pero, ¿qué hace el inicio de sesión ? No pude encontrar nada mejor que "intenta iniciar sesión". Supongamos que el inicio de sesión encuentra que la contraseña coincide (e intentamos iniciar sesión como usuario habitual), ¿cómo cambia la identificación del usuario? Pensé que debería haber una llamada al sistema para eso, pero no pude encontrarlo (¿tal vez solo estoy ciego?)


Además, sobre su. sutiene el bit 'setuid' establecido, de modo que cuando lo ejecutamos, siempre se ejecuta como root. Pero cuando le pedimos que inicie sesión como usuario habitual, nuevamente necesita cambiar la identificación del usuario. ¿Entiendo correctamente que ocurre la misma "magia" suy logincuándo necesitan cambiar de usuario? Si es así, ¿por qué tener dos programas diferentes? ¿Hay algún tipo de negocio serio al ejecutar el inicio de sesión?

Anton Barkovsky
fuente

Respuestas:

9

Hay varias partes en lo que hacen los programas de inicio de sesión. Los programas de inicio de sesión difieren en cómo interactúan con el usuario que está intentando iniciar sesión. Aquí hay algunos ejemplos:

  • login: lee la entrada en un terminal de texto
  • su: invocado por un usuario que ya ha iniciado sesión, obtiene la mayoría de los datos de sus argumentos de línea de comandos, más datos de autenticación (contraseña) de un terminal
  • gksu: similar a su, pero lee datos de autenticación en X
  • rlogind: obtiene entrada a través de una conexión TCP a través del protocolo rlogin
  • sshd: obtiene entrada a través de una conexión TCP a través del protocolo SSH
  • Administradores de pantalla X (xdm, gdm, kdm, ...): similar a login, pero leer la entrada en una pantalla X

Estos programas funcionan de manera similar.

  1. La primera parte es la autenticación : el programa lee algunas entradas del usuario y decide si el usuario está autorizado para iniciar sesión. El método tradicional es leer un nombre de usuario y una contraseña, y verificar que el usuario se menciona en la base de datos de usuarios del sistema y que la contraseña que escribió el usuario es la de la base de datos. Pero hay muchas otras posibilidades (contraseñas de un solo uso, autenticación biométrica, transferencia de autorización, ...).

  2. Una vez que se ha establecido que el usuario está autorizado para iniciar sesión y en qué cuenta, el programa de inicio de sesión establece la autorización del usuario, por ejemplo, a qué grupos pertenecerá el usuario en esta sesión.

  3. El programa de inicio de sesión también puede verificar las restricciones de la cuenta. Por ejemplo, puede exigir un tiempo de inicio de sesión, o un número máximo de usuarios conectados, o rechazar ciertos usuarios en ciertas conexiones.

  4. Finalmente, el programa de inicio de sesión configura la sesión del usuario. Hay varios subpasos:

    1. Establezca los permisos de proceso a lo que se decidió en la autorización: usuario, grupos, límites, ... Aquí puede ver un ejemplo simple de este subpaso (solo maneja usuarios y grupos). La idea básica es que el programa de inicio de sesión todavía se ejecuta como root en este punto, por lo que tiene los máximos privilegios; primero elimina todos los privilegios además de ser el usuario raíz, y finalmente llama setuidpara eliminar ese último privilegio, pero no menos importante.
    2. Posiblemente monte el directorio de inicio del usuario, muestre un mensaje de "tiene correo", etc.
    3. Invoque algún programa como usuario, generalmente el shell del usuario (para loginy su, sshdsi no se especificó ningún comando; un administrador de pantalla X invoca un administrador de sesión X o administrador de ventana).

La mayoría de los equipos actuales utilizan PAM (Módulos de autenticación conectables) para proporcionar una forma uniforme de administrar los servicios de inicio de sesión. PAM divide su funcionalidad en 4 partes : "auth" abarca tanto la autenticación (1 arriba) como la autorización (2 arriba); "Cuenta" y "sesión" son como 3 y 4 arriba; y también hay "contraseña", que no se usa para iniciar sesión sino para actualizar tokens de autenticación (por ejemplo, contraseñas).

Gilles 'SO- deja de ser malvado'
fuente
4

Las llamadas al sistema que está buscando se llaman cosas como setuidy seteuidaunque en realidad hay toda una familia de dobladillos, dependiendo exactamente de qué variantes de identidad de usuario está tratando de cambiar.

También hay llamadas paralelas como setgidpara cambiar el grupo en el que se ejecuta un proceso.

TomH
fuente
4

logineliminará los privilegios de root cuando sea necesario. Muchos programas que necesitan privilegios de root solo inicialmente comenzarán como root, harán lo que tienen que hacer y luego se desplegarán a una cuenta de usuario normal para que no tengan que preocuparse de que alguien use un error en el binario para acceder a un cáscara de raíz. loginnaturalmente tiene los privilegios por más tiempo, pero el principio es el mismo.

En realidad, abandonar los privilegios de root es bastante trivial. POSIX define setuid()y setgid()funciones, que cambian sus ID de usuario y grupo, respectivamente (real y efectivo, si está comenzando como root). loginllama a ambos, así como initgroups()a configurar cualquier grupo adicional que pueda tener (ya que setgides solo para configurar su ID de grupo principal)

Naturalmente, es el núcleo el que realmente maneja el cambio del proceso 'UID / GID'. ¿Cómo puedo encontrar las implementaciones de las llamadas al sistema kernel de Linux? explica mucho sobre syscalls; en mi fuente de kernel tengo:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

entonces 144 y 146 son los números de llamada del sistema para esas funciones en mi máquina


No verifiqué la sufuente para ver qué hace, pero sospecho que también elimina los privilegios de root justo antes exec()de usar un shell, usando el mismo método

Michael Mrozek
fuente