A DESCRIÇÃO de man login
conté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 -bash
conchas, enquanto espero uma *-bash
concha.
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 shell
campo, o asterisco será removido (assim você nunca verá uma *-bash
listagem de processos) e a subsystem()
função será chamada para o login deste usuário. Aqui pwd
está 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 subsys
definido 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/subsys
como /
. 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/passwd
após o primeiro *
caractere é efetivamente ignorado. Feito o chroot, o login
processo irá ler /home/subsys/etc/passwd
o 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/shadow
e /home/subsys/etc/pam.d/login
possivelmente 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/ptmx
do devpts
sistema 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/passwd
precisaria ter uma entrada para o subsys
usuá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/subsyshome
e você também precisaria fornecer /home/subsys/bin/bash
todas as bibliotecas necessárias para ele.