O que é "login do subsistema"?

O que é "login do subsistema"?

A DESCRIÇÃO de man logincontém isto:

Um login no subsistema é indicado pela presença de um "*" como o primeiro caractere do shell de login. O diretório inicial fornecido será usado como raiz de um novo sistema de arquivos no qual o usuário está realmente conectado.

Estou tentando produzir o *-shell, mas não consigo. O que élogin do subsistemae como faço para chegar lá?

Só consigo obter -bashconchas, enquanto espero uma *-bashconcha.

Debian 11 aqui se for importante.

Responder1

Ologin do subsistemaparece de fato ser um recurso mal documentado. Pode ser necessário navegar um pouco pelo código-fonte para descobrir as coisas. Vamos dar uma olhada no Debian 11login.c.

A parte que trata de umlogin do subsistemacomeça emlinha 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 */
}

Se um asterisco for detectado no início do shellcampo, o asterisco será removido (assim você nunca verá uma *-bashlistagem de processos) e a subsystem()função será chamada para o login deste usuário. Aqui pwdestá uma estrutura contendo as informações que equivalem à linha do usuário /etc/passwd.

Quando um login no subsistema é acionado, todo o tratamento de senha e entrada de grupo também é encerrado. A partir dos comentários aqui, você deve ser capaz de adivinhar que o login do subsistema tem algo a ver com o chroot().

goto top; volta para a linha #717, reiniciando efetivamente o processo de autenticação e configuração de sessão, agora usando arquivos de configuração dentro do chroot.

A subsystem()função é definida emsub.c- na verdade, essa é a única função nesse arquivo:

/*
 * 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);
    }
}

E aqui temos: umlogin do subsistemaé um login enviado chroot()para o diretório inicial do usuário, conforme especificado em /etc/passwd. Por exemplo, se você tiver um usuário subsysdefinido assim em /etc/passwd:

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

Quando este usuário fizer login usando login(ou seja, a partir de um console de texto ou através de uma porta serial), o usuário será chrootado para que veja seu diretório inicial /home/subsyscomo /. Em seguida, o processo de autenticação é repetido usando os arquivos de configuração no formato /home/subsys/etc.

Observe que no caso de um login no subsistema, o conteúdo do campo shell real /etc/passwdapós o primeiro *caractere é efetivamente ignorado. Feito o chroot, o loginprocesso irá ler /home/subsys/etc/passwdo shell real que será usado para este usuário.

Como sempre, ao configurar um chroot, você terá que garantir que todos os arquivos de biblioteca, arquivos de configuração e dispositivos necessários existam dentro do chroot, pois os programas iniciados dentro do chroot não serão capazes de acessar nada fora do chroot. Portanto, neste caso de exemplo, você teria que criar pelo menos o mínimo de /home/subsys/lib, /home/subsys/etc(incluindo pelo menos /home/subsys/etc/passwd, /home/subsys/etc/shadowe /home/subsys/etc/pam.d/loginpossivelmente outros arquivos também) e geralmente pelo menos /home/subsys/dev/null.

Dependendo de para que você está usando o login do subsistema, você pode precisar de outros dispositivos também: para shells, é provável que você precise /home/subsys/dev/ptmxdo devptssistema de arquivos em /home/subsys/dev/pts. Você pode configurá-los assim:

# 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

Então você /home/subsys/etc/passwdprecisaria ter uma entrada para o subsysusuário chroot, algo assim:

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

Isso significaria que o diretório inicial real do usuário estaria em /home/subsys/subsyshomee você também precisaria fornecer /home/subsys/bin/bashtodas as bibliotecas necessárias para ele.

informação relacionada