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

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

설명에는 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하위 시스템 로그인의 경우 첫 번째 문자 뒤의 실제 쉘 필드 내용은 *사실상 무시됩니다. chroot가 완료되면 프로세스는 사용자가 사용할 실제 쉘을 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

관련 정보