Docker Best Practice – Prozess als nicht Root-Benutzer ausführen
Docker Container werden mittlerweile an den unterschiedlichsten Stellen eingesetzt. Es gibt unzählige Use Cases in den Bereichen der Softwareentwicklung und des späteren Betriebs der Programme. Unter anderem auch deswegen, weil es recht einfach ist, ein eigenes Dockerfile zu schreiben, um ein an seine eigenen Bedürfnisse angepasstes Docker Image zu erhalten. Ein Blick in die offizielle Dokumentation lässt aber erahnen, wie umfangreich die Möglichkeiten beim Schreiben eines Dockerfile sind.
Obacht, denn ...
Mit dem folgenden Befehl starten wir den Container:
docker run --name tomcat -d tomcat:9-jdk15-openjdk-buster
Wo ist das Problem?
Auf dem ersten Blick ist alles in Ordnung. Der Container startet durch die Angabe mit -d im Hintergrund. Mit dem nächsten Befehl können wir überprüfen, welche Prozesse im Container laufen.
docker exec -it tomcat ps -ef # Ausgabe: UID PID PPID C STIME TTY TIME CMD root 1 0 1 14:39 ? 00:00:05 /usr/local/openjdk-15/bin/java -
Die Spalte UID gibt an, mit welchem User der Prozess gestartet wurde. Wie erwartet finden wir hier die Angabe des root-Benutzers.
Allerdings entspricht es nicht der feinen englischen Art einen Prozess als root auszuführen. Ein Prozess sollte mit so wenig Rechten ausgestattet sein, wie nur unbedingt notwendig. Dieser Best Practice ist wesentlich älter als Docker selbst. Die Gründe dazu würden den Umfang dieses Posts sprengen. Allerdings versuche ich diese Lehrmeinung in einer lakonische Aussage zu verdichten.
Weniger Rechte, mehr Sicherheit.
nach Maik Krawinkel
FROM tomcat:9-jdk15-openjdk-buster RUN groupadd -r java && \ useradd -r -s /bin/false -g java java && \ chown -R java:java /usr/local/tomcat USER java COPY --chown=java:java <WAR_DATEI_AUF_DEM_HOST> /usr/local/tomcat/webapps/app.war
Als nächstes müssen wir das Image bauen und testen, ob alles geklappt hat. Sofort ist ersichtlich, dass der Prozess nun nicht durch den root-Benutzer gestartet wurde. Das Ziel ist erreicht. Der Tomcat-Prozess läuft nicht mehr mit weitreichenden Rechten, die den root-User auszeichnen.
docker build -t tomcat-ohne-root . docker run --name tomcat-ohne-root -d tomcat-ohne-root docker exec -it tomcat-ohne-root ps -ef # Ausgabe: UID PID PPID C STIME TTY TIME CMD java 1 0 66 15:17 ? 00:00:04 /usr/local/openjdk-15/bin/java -
Senior Chief Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare