"하위 시스템 로그인"이란 무엇입니까?

"하위 시스템 로그인"이란 무엇입니까?

의 설명에는 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/ptmxdevpts경우 /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/passwdchroot된 사용자에 대한 항목이 subsys다음과 같이 필요합니다.

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

이는 사용자의 실제 홈 디렉토리가 에 있음을 의미하며 이에 필요한 모든 라이브러리 /home/subsys/subsyshome도 제공해야 합니다 ./home/subsys/bin/bash

관련 정보