「サブシステムログイン」とは何ですか?

「サブシステムログイン」とは何ですか?

説明にはman login以下が含まれます。

サブシステムログインは、ログインシェルの最初の文字「*」で示されます。指定されたホームディレクトリは、ユーザーが実際にログインする新しいファイルシステムのルートとして使用されます。

* -shellを生成しようとしてもできません。何ですかサブシステムログインそこまでどのように行くことができますか?

私が得ることができるのは-bash殻だけで、私は*-bash殻を期待していました。

必要に応じて Debian 11 はここにあります。

答え1

これサブシステムログイン文書化されていない機能のようです。これを把握するには、ソースコードをナビゲートするのに少し時間がかかることがあります。 Debian 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/passwdchrootsubsysユーザーのエントリを提供する必要があります。

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

これは、ユーザーの実際のホームディレクトリが配置され、必要なすべてのライブラリも提供する必要が/home/subsys/subsyshomeあることを意味します。/home/subsys/bin/bash

関連情報