In Teil eins, So richten Sie Linux-Chroot-Jails ein, habe ich die chroot
behandelt Befehl und Sie haben gelernt, den Chroot-Wrapper in sshd
zu verwenden um die sftpusers
zu isolieren Gruppe. Wenn Sie sshd_config
bearbeiten um den Chroot-Wrapper aufzurufen und ihm übereinstimmende Eigenschaften zu geben, sshd
führt bestimmte Befehle innerhalb des Chroot-Gefängnisses oder -Wrappers aus. Sie haben gesehen, wie diese Technik möglicherweise nützlich sein könnte, um einen geschlossenen statt sicheren Zugriff für Remotebenutzer zu implementieren.
Erweitertes Beispiel
Ich beginne damit, das zu erweitern, was ich zuvor getan habe, teilweise als Rückblick. Beginnen Sie mit der Einrichtung eines benutzerdefinierten Verzeichnisses für Remotenutzer. Ich verwende die sftpusers
erneut gruppieren.
Erstellen Sie zunächst das benutzerdefinierte Verzeichnis, das Sie verwenden möchten, und legen Sie die Eigentumsrechte fest:
# mkdir -p /sftpusers/chroot
# chown root:root /sftpusers/chroot
Machen Sie dieses Mal root zum Eigentümer und nicht zu den sftpusers
Gruppe. Auf diese Weise erhalten Nutzer beim Hinzufügen nicht die Berechtigung, das gesamte Verzeichnis anzuzeigen.
Erstellen Sie als Nächstes den Nutzer, den Sie einschränken möchten (in diesem Fall müssen Sie dies für jeden Nutzer tun), und fügen Sie den neuen Nutzer zu den sftpusers
hinzu Gruppe und verweigern eine Anmelde-Shell, weil diese sftp
sind Benutzer:
# useradd sanjay -g sftpusers -s /sbin/nologin
# passwd sanjay
Erstellen Sie dann das Verzeichnis für sanjay
und legen Sie den Besitz und die Berechtigungen fest:
# mkdir /sftpusers/chroot/sanjay
# chown sanjay:sftpusers /sftpusers/chroot/sanjay
# chmod 700 /sftpusers/chroot/sanjay
Bearbeiten Sie als Nächstes die sshd_config
Datei. Kommentieren Sie zuerst den vorhandenen Subsystemaufruf aus und fügen Sie den internen hinzu:
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Fügen Sie dann unseren Match-Case-Eintrag hinzu:
Match Group sftpusers
ChrootDirectory /sftpusers/chroot/
ForceCommand internal-sftp
X11Forwarding no
AllowTCPForwarding no
Beachten Sie, dass Sie wieder ein Verzeichnis angeben, aber dieses Mal haben Sie bereits die Eigentümerschaft festgelegt, um sanjay
zu verhindern davon ab, die Sachen anderer zu sehen. Das nachgestellte /
ist auch wichtig.
Starten Sie dann sshd
neu und testen:
[skipworthy@milo ~]$ sftp sanjay@showme
sanjay@showme's password:
Connected to sanjay@showme.
sftp> ls
sanjay
sftp> pwd
Remote working directory: /
sftp> cd ..
sftp> ls
sanjay
sftp> touch test
Invalid command.
So. Sanjay kann nur seinen eigenen Ordner sehen und muss cd
hinein, um irgendetwas Nützliches zu tun.
Isolieren eines Dienstes oder eines bestimmten Benutzers
Was ist nun, wenn Sie einem Remote-Nutzer eine nutzbare Shell-Umgebung bereitstellen oder eine Chroot-Jail-Umgebung für einen bestimmten Dienst erstellen möchten? Erstellen Sie dazu das Jailed-Verzeichnis und das Root-Dateisystem und erstellen Sie dann Links zu den benötigten Tools und Bibliotheken. All dies ist etwas kompliziert, aber Red Hat stellt ein Skript und grundlegende Anweisungen bereit, die den Vorgang einfacher machen.
Hinweis: Ich habe Folgendes in Red Hat Enterprise Linux 7 und 8 getestet, obwohl ich davon ausgegangen bin, dass diese Funktion in Red Hat Enterprise Linux 6 verfügbar war. Ich habe keinen Grund zu der Annahme, dass dieses Skript in Fedora, CentOS oder anderen nicht funktionieren würde Red Hat-Distribution, aber Ihr Kilometerstand (wie immer) kann variieren.
Erstellen Sie zuerst Ihr Chroot-Verzeichnis:
# mkdir /chroot
Führen Sie dann das Skript von yum
aus das die notwendigen Bits installiert:
# yum --releasever=/ --installroot=/chroot install iputils vim python
Der --releasever=/
Flag übergibt die aktuellen lokalen Release-Informationen, um ein Repo im neuen --installroot
zu initialisieren , definiert, wo sich der neue Installationsort befindet. Theoretisch könnten Sie ein Chroot-Gefängnis erstellen, das auf einer beliebigen Version der yum- oder dnf-Repos basiert (das Skript wird jedoch immer noch mit den aktuellen System-Repos beginnen).
Mit diesem Tool installieren Sie grundlegende Netzwerkdienstprogramme wie den VIM-Editor und Python. Sie könnten zunächst andere Dinge hinzufügen, wenn Sie möchten, einschließlich des Dienstes, den Sie in diesem Gefängnis ausführen möchten. Das ist auch eines der coolen Dinge an yum
und Abhängigkeiten. Als Teil der Abhängigkeitsauflösung yum
nimmt zusammen mit den Bibliotheken die notwendigen Ergänzungen zum Dateisystembaum vor. Es lässt jedoch ein paar Dinge aus, die Sie als nächstes hinzufügen müssen. Darauf komme ich gleich noch.
Inzwischen wurden die Pakete und Abhängigkeiten installiert und ein neuer GPG-Schlüssel für dieses neue Repository in Bezug auf dieses neue Root-Dateisystem erstellt. Hängen Sie als Nächstes Ihre kurzlebigen Dateisysteme ein:
# mount -t proc proc /chroot/proc/
# mount -t sysfs sys /chroot/sys/
Und richten Sie Ihre Entwicklerbindungen ein:
# mount -o bind /dev/pts /chroot/dev/pts
# mount -o bind /dev/pts /chroot/dev/pts
Beachten Sie, dass diese Reittiere nicht überleben einen Neustart auf diese Weise, aber mit dieser Einrichtung können Sie eine Chroot-Gefängnisumgebung testen und damit spielen.
Testen Sie jetzt, ob alles wie erwartet funktioniert:
# chroot /chroot
bash-4.2# ls
bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
Sie können sehen, dass das Dateisystem und die Bibliotheken erfolgreich hinzugefügt wurden:
bash-4.2# pwd
/
bash-4.2# cd ..
Von hier aus sehen Sie den richtigen Stamm und können nicht nach oben navigieren:
bash-4.2# exit
exit
#
Jetzt haben Sie den Chroot-Wrapper beendet, was erwartet wird, weil Sie ihn von einer lokalen Login-Shell als root aufgerufen haben. Normalerweise sollte ein entfernter Benutzer dazu nicht in der Lage sein, wie Sie im sftp
gesehen haben Beispiel:
[skipworthy@milo ~]$ ssh root@showme
root@showme's password:
[root@showme1 ~]# chroot /chroot
bash-4.2#
Beachten Sie, dass diese Verzeichnisse alle von root erstellt wurden, also sind sie der Besitzer. Fügen Sie nun diese Chroot zur sshd_config
hinzu , weil Sie dieses Mal nur diesen Benutzer finden:
Match User leo
ChrootDirectory /chroot
Starten Sie dann sshd
neu .
Sie müssen auch den /etc/passwd
kopieren und /etc/group
Dateien vom Hostsystem in /chroot
Verzeichnis:
[root@showme1 ~]# cp -vf /etc/{passwd,group} /chroot/etc/
Hinweis: Wenn Sie den obigen Schritt überspringen, können Sie sich anmelden, aber das Ergebnis ist unzuverlässig und Sie sind anfällig für Fehler im Zusammenhang mit widersprüchlichen Anmeldungen
Nun zum Test:
[skipworthy@milo ~]$ ssh leo@showme
leo@showme's password:
Last login: Thu Jan 30 19:35:36 2020 from 192.168.0.20
-bash-4.2$ ls
-bash-4.2$ pwd
/home/leo
Es sieht gut aus. Können Sie jetzt etwas Nützliches finden? Lass uns Spaß haben:
[root@showme1 ~]# yum --releasever=/ --installroot=/chroot install httpd
Sie könnten löschen Sie releasever=/
, aber ich lasse das gerne drin, weil es weniger Chancen für unerwartete Ergebnisse lässt.
[root@showme1 ~]# chroot /chroot
bash-4.2# ls /etc/httpd
conf conf.d conf.modules.d logs modules run
bash-4.2# python
Python 2.7.5 (default, Aug 7 2019, 00:51:29)
Also httpd
ist da, wenn Sie es möchten, aber nur um zu demonstrieren, dass Sie einen kurzen Einzeiler von Python verwenden können, das Sie auch installiert haben:
bash-4.2# python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
Und jetzt haben Sie einen einfachen Webserver, der in einem Chroot-Gefängnis läuft. Theoretisch können Sie eine beliebige Anzahl von Diensten innerhalb des Chroot-Gefängnisses ausführen und sie "eingedämmt" und von anderen Diensten fernhalten, sodass Sie nur einen Teil einer größeren Ressourcenumgebung verfügbar machen können, ohne die Erfahrung Ihrer Benutzer zu beeinträchtigen.
Neu bei Linux-Containern? Laden Sie die Einführung zu Containern herunter und lernen Sie die Grundlagen kennen.