¿Qué es el "inicio de sesión del subsistema"?

¿Qué es el "inicio de sesión del subsistema"?

La DESCRIPCIÓN de man logincontiene esto:

Un inicio de sesión en el subsistema se indica mediante la presencia de un "*" como primer carácter del shell de inicio de sesión. El directorio de inicio proporcionado se utilizará como raíz de un nuevo sistema de archivos en el que el usuario realmente haya iniciado sesión.

Estoy intentando producir el *-shell, pero no puedo. Cuál es elinicio de sesión del subsistemay ¿cómo llego?

Sólo puedo conseguir -bashconchas, mientras espero una *-bashconcha.

Debian 11 aquí si es importante.

Respuesta1

Elinicio de sesión del subsistemaDe hecho, parece ser una característica mal documentada. Es posible que sea necesario navegar un poco por el código fuente para resolver las cosas. Miremos en Debian 11login.c.

La parte que trata de uninicio de sesión del subsistemaempieza alínea 1151:

if (pwd->pw_shell[0] == '*') {  /* subsystem root */
        pwd->pw_shell++;    /* skip the '*' */
        subsystem (pwd);    /* figure out what to execute */
        subroot = true; /* say I was here again */
        endpwent ();    /* close all of the file which were */
        endgrent ();    /* open in the original rooted file */
        endspent ();    /* system. they will be re-opened */
#ifdef  SHADOWGRP
        endsgent ();    /* in the new rooted file system */
#endif
        goto top;   /* go do all this all over again */
}

Si se detecta un asterisco al principio del shellcampo, el asterisco se elimina (por lo que nunca verá un *-bashen una lista de procesos) y subsystem()se llama a la función para el inicio de sesión de este usuario. Aquí pwdhay una estructura que contiene la información equivalente a la línea del usuario en /etc/passwd.

Cuando se activa un inicio de sesión en el subsistema, también finaliza todo el manejo de contraseñas y entradas de grupos. A partir de los comentarios aquí, debería poder adivinar que el inicio de sesión del subsistema tiene algo que ver con chroot().

goto top; salta de nuevo a la línea #717, reiniciando efectivamente el proceso de autenticación y configuración de sesión, ahora usando archivos de configuración dentro del chroot.

La subsystem()función está definida ensub.c- de hecho, esa es la única función en ese archivo:

/*
 * subsystem - change to subsystem root
 *
 *  A subsystem login is indicated by the presence of a "*" as
 *  the first character of the login shell.  The given home
 *  directory will be used as the root of a new filesystem which
 *  the user is actually logged into.
 */

void subsystem (const struct passwd *pw)
{
    /*
     * The new root directory must begin with a "/" character.
     */

    if (pw->pw_dir[0] != '/') {
        printf (_("Invalid root directory '%s'\n"), pw->pw_dir);
        SYSLOG ((LOG_WARN, BAD_SUBROOT2, pw->pw_dir, pw->pw_name));
        closelog ();
        exit (EXIT_FAILURE);
    }

    /*
     * The directory must be accessible and the current process
     * must be able to change into it.
     */

    if (   (chdir (pw->pw_dir) != 0)
        || (chroot (pw->pw_dir) != 0)) {
        (void) printf (_("Can't change root directory to '%s'\n"),
                       pw->pw_dir);
        SYSLOG ((LOG_WARN, NO_SUBROOT2, pw->pw_dir, pw->pw_name));
        closelog ();
        exit (EXIT_FAILURE);
    }
}

Y aquí lo tenemos: uninicio de sesión del subsistemaes un inicio de sesión que se chroot()dirige al directorio de inicio del usuario como se especifica en /etc/passwd. Por ejemplo, si tiene un usuario subsysdefinido así en /etc/passwd:

subsys:x:999:999:Subsystem login example:/home/subsys:*chrooted*

Cuando este usuario inicia sesión usando login(es decir, desde una consola de texto o mediante un puerto serie), el usuario será chroot para que vea su directorio de inicio /home/subsyscomo /. Luego, el proceso de autenticación se repite utilizando los archivos de configuración en /home/subsys/etc.

Tenga en cuenta que en el caso de un inicio de sesión en el subsistema, el contenido del campo de shell real /etc/passwddespués del primer *carácter se ignora de manera efectiva. Una vez realizado el chroot, el loginproceso buscará /home/subsys/etc/passwdel shell real que se utilizará para este usuario.

Como siempre al configurar un chroot, deberá asegurarse de que todos los archivos de biblioteca, archivos de configuración y dispositivos necesarios existan dentro del chroot, ya que los programas iniciados dentro del chroot no podrán acceder a nada fuera del chroot. Entonces, en este caso de ejemplo, tendría que crear al menos un mínimo /home/subsys/lib( /home/subsys/etcincluido al menos /home/subsys/etc/passwd, /home/subsys/etc/shadowy /home/subsys/etc/pam.d/loginposiblemente también otros archivos) y, por lo general, al menos /home/subsys/dev/null.

Dependiendo de para qué esté utilizando el inicio de sesión del subsistema, es posible que también necesite otros dispositivos: para los shells, es probable que necesite /home/subsys/dev/ptmxel devptssistema de archivos en formato /home/subsys/dev/pts. Podrías configurarlos así:

# these steps need only be done once:
mkdir -p /home/subsys/dev/pts
mknod /home/subsys/dev/null c 1 3
mknod /home/subsys/dev/ptmx c 5 2
chmod 0666 /home/subsys/dev/null /home/subsys/dev/ptmx
# this needs to be re-done after every boot:
mount -t devpts none /home/subsys/dev/pts

Entonces necesitarás /home/subsys/etc/passwdtener una entrada para el subsysusuario chroot, algo como esto:

subsys:x:999:999:A subsystem user:/subsyshome:/bin/bash

Esto significaría que el directorio de inicio real del usuario estaría en /home/subsys/subsyshomey también necesitaría proporcionar /home/subsys/bin/bashtodas las bibliotecas que necesita.

información relacionada