Systemd Hardening Workshop: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 185: | Zeile 185: | ||
#Secure Features | #Secure Features | ||
| + | SystemCallFilter=yes | ||
IPAddressAllow=10.0.10.0/24 | IPAddressAllow=10.0.10.0/24 | ||
RestrictSUIDSGID=true | RestrictSUIDSGID=true | ||
Version vom 12. Januar 2023, 18:29 Uhr
Vorwort
- In diesem Workshop geht es darum einen systemd Dienst sicherer zumachen
Debuggen
- Wir benutzen hierzu systemd-analyze
- Dieses Tool analysiert die Sicherheit und die Sandboxing-Einstellungen der Dienste.
- Der Befehl prüft auf verschiedene sicherheitsrelevante Diensteinstellungen
- Er weist jeder einen numerischen „Exposure Level“-Wert zu, je nachdem, wie wichtig die Einstellung ist.
- Anschließend berechnet es ein Gesamtexpositionsniveau für die gesamte Einheit durch eine Schätzung
- Diese lieht im Bereich von 0,0 bis 10,0, die uns sagt, wie exponiert ein Dienst sicherheitstechnisch ist.
- systemd-analyze security
UNIT EXPOSURE PREDICATE HAPPY cron.service 9.6 UNSAFE 😨 dbus.service 9.6 UNSAFE 😨 emergency.service 9.5 UNSAFE 😨 getty@tty1.service 9.6 UNSAFE 😨 rc-local.service 9.6 UNSAFE 😨 rescue.service 9.5 UNSAFE 😨 rsyslog.service 9.6 UNSAFE 😨 ssh.service 9.6 UNSAFE 😨 strongswan-starter.service 9.6 UNSAFE 😨 systemd-ask-password-console.service 9.4 UNSAFE 😨 systemd-ask-password-wall.service 9.4 UNSAFE 😨 systemd-fsckd.service 9.5 UNSAFE 😨 systemd-initctl.service 9.4 UNSAFE 😨 systemd-journald.service 4.3 OK 🙂 systemd-logind.service 2.6 OK 🙂 systemd-networkd.service 2.9 OK 🙂 systemd-timesyncd.service 2.1 OK 🙂 systemd-udevd.service 8.0 EXPOSED 🙁 user@0.service 9.8 UNSAFE 😨 user@1000.service 9.4 UNSAFE 😨 webserver.service 9.6 UNSAFE 😨
Vorgehensweise
- Wir können nun Schritt für Schritt die Verbesserungen überprüfen, die an unserem systemd-Dienst vorgenommen wurden.
- Wie Sie sehen können, sind jetzt mehrere Dienste als UNSAFE gekennzeichnet, was wahrscheinlich daran liegt, dass nicht alle Anwendungen die von systemd bereitgestellten Funktionen anwenden.
Einstieg
- Beginnen wir mit einem einfachen Beispiel.
- Wir wollen eine systemd-Unit erstellen, um den Befehl python3 -m http.server als Dienst zu starten:
[Unit] Description=Simple Http Server Documentation=https://docs.python.org/3/library/http.server.html [Service] Type=simple ExecStart=/usr/bin/python3 -m http.server ExecStop=/bin/kill -9 $MAINPID [Install] WantedBy=multi-user.target
- Wir speichern diese Datei unter /etc/systemd/system/simplehttp.service ab
Überprüfung
- systemd-analyze security | grep simp
simplehttp.service 9.6 UNSAFE 😨
PrivateTmp
- Es erstellt einen Dateisystem-Namensraum unter /tmp/systemd-private-*-[Unit-Name]-*/tmp
- Dies wird anstelle eines gemeinsam genutzten /tmp oder /var/tmp benutzt.
- Viele der mit Red Hat Enterprise Linux veröffentlichten Unit-Dateien enthalten diese Einstellung.
- Dies entfernt die eine ganze Klasse von Schwachstellen im Zusammenhang mit der Vorhersage und Ersetzung von Dateien entfernt, die in /tmp verwendet werden.
Die Änderung
[Unit] Description=Simple Http Server Documentation=https://docs.python.org/3/library/http.server.html [Service] Type=simple ExecStart=/usr/bin/python3 -m http.server ExecStop=/bin/kill -9 $MAINPID #Secure Features PrivateTmp=yes [Install] WantedBy=multi-user.target
Neu einlesen und restart
- systemctl daemon-reload && systemctl restart simplehttp.service
Neue Untersuchung
- systemd-analyze security | grep simp
simplehttp.service 9.2 UNSAFE 😨
- Der Wert hat sich von 9.6 auf 9.2 verbessert
NoNewPrivileges
- Es verhindert, dass der Dienst und zugehörige untergeordnete Prozesse Berechtigungen eskalieren.
NoNewPrivileges=true
- Automatisches Editieren
SECURE='NoNewPrivileges=true'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 9.0 UNSAFE 😨
Namensräume einschränken
- Es begrenzt alle oder eine Teilmenge von Namespaces auf den Dienst.
- Die Direktive akzeptiert cgroup, ipc, net, mnt, pid, user und uts.
RestrictNamespaces=uts ipc pid user cgroup
- Wie Sie oben sehen können, wurde der net-Namespace nicht festgelegt, da sich der Dienst an eine Netzwerkschnittstelle binden muss.
- Das Isolieren von net von einem Netzwerkdienst macht es nutzlos.
- SECURE='RestrictNamespaces=uts ipc pid user cgroup'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 8.9 EXPOSED 🙁
ProtectSystem=strict
- SECURE='ProtectSystem=strict'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 8.7 EXPOSED 🙁
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH
- SECURE='CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 6.5 MEDIUM 😐
ProtectKernelTunables=yes
- SECURE='ProtectKernelTunables=yes'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 6.3 MEDIUM 😐
ProtectKernelModules=yes
- SECURE='ProtectKernelModules=yes'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 6.1 MEDIUM 😐
ProtectControlGroups=yes
- SECURE='ProtectControlGroups=yes'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 5.9 MEDIUM 😐
PrivateDevices=yes
- SECURE='PrivateDevices=yes'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 5.6 MEDIUM 😐
RestrictSUIDSGID=true
- SECURE='RestrictSUIDSGID=true'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 5.4 MEDIUM 😐
IPAddressAllow=10.0.10.0/24
- SECURE='IPAddressAllow=10.0.10.0/24'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 5.4 MEDIUM 😐
SystemCallFilter=yes
- SECURE='SystemCallFilter=yes'
- sed -ie "/#Secure Features/a$SECURE" /etc/systemd/system/simplehttp.service
- systemctl daemon-reload && systemctl restart simplehttp.service
- systemd-analyze security | grep simp
simplehttp.service 5.4 MEDIUM 😐
Ergebnis
[Unit] Description=Simple Http Server Documentation=https://docs.python.org/3/library/http.server.html [Service] Type=simple ExecStart=/usr/bin/python3 -m http.server ExecStop=/bin/kill -9 $MAINPID #Secure Features SystemCallFilter=yes IPAddressAllow=10.0.10.0/24 RestrictSUIDSGID=true PrivateDevices=yes ProtectControlGroups=yes ProtectKernelModules=yes ProtectKernelTunables=yes CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH ProtectSystem=strict RestrictNamespaces=uts ipc pid user cgroup NoNewPrivileges=true PrivateTmp=yes [Install] WantedBy=multi-user.target