‫Nächste.
‫Dies ist eine große.
‫Führen Sie Ihre Apps nicht als root im Container aus, wenn Sie
‫dies vermeiden können.
‫Wenn ich das ganz schnell mache, auf einer kleinen
‫Demo hier.
‫Gut. Ich muss Docker zum Laufen bringen, zumindest
‫sollte ich das tun. Gut.
‫Und wenn ich nur renne ...
‫Wenn ich nur Nginx laufen lasse, mache ich
‫einen Docker oben auf
‫dem Container.
‫Was sehen wir hier?
‫Im Container hat Nginx einen Prozess im Stammverzeichnis
‫gestartet und anschließend einen neuen Prozess als
‫Benutzer ohne Rootberechtigung erstellt.
‫Sehen Sie, wie dieser Benutzer 101 ist.
‫Dies ist häufig bei vielen Daemon-basierten Programmen wie MySQL, Postgres
‫und Nginx der Fall.
‫Viele von ihnen, die keine Programmiersprachen sind, tun
‫dies automatisch. Das ist also sicher.
‫Damit kann Nginx Worker-Prozesse auslösen, die nicht
‫als Root ausgeführt werden, um den
‫Großteil der Arbeit zu erledigen.
‫Sie haben also einen Master-Prozess, der als Root ausgeführt wird, aber das
‫ist es nicht, was Verbindungen akzeptiert und den größten Teil
‫der Arbeit erledigt. Das meiste
‫davon findet in diesen Arbeitsprozessen statt. Sie werden als normaler
‫Benutzer ausgeführt. Wenn also eine Sicherheitslücke in Nginx
‫besteht, die Wahrscheinlichkeit besteht, dass
‫eingehende Verbindungen eingehen und jemand versucht, das
‫Nginx-HTTP-Protokoll auszunutzen, wird es bei diesem Benutzer gesperrt oder
‫eingesperrt. . die meiste Zeit, es sei denn,
‫es gibt eine ernsthafte Sicherheitslücke, die hier oben ist.
‫Hier unten sind sie dann auf das beschränkt, was
‫sie können, richtig. Selbst wenn sie diesen Prozess
‫irgendwie übernehmen würden, sind sie als Benutzer immer noch eingeschränkt.
‫Das ist also in Ordnung.
‫Dies läuft immer noch nicht als echte
‫Wurzel im Container. Worüber ich wirklich spreche, ist,
‫wenn Sie eine Python-App
‫oder eine Node-App oder etwas Ähnliches
‫ausführen, bei dem es sich um eine Programmiersprache handelt, dann
‫ist dies standardmäßig root, da die Programmiersprache
‫im Container nicht funktioniert. ' Ich weiß nicht, wie
‫Ihr Programm funktioniert. Es weiß nicht, was Sie wollen.
‫Es wird also standardmäßig als Root ausgeführt, und
‫das ist eher die Anwendungskompatibilität.
‫Wir könnten sagen, dass dies standardmäßig sicher sein soll, aber
‫Docker hat sich dafür entschieden, dass all diese offiziellen Container wirklich als
‫Root für die Programmiersprachen ausgeführt werden.
‫Lassen Sie uns das überprüfen.
‫Hoppla. Das nicht.
‫Feuerfuchs.
‫Also, wenn wir gehen, sagen wir mal zu Hub.
‫Lass uns einfach Node machen.
‫Dies ist in den meisten Sprachen üblich.
‫Ich werde nur Node als Beispiel auswählen.
‫Innerhalb von
‫Node, wenn ich hier in eine der Dockerdateien gehe.
‫Dann suche ich nach User.
‫Sie werden feststellen, dass ich eigentlich nichts finde.
‫Es ist nur dieser Benutzer, der hier hinzufügt.
‫Sie werden feststellen, dass dies richtig ist.
‫Technisch wird eine Gruppe mit dem Namen "Knoten" und ein Benutzer
‫mit dem Namen "Knoten" hinzugefügt.
‫Wenn Sie den Rest dieser Datei durchsuchen, stellen Sie fest, dass sie sich
‫niemals in diesem Benutzer mit der Zeilengruppe U S E
‫R ändert, richtig.
‫Sie sollten den Benutzerknoten dort irgendwo als Linie sehen.
‫Sie machen das nicht, weil das dein Job ist.
‫Also, was solltest du in deinem
‫Dockerfile machen? Daher sollten Sie
‫bei jeder Docker-Datei, die Sie aus
‫diesen offiziellen Images für Programmiersprachen erstellen, die Benutzer ausnutzen,
‫die sie für Sie erstellen. Wenn diese Benutzer nicht erstellt werden, können Sie sie
‫auf die gleiche Weise selbst erstellen. Sie können dieses
‫kleine zweizeilige Ding einfach stehlen und zu dem Benutzer
‫wechseln, den Sie möchten. Wenn es für Python
‫ist, können Sie es auch Python-Benutzer nennen.
‫In diesem Fall werden die von
‫Ihnen ausgeführten Anwendungen nicht als Root im Container
‫ausgeführt. Wenn
‫Sie nur eine Standard-Node-App ausführen, wird standardmäßig der Root-Benutzer in
‫einem Container verwendet.
‫Warum ist das so wichtig?
‫Nun, zwei Dinge.
‫Zum einen, wenn jemand in der Lage ist, Ihre Anwendung zu
‫durchbrechen und sich in Ihre Anwendung zu hacken und Zugriff auf das
‫Dateisystem zu erhalten, wenn er ... Wenn diese Anwendung root ist,
‫können sie im Container tun, was sie
‫wollen, richtig. Sie können Dateien
‫in das Dateisystem schreiben. Sie können mehr Programme in diesem
‫Container installieren, die ausgeführt werden können, wann immer sie wollen.
‫Also wollen wir wirklich nicht, dass sie das tun.
‫Wir möchten, dass sie sehr begrenzt sind.
‫Wenn Ihre Anwendungen dies unterstützen,
‫tun Sie dies. Grundsätzlich stellen Sie sicher, dass Sie den
‫Benutzer zur Verfügung haben.
‫Dann habe ich hier ein Beispiel von DockerCon.
‫Auf der DockerCon hatte ich einen ganzen Vortrag über Node. js, und eines
‫der Themen war auf den Benutzer.
‫Mal sehen, ob ich das finde.
‫Sehen Sie, was ich hier gemacht habe? Es ist eine ziemlich einfache Datei.
‫Ich werde dies verlinken und es einfügen.
‫In diesem Dockerfile.
‫Also, in dieser Dockerfile habe ich ...
‫Ich habe keinen Benutzer erstellt, da das Node-Image es
‫bereits für mich erstellt hat. Ich wechsle nur zum Benutzerknoten.
‫Dann installiere ich meine Pakete mit diesen beiden Zeilen und später
‫werde ich es ausführen.
‫Sie werden feststellen, dass ich die
‫Option chown in meinen Kopierbefehlen verwenden muss, um sicherzustellen, dass meine Dateien
‫jetzt derselbe Benutzer sind wie der Benutzer, unter dem mein Programm
‫ausgeführt wird. Ansonsten könnte es Probleme geben,
‫richtig. Meine Bewerbung wahrscheinlich ... Wenn
‫die Dateien nicht gelesen werden können, kann sie nicht ausgeführt werden.
‫Also, ich brauche die Änderungen dieser Berechtigungen.
‫Ich kann das mit einem Einzeiler auf einen Kopierbefehl machen.
‫Hier oben sehen Sie auch, dass ich das Verzeichnis
‫erstelle und es auch aufrufe, damit ich bei jedem
‫Kopieren der App sicherstellen möchte, dass die Berechtigungen
‫vorhanden sind, damit sie schreiben können.
‫Da in dem Moment, in dem ich diesen
‫Benutzer ändere, dieser Kopierbefehl oder speziell dieser Ausführungsbefehl als dieser Benutzer
‫ausgeführt wird. Wenn es nicht berechtigt
‫ist, in die Verzeichnisse zu schreiben, schlägt dies ebenfalls fehl.
‫Der Grund, warum Docker dies nicht für Sie tut, ist, dass sie
‫wissen, dass Ihre Sachen wahrscheinlich kaputt gehen werden.
‫Sie müssen also diese zusätzlichen Schritte ausführen.
‫Aber es ist nicht so schwer. Wirklich nicht.
‫Wahrscheinlich können Sie all diese Tests an einem Tag
‫durchführen, und dann möchten Sie Ihre Systeme mit vollem
‫CI und vollständigen Tests auf Ihren Servern ausführen, da PHP
‫manchmal einer der Fehler ist.
‫PHP führt gerne eine Reihe von Protokolldateien aus und schreibt eine Reihe
‫von Daten auf die Festplatte.
‫Alles, was Benutzer-Uploads zulässt, wird auf die
‫Festplatte geschrieben. Sie müssen also
‫sicherstellen, dass diese Berechtigungen korrekt sind, damit beim Schreiben von Dateien
‫beispielsweise ein WordPress-Blog erstellt wird.
‫Dieses WordPress-Blog wird auf die Festplatte geschrieben, wenn Benutzer
‫Bilder in ihr Blog hochladen.
‫Sie möchten sicherstellen, dass diese Berechtigungen funktionieren.
‫Sie müssen also auf jeden Fall einige Tests durchführen.
‫Sobald Sie dies getan haben, wird Ihre Anwendung nicht
‫mehr als root ausgeführt. Es kann also nicht die volle
‫Kontrolle über den Container haben. Der andere Grund,
‫warum Sie dies tun möchten, besteht darin, dass
‫die Wahrscheinlichkeit, dass sie aus diesem Container ausbrechen, geringer
‫ist, wenn Linux eine seltene oder Docker eine
‫sehr seltene Sicherheitslücke aufweist. Das ist nur ein Mal passiert,
‫das mir sehr bewusst ist, und ich habe tatsächlich ein bisschen davon
‫hier unten dokumentiert.
‫Schmutzige Kuh. Dirty COW war
‫eine Sicherheitslücke in Linux, mit der Sie
‫einen
‫Container verlassen konnten. Das Ändern Ihres Benutzers hier
‫würde nicht unbedingt
‫das gesamte Problem lösen, aber es
‫hat diesem Problem sicherlich nicht geschadet.
‫Andere Schwachstellen würde es wahrscheinlich abwehren.
‫Dies ist jedoch eine bewährte Methode.
‫Ich denke, wenn Sie ein Sicherheitsteam haben, werden
‫sie darauf bestehen, dass Sie die Dinge nicht als root ausführen.
‫Das würdest du also
‫tun.