Der Begriff Chroot-Gefängnis wurde erstmals 1992 in einem Artikel des prominenten Sicherheitsforschers Bill Cheswick verwendet (was interessant ist, wenn Sie sich für so etwas interessieren, Sie können den Artikel hier finden). Chroot-Jails tauchten erstmals 2003 auf, mit Anwendungen wie IRC und FTP. Im Jahr 2005 führte Sun seine „Container“-Technologie namens Zones ein, die wiederum ein Vorläufer des Konzepts der Namespaces war , eine Kerntechnologie, die mit Containern verwendet wird.
Chroot-Grundlagen
Chroot ermöglicht es einem Administrator, den Zugriff auf einen Dienst oder ein Dateisystem zu kontrollieren und gleichzeitig die Exposition gegenüber der zugrunde liegenden Serverumgebung zu kontrollieren. Die beiden häufigsten Beispiele, auf die Sie stoßen könnten, sind während der Startsequenz und der „Notfall-Shell“ auf Red Hat/CentOS/Fedora-Systemen und in Secure FTP (SFTP).
Der Befehl sieht folgendermaßen aus:
chroot <newroot> [[command][arguments]]
Ähnlich dem sudo
Befehl, der chroot
Der Befehl ändert die Umgebung des folgenden Befehls. Mit anderen Worten, es wird Sie zum newroot
ändern Verzeichnis und macht dieses Verzeichnis auch zum "Arbeitsverzeichnis". Der command
wird dann an diesem Ort ausgeführt, was nützlich ist, um beispielsweise ein System zu retten, das nicht bootet.
Im Gegensatz zu sudo
, befinden Sie sich im Verzeichnis. Auch diese Vorgehensweise ist nützlich, wenn Sie von externen Medien booten, aber auf ein "lokales" Dateisystem oder einen Befehl zugreifen müssen, um zu arbeiten.
Die andere häufige Verwendung von chroot
besteht darin, einen Dienst oder Benutzer durch die Verwendung eines Wrappers einzuschränken um den Rest des Dateisystems zu verbergen und somit die Sicht eines entfernten Benutzers auf die Daten anderer Benutzer einzuschränken. Eine beliebte Implementierung, die diesen Ansatz verwendet, ist SFTP.
Beispiel
Bevor Sie dieses Beispiel durcharbeiten, sollten Sie sicherstellen, dass Sie Sicherungskopien haben. Sichern Sie in diesem Fall die /etc/ssh/sshd_config
Datei, weil Sie speziell an dieser Datei Änderungen vornehmen werden:
[root@showme1 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
Vorerst beschränken Sie SFTP-Nutzer nur auf ihre Basisverzeichnisse auf dem Server. Diese Anforderung bedeutet, dass Sie Benutzer hinzufügen und sie einer Gruppe zuordnen müssen:
[root@showme1 ~]# useradd -g sftpusers -s /sbin/nologin -p nick nick
Beachten Sie, dass dadurch nick
zugewiesen wird ein Konto ohne Login-Shell. Diese Technik ist sowohl praktisch als auch eine gute Sicherheitspraxis:Wenn er nur SFTP verwendet, sollte er keine Anmeldeberechtigungen haben. Ich werde die Bereitstellung einer Shell für entfernte Benutzer im nächsten Artikel besprechen.
Jetzt müssen Sie ssh
mitteilen service, was zu tun ist, wenn sich SFTP-Benutzer anmelden. Öffnen Sie die Datei /etc/ssh/sshd_config
Datei und fügen Sie am Ende Folgendes hinzu:
Subsystem sftp internal-sftp
Match Group sftpusers
ForceCommand internal-sftp
ChrootDirectory /home
X11Forwarding no
AllowTcpForwarding no
Es ist wichtig, dass Sie diese Einstellungen als separate Einträge hinzufügen und den Match
verwenden Syntax, um anzugeben, dass dieser Abschnitt nur ist gilt für Benutzer in dieser Gruppe. Wenn Sie die Änderungen an den vorhandenen Einträgen vornehmen, gelten sie für alle SSH-Nutzer, die den Fernzugriff unterbrechen könnten.
Die Konfigurationszeilen gliedern sich wie folgt:
- Der
ForceCommand
machtssh
Wählen Sie die integrierte Funktion zur Bereitstellung des SFTP-Dienstes aus (die Sie unabhängig steuern können). ChrootDirectory
sagtsshd
wo der Benutzer eingeschränkt werden soll.Subsystem sftp internal-sftp
sagtsshd
um das internesftp
zu laden Service und zur Verfügung stellen.
Möglicherweise müssen Sie sicherstellen, dass dieses Subsystem
ist nicht bereits durch Auskommentieren dieser Zeile weiter oben in der Konfigurationsdatei definiert:
# override default of no subsystems
# Subsystem sftp /usr/libexec/openssh/sftp-server
Sobald Sie die Änderungen vorgenommen und die Rechtschreibung überprüft haben, fahren Sie fort und speichern Sie die Änderungen. Starten Sie dann sshd
neu :
[root@showme1 ~]# systemctl restart sshd
Testen Sie den neuen Benutzer:
[skipworthy@milo ~]$ sftp nick@showme
nick@showme's password:
Connected to nick@showme.
sftp> ls
accounting ansible fred jason kenny lisa
nick
sftp> pwd
Remote working directory: /
sftp> exit
Hoppla, warten Sie einen Moment:Anscheinend können Sie auch alle Verzeichnisse der anderen Nutzer sehen. Sie können jedoch nicht zu diesen Verzeichnissen navigieren:
sftp> cd fred
sftp> ls
remote readdir("/fred"): Permission denied
Sie können den Chroot-Benutzer zu seinem eigenen Home-Verzeichnis leiten, indem Sie das ChrootDirectory
ändern Zeile in der sshd_config
Datei wie folgt:
ChrootDirectory /
Diese schnelle Änderung lässt es für Nick so aussehen, als wäre er in seinem eigenen Home-Verzeichnis und er kann die Dateien anderer Benutzer nicht sehen:
sftp> pwd
Remote working directory: /home/nick
sftp>
sftp> exit
[skipworthy@milo ~]$ touch test.txt
[skipworthy@milo ~]$ sftp nick@showme
nick@showme's password:
Connected to nick@showme.
sftp> put test.txt
Uploading test.txt to /home/nick/test.txt
test.txt 100% 0 0.0KB/s 00:00
sftp> ls
test.txt
sftp>
Wo ist es hin? Sehen Sie sich das an:
[root@showme1 ~]# ls /home/nick
test.txt
Beachten Sie, dass ein chroot jail
ist nicht selbst als angemessene Sicherheitsbeschränkung angesehen. Während es einen Benutzer daran hindert, ein eingeschränktes Verzeichnis zu verlassen, gibt es Möglichkeiten, dies zu umgehen (die allgemeine Idee wird in chroot(2)
erwähnt Manpage, die Sie sich ansehen sollten, wenn Sie erwägen, diesen Trick in einem produktions- oder geschäftskritischen Kontext einzusetzen.)
Abschluss (vorerst)
Sie können also diese chroot
sehen kann ein ziemlich nützliches Werkzeug sein. In Teil 2 werde ich mich mehr damit befassen, Benutzern bestimmte Verzeichnisse zuzuweisen und einem entfernten Benutzer eine Shell-Umgebung bereitzustellen, ohne den Rest des Servers offenzulegen.
Neu bei Containern? Laden Sie die Einführung zu Containern herunter und lernen Sie die Grundlagen von Linux-Containern kennen.