의 설명에는 man login
다음이 포함됩니다.
서브시스템 로그인은 로그인 쉘의 첫 번째 문자로 "*"가 있으면 표시됩니다. 지정된 홈 디렉토리는 사용자가 실제로 로그인하는 새 파일 시스템의 루트로 사용됩니다.
*-shell을 생성하려고 하는데 할 수 없습니다. 이것은하위 시스템 로그인그리고 거기 어떻게 가나요?
나는 -bash
껍질만을 얻을 수 있지만 껍질을 기대합니다 *-bash
.
중요한 경우 Debian 11을 사용하세요.
답변1
그만큼하위 시스템 로그인실제로 문서화가 잘 안 된 기능인 것 같습니다. 문제를 파악하려면 약간의 소스 코드 서핑이 필요할 수 있습니다. 데비안 11을 살펴보자login.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
이 사용자가 텍스트 콘솔이나 직렬 포트를 통해 로그인하면 홈 디렉토리가 /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
chroot된 사용자에 대한 항목이 subsys
다음과 같이 필요합니다.
subsys:x:999:999:A subsystem user:/subsyshome:/bin/bash
이는 사용자의 실제 홈 디렉토리가 에 있음을 의미하며 이에 필요한 모든 라이브러리 /home/subsys/subsyshome
도 제공해야 합니다 ./home/subsys/bin/bash