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

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

の説明には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()は、 で指定されているユーザーのホーム ディレクトリに ed されるログインです/etc/passwd。たとえば、subsysで次のようにユーザーが定義されている場合/etc/passwd:

subsys:x:999:999:Subsystem login example:/home/subsys:*chrooted*

このユーザーが を使用してログインするとlogin(つまり、テキスト コンソールまたはシリアル ポート経由で)、ユーザーは chroot され、ホーム ディレクトリが/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

関連情報