の説明には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/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