Что такое «вход в подсистему»?

Что такое «вход в подсистему»?

ОПИСАНИЕ man loginсодержит следующее:

Вход в подсистему обозначается наличием "*" в качестве первого символа оболочки входа. Указанный домашний каталог будет использоваться в качестве корня новой файловой системы, в которую пользователь фактически вошел.

Я пытаюсь создать *-shell, но не могу. Что такоевход в подсистемуи как туда добраться?

Я могу получить только -bashснаряды, хотя ожидаю *-bashснаряд.

Если это имеет значение, вот Debian 11.

решение1

Theвход в подсистемуПохоже, это действительно плохо документированная функция. Возможно, понадобится немного покопаться в исходном коде, чтобы разобраться. Давайте посмотрим в Debian 11login.c.

Часть, которая имеет дело свход в подсистемуначинается встрока 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 */
}

Если в начале поля обнаружена звездочка shell, она удаляется (так что вы никогда не увидите ее *-bashв списке процессов), и subsystem()функция вызывается для входа этого пользователя. Вот pwdструктура, содержащая информацию, эквивалентную строке пользователя в /etc/passwd.

Когда срабатывает вход в подсистему, вся обработка паролей и групповых записей также прекращается. Из комментариев здесь вы должны догадаться, что вход в подсистему как-то связан с chroot().

goto top; возвращается к строке №717, фактически перезапуская процесс аутентификации и настройки сеанса, теперь используя файлы конфигурации внутри chroot.

Функция subsystem()определена всуб.c- на самом деле, это единственная функция в этом файле:

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

И вот оно у нас:вход в подсистемуэто логин, который chroot()редактируется в домашнем каталоге пользователя, как указано в /etc/passwd. Например, если у вас есть пользователь, subsysопределенный следующим образом в /etc/passwd:

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

Когда этот пользователь входит в систему с помощью login(т. е. из текстовой консоли или через последовательный порт), пользователь будет chrooted, так что он увидит свой домашний каталог /home/subsysкак /. Затем процесс аутентификации повторяется с использованием файлов конфигурации в /home/subsys/etc.

Обратите внимание, что в случае входа в подсистему содержимое поля оболочки /etc/passwdпосле первого *символа фактически игнорируется. После выполнения chrooting процесс loginбудет считывать /home/subsys/etc/passwdреальную оболочку, которая будет использоваться для этого пользователя.

Как всегда при настройке chroot, вам придется убедиться, что все необходимые файлы библиотек, файлы конфигурации и устройства существуют в chroot, поскольку программы, запущенные в chroot, не смогут получить доступ ни к чему за пределами chroot. Поэтому в этом примере вам придется создать по крайней мере минимальный /home/subsys/lib, /home/subsys/etc(включая по крайней мере /home/subsys/etc/passwd, /home/subsys/etc/shadow, /home/subsys/etc/pam.d/loginи, возможно, также другие файлы) и обычно по крайней мере /home/subsys/dev/null.

В зависимости от того, для чего вы используете вход в подсистему, вам могут понадобиться и другие устройства: для оболочек вам, скорее всего, понадобятся /home/subsys/dev/ptmxи devptsфайловая система в /home/subsys/dev/pts. Вы можете настроить их следующим образом:

# 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

Поэтому вам /home/subsys/etc/passwdпонадобится запись для subsysпользователя chroot, что-то вроде этого:

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

Это означало бы, что фактический домашний каталог пользователя будет находиться по адресу /home/subsys/subsyshome, и вам также необходимо будет предоставить /home/subsys/bin/bashвсе необходимые ему библиотеки.

Связанный контент