Custom Policies für Mondoo schreiben


Bicycle

Mondoo-Check-Ergebnisse aus dem letzten Beitrag

Dies ist der zweite Post in einer Serie über IT-Compliance mit Mondoo. In diesem Beitrag geht es darum, wie Sie Ihre eigenen benutzerdefinierten Policies zu Mondoo hinzufügen können.

Lesen Sie unbedingt den vorherigen Post bevor Sie diesen hier lesen. Er wird Sie mit Mondoo und der Infrastruktur vertraut machen, für die wir eine Policy schreiben werden.

Um dies zu veranschaulichen, werden wir eine Policy schreiben, die nach Attributen der zuvor installierten NodeJS-App sucht.

Die NodeJS-App

Hier sind die wichtigen Fakten zu dieser App:

  • Wir müssen die Nginx-, NodeJS- und NPM-Pakete auf der VM installiert haben
  • Wir verwenden nginx als Proxy für die nodejs-App. Weiterleiten des NodeJS-Ports 3000 an 80
  • Die Nginx-Site ist in der Datei /etc/nginx/sites-available/default konfiguriert.
  • Der Code der NodeJS-App befindet sich in der Datei /home/adminuser/myapp/index.js

Wenn die App ausgeführt wird, gibt sie einfach eine Begrüßungsnachricht zurück:

1$ curl <IP-ADDRESS-OF-YOUR-VM>
2Hello World from host mondoo-demo-webserver-non-compliant!

Was ist eine Policy?

Policies, zu Deutsch "Richtlinien", sind die Spezifikationen, die cnspec verwendet, wenn ein System gescannt wird. Stellen Sie sich eine Policy als eine Checkliste vor, auf die sich cnspec stützt, um sicherzustellen, dass ein System konform ist. In Mondoo und cnspec werden diese Sammlungen von Compliance-Anforderungen als gut lesbarer Code ausgedrückt. Ein Beispiel für eine Policy könnte sein: "Port 22 sollte immer offen sein".

Mehr zum Thema Policies gibt es hier.

Mondoo Query Language

Um die Regeln unserer Policy auszudrücken, müssen wir sie in einer Sprache verfassen, die Mondoo verstehen kann. Diese Sprache wird Mondoo Query Language oder kurz mql genannt.

So würde eine Abfrage für das SSH-Port-Beispiel aussehen:

1ports.listening.any( port == 22 )

Sie können jede Abfrage lokal testen, indem Sie die Shell cnspec verwenden:

1$ cnspec shell local
2cnspec> ports.listening.any( port == 22 )
3[ok] value: true

Um diese Abfragen nutzen zu können, müssen wir sie in eine Policy-Datei einfügen.

Eine benutzerdefinierte Policy schreiben

Das Schreiben von benutzerdefinierten Policies für Mondoo ist recht einfach. Alle Informationen werden in einer YAML-Datei gespeichert. Wir nennen eine Datei, die Policies sammelt, in Mondoo ein "Policy Bundle". Sobald die Datei geschrieben ist, können wir sie auf Mondoo hochladen und sie bei jedem Scan unserer Assets automatisch überprüfen lassen.

Ich habe eine benutzerdefinierte Policy für diesen Blogbeitrag vorbereitet:

 1policies:
 2  - uid: webserver
 3    name: Webserver Baseline
 4    version: 1.0.0
 5    authors:
 6      - name: Infralovers GmbH
 7        email: team@infralovers.com
 8    docs:
 9      desc: Test suite for Infralovers blog post
10    tags:
11      mondoo.com/category: security
12      mondoo.com/platform: linux,ubuntu,debian
13    groups:
14      - title: SSH
15        filters: |
16          asset.family.contains("linux")          
17        checks:
18          - uid: ssh-01
19            title: Ensure SSH port is listening
20            mql: ports.listening.any( port == 22 )
21      - title: Webserver
22        filters: |
23          asset.family.contains("linux")          
24        checks:
25          - uid: webserver-01
26            title: Ensure webserver ports are listening
27            mql: |
28              ports.listening.any( port == 80 )
29              ports.listening.any( port == 3000 )              
30      - title: Packages
31        filters: |
32          asset.family.contains("linux")          
33        checks:
34          - uid: package-01
35            title: Ensure nginx is installed
36            mql: package('nginx').installed == true
37          - uid: package-02
38            title: Ensure nodejs is installed
39            mql: package('nodejs').installed == true
40          - uid: package-03
41            title: Ensure npm is installed
42            mql: package('npm').installed == true
43      - title: Files
44        filters: |
45          asset.family.contains("linux")          
46        checks:
47          - uid: file-01
48            title: Ensure nginx config is present
49            mql: file('/etc/nginx/sites-available/default').exists == true
50          - uid: file-02
51            title: Ensure application file is present
52            mql: file('/home/adminuser/myapp/index.js').exists == true

Sie finden diese benutzerdefinierte Policy auch im begleitenden Git-Repository zu dieser Blogbeitragsreihe. Schauen Sie in das Verzeichnis "policies", um diese zu finden.

Lassen Sie uns analysieren, was in dieser Policy vor sich geht: In den ersten Zeilen werden Metadaten für die Policy definiert. Das sind Informationen darüber, wer die Policy geschrieben hat, in welcher Version sie vorliegt usw.

Alles, was nach dem groups-Attribut kommt, ist der Punkt, an dem es interessant wird. Ich habe vier verschiedene Gruppen definiert. Es ist immer sinnvoll, Kontrollen zu verschiedenen Problembereichen in verschiedene Gruppen zu unterteilen. Das erleichtert später die Wartung.

Die erste Gruppe hat den title "SSH". Hier definieren wir alle Überprüfungen, die sich mit dem SSH-Protokoll befassen. Wenn Sie sich das Attribut checks ansehen, können Sie sehen, dass ich eine MQL-Abfrage verwende, um zu überprüfen, ob der SSH-Port Nummer 22 lauscht:

ports.listening.any( port == 22 )

Das filter-Attribut teilt Mondoo mit, auf welchen Assets diese Policy-Gruppe ausgeführt werden soll. Wir haben uns für asset.family.contains("linux") entschieden. Das bedeutet, dass Mondoo die zugehörigen Policies nur auf Assets ausführt, auf denen ein Linux-Betriebssystem läuft. Wenn Sie keinen Filter definieren, führt Mondoo die Prüfung nicht durch!

Die zweite Gruppe "Webserver" prüft auf die notwendigen lauschenden Webserver-Ports: 80 und 3000.

Die Gruppe drei prüft, ob die erforderlichen Pakete installiert sind, und die vierte Gruppe prüft, ob die Konfigurationsdateien vorhanden sind.

Hochladen deiner Policy auf Mondoo

Sobald Sie Ihre Datei gespeichert haben, gehen Sie in Ihr Mondoo Dashboard. Klicken Sie in der Seitenleiste auf Registry. Klicken Sie auf der Seite Registry auf die violette Plus-Schaltfläche in der oberen rechten Ecke:

Füge eine benutzerdefinierte Richtlinie zu Mondoo hinzu

Ziehen Sie Ihre Policy-Datei per Drag & Drop in das Dialogfeld Upload Policy.

Ziehen Sie eine benutzerdefinierte Richtlinie per Drag & Drop in Mondoo

Suchen Sie nach dem Hochladen in der Suchleiste auf der Seite "Policy" nach dem Namen der Policy. Wenn Sie es gefunden haben, bewegen Sie den Mauszeiger darüber und klicken Sie auf das aktiviert-Symbol. Es sieht aus wie ein Balkendiagramm mit einem Pfeil obendrauf.

Suche nach einer benutzerdefinierten Richtlinie für Mondoo

Jetzt wird Ihre Policy bei jeder Überprüfung Ihrer Assets berücksichtigt, solange das filter-Attribut der Policy-Gruppe damit übereinstimmt.

Scannen Ihrer Assets

Um die Dinge zu beschleunigen, können Sie manuell einen Scan für Ihr Asset auslösen:

1$ cnspec scan local

Überprüfen Sie Ihr Asset. Wenn Sie dieser Blog-Post-Serie folgen, sollte sie mondoo-demo-webserver-non-compliant heißen. Sie sollten sehen, dass Ihre Policy von Mondoo überprüft wurde:

Benutzerdefinierte Richtlinienergebnisse in Mondoo

Sie können auch die spezifischen "Checks" überprüfen, um zu sehen, wie sie abgeschnitten haben:

Benutzerdefinierte Richtlinienergebnisse in Mondoo

Fazit

Mondoo wird nicht nur mit vielen vordefinierten Policies geliefert, sondern ermöglicht es uns auch, unsere eigenen hinzuzufügen. Die MQL-Sprache ist sehr leistungsfähig und ermöglicht es uns, Policies für viele verschiedene Problembereiche zu definieren. Im Vergleich zu anderen Policy-as-Code-Tools ist die Syntax meiner Meinung nach leicht verständlich und der Overhead wird auf ein Minimum reduziert.

Wie Sie sehen, können wir Compliance-/Sicherheitsprüfungen oder sogar funktionale Spezifikationen schreiben. Dies wird besonders hilfreich sein, wenn wir anfangen, Policies mit cnspec zu schreiben, um z.B. Terraform-Code zu verifizieren.

Im nächsten Beitrag

Im nächsten Beitrag werde ich nun endlich versuchen, die Compliance-Probleme zu beheben, die ich in diesen Beiträgen entdeckt habe. Ich weiß, das wollte ich ursprünglich in diesem Post machen. Ich wollte jedoch zuerst einige benutzerdefinierte Policies hinzufügen.

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren