Infrastructure as secure code

Im Rahmen meiner Abschlussarbeit habe ich mich damit beschäftigt den Code des Konfigurationsmanagementsystems Puppet automatisiert auf unsichere Praktiken zu analysieren. Herausgekommen ist ein puppet-lint Plugin zur Prüfung von Puppetcode aus mögliche Sicherheitsrisiken.

Das Plugin steht auf rubygems.org zur Verfügung. Der Quellcode ist auf Github verfügbar. Die eingebauten Sicherheitschecks sind als Basis zu verstehen und sollten auf die eigenen Bedürfnisse angepasst werden. Gerne können und sollten weitere Checks eingebaut werden.

Gem Version

Nun noch ein paar Hintergrundinfos.

Fork me on GitHub

Statische Codeanalyse

Im Bereich des Betriebes von Serversystemen, insbesondere im Linux / Unix Umfeld, werden Tools für das Konfigurationsmanagement, wie z.B. Puppet, CFEngine oder Chef eingesetzt. Hierdurch erfolgt die Konfiguration und Bereitstellung von Rechnerkapazitäten nicht mehr manuell, sondern automatisiert und reproduzierbar auf einer Vielzahl von Systemen in gleicher Qualität. Der Administrator schreibt hierzu Regeln, die der Programmierung in einer Programmiersprache ähneln (Stichwort “DevOps”), und rollt diese auf Serversysteme aus.

Es ist im Zuge der massiven Nutzung von Software im Internet und der damit verbundenen Angriffsfläche, essentiell auf Sicherheit bereits beim Schreiben von Code zu achten. In der klassischen Softwareentwicklung sind hierzu bereits Methoden etabliert, die einen Großteil von Sicherheitsproblemen von Anfang an vermeiden, indem z.B. bereits während der Konzeption auf eine sichere Softwarearchitektur geachtet wird. In modernen Entwicklungspipelines, wie z.B. Jenkins, können Quality Gates eingebaut werden, um Unzulänglichkeiten in der Software zu erkennen und den produktiven Einsatz von fehlerhaften Code in diesem Fall zu vermeiden.  Sourcecode kann automatisiert anhand von Regelsätzen analysiert werden. Entspricht der Code nicht den geforderten Kriterien, wird dieser abgewiesen. Ähnliche Sicherheitsrisiken bestehen auch bei der Entwicklung von Systemumgebungen in Konfigurationsmanagementsystemen.

puppet-lint

Für die automatisierte Codeanalyse von Puppet bietet puppet-lint eine gute Basis und eine API-Schnittstelle für die Entwicklung eigener Plugins. Die API die puppet-lint für die Entwicklung eigener Plugins zur Verfügung stellt, bietet verschiedene Methoden und Objekte, die den Zugriff auf die einzelnen Elemente von Puppet-Code erleichtern. Ein neues Plugin wird als Subklasse der Klasse “PuppetLint::CheckPlugin” erzeugt und erbt somit einige Methoden, die im Folgen- den kurz beschrieben werden. Die Logik für den Check selbst muss in einer Methode “check” entwickelt werden. Diese wird von puppet-lint bei der Prüfung des Codes ausgeführt und erzeugt entsprechende Warnungen oder Fehler. Optional kann auch eine Methode “fix” zur Verfügung gestellt werden, die, falls möglich, die Probleme im Sourcecode behebt.

Schreibe einen Kommentar