説明には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/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
chrootsubsys
ユーザーのエントリを提供する必要があります。
subsys:x:999:999:A subsystem user:/subsyshome:/bin/bash
これは、ユーザーの実際のホームディレクトリが配置され、必要なすべてのライブラリも提供する必要が/home/subsys/subsyshome
あることを意味します。/home/subsys/bin/bash