Hallo liebe Kuketz-Gemeinde,
ich nenne mich madnuttah, verdiene mein Brot als Linux-/Windows Sysadmin, programmiere gelegentlich dies und das und bin ein vehementer Verfechter von Datenschutz und Privatsphäre. Hier sind wir auch schon beim Thema meines Beitrages unter freundlicher Abstimmung mit Mike.
DNS ist ein äußerst systemkritischer Dienst im Netz. Nun, es gibt eigentlich keinen Dienst oder kein OS welches nicht ständig gepflegt, den aktuellen Gegebenheiten angepasst und auf dem neuesten Stand gehalten werden muss, um die bestmögliche Sicherheit einer Infrastruktur aufrechtzuerhalten. „Never touch a running system…“ ist eine Weisheit aus besseren Tagen, einer Zeit in der Komfort der Sicherheit überwog; als man sich noch nicht bewusst war, wie eine sich gerade etablierende und zu diesem Zeitpunkt relativ harmlose und nützliche Technologie in wenigen Jahren zur Waffe, die sich auch gegen einen selbst richten könnte, werden kann.
Ich fing irgendwann an mich für Pi-hole zu interessieren und fuchste mich in das Docker cli rein. Soweit lief alles super, allerdings machten die DNS Server meines Internetproviders fast wöchentlich Schwierigkeiten. Anfangs dachte ich es die Schuld läge bei Pi-hole und fand dann heraus, das teilweise die mir zugewiesenen Namensserver öfter einfach unerreichbar waren. Auf meiner Suche nach DNS Resolver Docker Images bin ich auf Unbound gestoßen und hatte mich dann für ein besonders populäres Image entschieden. Weil Sternchen auf Docker Hub und GitHub…
Ich passte meine Config auf „rekursiv“ an (hatte seinerzeit bei Mike eine Anleitung gefunden, Stichwort ‚hyperlokal‘) und nutzte seither meinen eigenen rekursiven DNS Resolver.
Es ist nun etwas mehr als 2 Jahre her als ich mich über die schlechte Pflege und die Größe des von mir verwendeten Unbound-Docker-Images zugegebenermaßen recht geärgert habe. Es gab Buildbases mit Alpine, warum benötigt man heutzutage Images mit zum Teil weit mehr als 100MB Zeugs was angegriffen und kompromittiert werden kann? Warum nutze ich ein Image von irgendjemanden den ich nicht mal kannte, geschweige mein Vertrauen schenken würde?
Warum zum Geier kannte ich mich nicht mit dem Bauen von Abbildern unter Docker aus?
Ich studierte etliche Websites und schaute mir verschiedene Images an und stellte fest, das dies absolut keine Kobayashi-Maru-Mission war, insbesondere das Bauen des Images mittels Workflow was bedeutete, die Images konnten online direkt von einer Action auf GitHub und nicht bei mir zuhause im stillen Kämmerlein gebaut werden! Ich wollte das auch den Menschen bereitstellen. Ich begann via Pipelined Workflow Images für 386, arm, arm64, amd64 bereitzustellen und gewann etwas Aufmerksamkeit weil mich nette Menschen wie Mike mein im Sinne des Idealismus gefertigten Images, ganz ohne monetäre Interessen auf ihren Portalen so freundlich eingeladen bewerben lassen.
Es erforderte etwas Trial & Error bis es zu meiner Zufriedenheit lief.
Neben den üblichen Updates und Pflege des Images dümpelte es bis kurz vorm Release von Unbound 1.19.1 so vor sich hin. Genau bis bis zu dem Zeitpunk, an dem mich ein aufmerksamer GitHub User darauf hinwies, dass das Image keine sichere Chroot-Umgebung bereitstellen konnte, was ich ausdrücklich als besonders sicheres Feature in der Beschreibung meines Images hervorgehoben hatte. Mein Wort zählt! Das fühlte sich wie ein Schlag in die Magengrube an. Ich konnte das natürlich nicht so lassen und prüfte meine Optionen:
a: Image so wie es ist umbauen
b: Image komplett auf „Distroless“ umstellen
c: Aufgeben
c: gibt’s nicht, hat’s noch nie gegeben. Es hatten ja schon viele das Image installiert und nutzten es. Mir fiel auf, dass ich beim Buildvorgang den Ordner /unbound/etc löschte. Naja, da konnte halt auch kein Chroot greifen. Doof. Soweit lief es nach weiteren Anpassungen wieder in meiner Umgebung aber ich schielte schon seit langem in richtung Distroless Image unter Alpine (das widerspricht sich irgendwie, ich weiß) mit meinen gewohnten und angepassten Dockerfiles. Das war die Gelegenheit, alles komplett neu anzugehen und auch die Anregungen des aufmerksamen Users umzusetzen. Distroless mit einer niedrigst möglichen Angriffsfläche! Ja, es gab viel zu tun, denn auch der Healthcheck hatte so seine Probleme…
Was ich euch heute hier vorstellen möchte, ist wohl aktuell das innovativste und fortschrittlichste Unbound-Docker Image was zur Verfügung steht - mit viel Liebe zum Detail nach den Prinzipien der „Best Practice“ modelliert. Bei gerade einmal 10MB komprimierten Download, aktuell in der Version 1.19.1-6.
Features:
- Distroless
- Unprivilegierter Benutzer
- Unprivilegierter Port
- Frei konfigurierbare UID/GID (!)
- Libevent
- DNSSEC
- DNSCrypt
- DNSTap
- DNS64
- DNS over HTTPS
- DNS over TLS
- Vorbereitet für DoQ
- Redis (!)
- Optionaler, aussagekräftiger Healthcheck (!)
- Optionale Statistiken mit Zabbix und Grafana (!)
Falls ihr Unbound einsetzt, nutzt unbedingt Redis. Und dann am besten auch noch via Unix Socket. Mopsgeschwindigkeit!
Pi-hole habt ihr sicher schon und ich muss auch nicht noch davon schwärmen, oder?
Falls ihr Statistiken mögt, schaut euch mein Begleitprojekt Unbound Statistics an, welches mit Bordmitteln Unbound-Statistiken via Zabbix Active Agent an Zabbix überträgt und anschließend stressfrei in Grafana dargestellt werden können:
In den letzten Tagen habe ich die Pipeline umgestellt, sodass sie via meines Bots ‚madnuttah-bot‘ bei einem Update von Unbound automatisch geupdated, auf Docker Hub gepusht und das GitHub-Repo meinen strengen Sicherheitsrichtlinien entsprechend komplett automatisiert aktualisiert und signiert wird.
Ich freue mich auf eure Meinung und auch auf eure konstruktive Kritik. Wir als Entwickler sind um solche aufmerksamen Benutzer dankbar, nur so sind Verbesserungen und Veränderungen möglich. Damit Dinge entstehen können, die weitaus besser werden als man es selbst für machbar gehalten hätte.
https://github.com/madnuttah/unbound-docker
Danke Mike, dein Blog ist schon seit etlichen Jahren eine wichtige Anlaufstelle für mich.
Liebe Grüße und sorry für die Textwand. Wie man liest, bin ich es gewohnt ausführliche Dokumentationen zu schreiben.
Edit: Rechtschreibung