La DESCRIPCIÓN de man login
contiene 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 -bash
conchas, mientras espero una *-bash
concha.
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 shell
campo, el asterisco se elimina (por lo que nunca verá un *-bash
en una lista de procesos) y subsystem()
se llama a la función para el inicio de sesión de este usuario. Aquí pwd
hay 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 subsys
definido 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/subsys
como /
. 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/passwd
después del primer *
carácter se ignora de manera efectiva. Una vez realizado el chroot, el login
proceso buscará /home/subsys/etc/passwd
el 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/etc
incluido al menos /home/subsys/etc/passwd
, /home/subsys/etc/shadow
y /home/subsys/etc/pam.d/login
posiblemente 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/ptmx
el devpts
sistema 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/passwd
tener una entrada para el subsys
usuario 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/subsyshome
y también necesitaría proporcionar /home/subsys/bin/bash
todas las bibliotecas que necesita.