Was ist „Subsystem-Login“?

Was ist „Subsystem-Login“?

Die BESCHREIBUNG man loginenthä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 -bashMuscheln bekommen, während ich eine *-bashMuschel 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 shellFelds ein Sternchen erkannt wird, wird das Sternchen entfernt (sodass Sie *-bashin einer Prozessliste nie ein sehen) und die subsystem()Funktion wird für die Anmeldung dieses Benutzers aufgerufen. Hier pwdist 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 subsyswie 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/subsysals 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/passwdnach dem ersten *Zeichen effektiv ignoriert wird. Sobald das Chrooting abgeschlossen ist, loginliest der Prozess /home/subsys/etc/passwddie 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/loginund 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/ptmxund das devptsDateisystem 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/passwdbenötigen also einen Eintrag für den chroot- subsysBenutzer, 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/subsyshomebereitstellen müssen ./home/subsys/bin/bash

verwandte Informationen