ОПИСАНИЕ 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
все необходимые ему библиотеки.