Die BESCHREIBUNG man login
enthält Folgendes:
Eine Subsystemanmeldung wird durch das Vorhandensein eines "*" als erstes Zeichen der Anmeldeshell angezeigt. Das angegebene Home-Verzeichnis wird als Stammverzeichnis eines neuen Dateisystems verwendet, bei dem der Benutzer tatsächlich angemeldet ist.
Ich versuche die *-Shell zu erzeugen, aber es gelingt mir nicht. Was ist dasSubsystem-Anmeldungund wie komme ich dorthin?
Ich kann nur -bash
Muscheln bekommen, während ich eine *-bash
Muschel erwarte.
Debian 11 hier, falls das wichtig ist.
Antwort1
DerSubsystem-Anmeldungscheint tatsächlich eine schlecht dokumentierte Funktion zu sein. Um die Dinge herauszufinden, muss man vielleicht ein bisschen im Quellcode stöbern. Schauen wir uns Debian 11slogin.c
.
Der Teil, der sich mit einerSubsystem-Anmeldungstartet umLinie 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 */
}
Wenn am Anfang des shell
Felds ein Sternchen erkannt wird, wird das Sternchen entfernt (sodass Sie *-bash
in einer Prozessliste nie ein sehen) und die subsystem()
Funktion wird für die Anmeldung dieses Benutzers aufgerufen. Hier pwd
ist eine Struktur, die die Informationen enthält, die der Zeile des Benutzers in entsprechen /etc/passwd
.
Wenn ein Subsystem-Login ausgelöst wird, wird auch die gesamte Passwort- und Gruppeneintragsverarbeitung beendet. Aus den Kommentaren hier sollte man erraten können, dass der Subsystem-Login etwas mit zu tun hat chroot()
.
goto top;
springt zurück zu Zeile #717, wodurch der Authentifizierungs- und Sitzungseinrichtungsprozess effektiv neu gestartet wird und jetzt Konfigurationsdateien innerhalb des Chroots verwendet werden.
Die subsystem()
Funktion ist definiert inUnterabschnitt c- tatsächlich ist das die einzige Funktion in dieser Datei:
/*
* 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);
}
}
Und hier haben wir es: einSubsystem-Anmeldungist ein Login, der chroot()
auf das Home-Verzeichnis des Benutzers verweist, wie in angegeben /etc/passwd
. Wenn Sie beispielsweise den Benutzer subsys
wie folgt in definiert haben /etc/passwd
:
subsys:x:999:999:Subsystem login example:/home/subsys:*chrooted*
Wenn sich dieser Benutzer mit anmeldet login
(also von einer Textkonsole oder über einen seriellen Port), wird der Benutzer chrootet, so dass er sein Home-Verzeichnis /home/subsys
als sieht /
. Anschließend wird der Authentifizierungsprozess mit den Konfigurationsdateien in wiederholt /home/subsys/etc
.
Beachten Sie, dass bei einer Subsystemanmeldung der Inhalt des Shell-Felds des tatsächlichen Felds /etc/passwd
nach dem ersten *
Zeichen effektiv ignoriert wird. Sobald das Chrooting abgeschlossen ist, login
liest der Prozess /home/subsys/etc/passwd
die echte Shell, die für diesen Benutzer verwendet wird.
Wie immer müssen Sie beim Einrichten eines Chroots sicherstellen, dass alle erforderlichen Bibliotheksdateien, Konfigurationsdateien und Geräte im Chroot vorhanden sind, da innerhalb des Chroots gestartete Programme auf nichts außerhalb des Chroots zugreifen können. In diesem Beispielfall müssten Sie also mindestens minimale /home/subsys/lib
, /home/subsys/etc
(einschließlich mindestens /home/subsys/etc/passwd
, /home/subsys/etc/shadow
, /home/subsys/etc/pam.d/login
und möglicherweise auch anderer Dateien) und normalerweise mindestens erstellen /home/subsys/dev/null
.
Abhängig davon, wofür Sie die Subsystem-Anmeldung verwenden, benötigen Sie möglicherweise auch andere Geräte: Für Shells benötigen Sie wahrscheinlich /home/subsys/dev/ptmx
und das devpts
Dateisystem in /home/subsys/dev/pts
. Sie können sie wie folgt einrichten:
# 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
Sie /home/subsys/etc/passwd
benötigen also einen Eintrag für den chroot- subsys
Benutzer, etwa wie diesen:
subsys:x:999:999:A subsystem user:/subsyshome:/bin/bash
Dies würde bedeuten, dass sich das tatsächliche Home-Verzeichnis des Benutzers unter befindet und Sie außerdem alle dafür benötigten Bibliotheken /home/subsys/subsyshome
bereitstellen müssen ./home/subsys/bin/bash