Ist Mondoo eine Alternative zu InSpec?


Bicycle

Warum Mondoo statt InSpec?

Infrastruktur testen hat für mich mit RSpec und ServerSpec begonnen. Diese Tests auch als Compliance Tests verwenden zu können hat mit das DevSec Projekt beigebracht. Kurze Zeit später heuerten die Entwickler hinter diesem Projekt bei der Firma Chef Inc. und entwickelten InSpec. Ein Test- und Policy-Tool das wir bei unseren Kunden bis heute intensiv im Einsatz haben.

Wir waren also sehr begeistert als wir hörten, dass das Team hinter InSpec ein neues Projekt gestartet hat. Das neue Projekt heißt Mondoo und fokussiert sich auf Policy-As-Code.

Wenn ihr mit Mondoo noch nicht vertraut seid, sei euch der offizielle „Getting-Started-Guide“ empfohlen: https://docs.mondoo.io/getstarted/overview

Ein Experiment

Als Langzeit InSpec-User interessiert es mich natürlich sehr, ob es hier Überschneidungen zwischen InSpec und Mondoo bei der Funktionalität gibt. Könnte ich theoretisch meine InSpec-Test auf Mondoo umziehen?

Mondoo sollte in der Lage sein, externe Systeme via SSH zu testen. Ich will es rausfinden!

Keine Dependencies sind ein Vorteil

Das große Manko beim Verwenden von InSpec ist Abhängigkeit auf Ruby. Das ist eines der Features von Mondoo, dass mir am meisten Lust auf dieses Experiment macht. Mondoo wird nämlich als einzelnes Binary verwendet. Keine Abhängigkeiten auf Programmiersprachen oder ähnliches. Das macht das Installieren von diesem Binary natürlich um Längen einfacher.

Mondoo installieren

Zuerst brauchen wir Mondoo auf unserer Workstation installieren. Praktischerweise hat das Mondoo-Team ein einfaches Installations-Skript für ihre Nutzer erstellt: https://github.com/mondoolabs/mondoo/blob/master/install.sh

Alles was wir in unserem Terminal ausführen müssen ist das folgende Kommando:

1bash -c "$(curl -sSL https://mondoo.io/install.sh)"

Beachtet, dass ich hier keinen Mondoo-Account vorher angelegt habe. Ich habe vor Mondoo ohne den dazugehörigen Online-Service zu verwenden.

Selbstverständlich würde ich allen empfehlen, sich einen Mondoo-Account anzulegen, um auf den vollen Funktionsumfang zugreifen zu können. Das macht besonders Sinn, wenn ihr Mondoo auch für Policy-As-Code verwenden wollt.

Warum also jetzt kein Account? Ich wollte versuchen so nah in die Experience mit InSpec ranzukommen.

Eigene Policy schreiben

Für dieses Experiment will ich eine eigene Policy schreiben die mein Zielsystem via SSH testet. Die Mondoo-Docs erklären auch diesen Vorgang sehr gut: https://mondoo.com/docs/cnspec/cnspec-policies/write/

Ich will am Zielsystem ein Shell-Kommando auslösen, dass mit im Stdout eine bestimmte Information liefert. Diese Info will ich prüfen.

Ich habe mich dafür entschieden, die Versionsnummer des Zielbetriebssystems auszulesen und zu prüfen. Bei mir ist das Zielsystem ein RaspberryPi mit Raspian 11. Mit dem folgenden Kommando bekomm ich diese Infos auf dem Terminal (am Zielsystem) ausgegeben:

 1cat /etc/os-release
 2
 3PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
 4NAME="Raspbian GNU/Linux"
 5VERSION_ID="11"
 6VERSION="11 (bullseye)"
 7VERSION_CODENAME=bullseye
 8ID=raspbian
 9ID_LIKE=debian
10HOME_URL="http://www.raspbian.org/"
11SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
12BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Wenn im Output des Kommandos also der Text Raspbian GNU/Linux 11 (bullseye) vorkommt ist das ein Zeichen dafür das alles korrekt ist.

Mondoo gibt uns ein großartiges Werkzeug dafür. Mit der Query

1command('cat /etc/os-release').stdout == /11 (bullseye)/

führt Mondoo am Zielsystem das Kommando cat /etc/os-release aus, und überprüft, ob in dessen Output irgendwo die Regular-Expression 11 (bullseye) vorkommt. Wenn dem so ist, ist die Query, aka unser Test, erfolgreich.

Wenn ich das Ganze in eine Mondo-Policy einbaue (my-policy.yaml), sieht das Ergebnis wie folgt aus:

 1policies:
 2  - uid: os-check
 3    name: Check OS
 4    version: "1.0.0"
 5    specs:
 6      - asset_filter:
 7          query: platform.family.contains(_ == 'unix')
 8        data_queries:
 9          os-data-01:
10queries:
11  - uid:  os-data-01
12    title: Check for OS version
13    query: command('cat /etc/os-release').stdout == /11 \(bullseye\)/
14    docs:
15      desc: |
16        Raspian should be installed in version 11        
17      audit: Run the `cat /etc/os-release` command and verify that Raspian version is 11
18      remediation: |
19        Install latest version of Raspian.        

Zum Vergleich, so sieht derselbe Test mit InSpec aus:

1describe command('cat /etc/os-release') do
2  its('stdout') { should match /11 \(bullseye\)/ }
3end

Ausführen der Policy via SSH

Alles was noch fehlt, ist die Policy auszuführen. Ich habe hier den Usernamen und die URL meines Zielsystem durch USER und URL ersetzt. Ihr tragt hier einfach die für euer Zielsystem gültigen Daten ein:

1mondoo scan --incognito -t ssh://USER@URL ./my-policy.yml

Das Kommando läuft im "incognito" Modus. Mondoo verbindet sich so nicht mit dem Online-Service von Mondoo.

Der Output zeigt uns, dass der Test erfolgreich war:

 1→ no configuration file provided
 2                        .-.
 3                        : :
 4,-.,-.,-. .--. ,-.,-. .-' : .--.  .--. ™
 5: ,. ,. :' .; :: ,. :' .; :' .; :' .; :
 6:_;:_;:_;`.__.':_;:_;`.__.'`.__.'`.__.'
 7
 8x could not initialize credentials for upstream connection error="cannot configure client authentication: cannot load retrieved key: AuthKey must be a valid .p8 PEM file"
 9→ discover related assets for 1 asset(s)
10→ resolved assets resolved-assets=1
11→ execute policies
12→ enabled incognito mode
13→ establish connection to asset raspberrypi (unknown)
14→ run policies for asset asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
15
16███████████████████████████████████████████████████████████████████████████ 100% raspberrypi
17
18→ send all results asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
19→ generate report asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
20→ scan complete asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
21
22raspberrypi
23===========
24
25┌▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄┐
26│  _   _                     │
27│ | | | |  Unrated 0/100     │
28│ | |_| |  100% complete     │
29│  \___/                     │
30└────────────────────────────┘
31
32Url: https://console.mondoo.app/space/fleet/21S5VOX7Lt7FeOSeuDCBuA9mH7R?spaceId=incognito-local-execution
33
34Asset Policy 21S5VOX7Lt7FeOSeuDCBuA9mH7R
35----------------------------------------
36
37■  U   Check OS
38
39Check OS
40--------
41
42┌▄▄▄▄▄▄▄▄▄┐
43│  _   _  │  Policy:  Check OS
44│ | | | | │  Version: 1.0.0
45│ | |_| | │  Mrn:     //policy.api.mondoo.app/spaces/incognito-local-execution/policies/os-check
46│  \___/  │  Score:   0 (completion: 100%, via average score)
47└─────────┘
48
49
50no scored queries
51
52Data Queries:
53
54■ Title: Check for OS version
55  ID:    //policy.api.mondoo.app/spaces/incognito-local-execution/queries/os-data-01
56  Query: command('cat /etc/os-release').stdout == /11 \(bullseye\)/
57  Result:
58    [ok] value: "PRETTY_NAME=\"Raspbian GNU/Linux 11 (bullseye)\"
59    NAME=\"Raspbian GNU/Linux\"
60    VERSION_ID=\"11\"
61    VERSION=\"11 (bullseye)\"
62    VERSION_CODENAME=bullseye
63    ID=raspbian
64    ID_LIKE=debian
65    HOME_URL=\"http://www.raspbian.org/\"
66    SUPPORT_URL=\"http://www.raspbian.org/RaspbianForums\"
67    BUG_REPORT_URL=\"http://www.raspbian.org/RaspbianBugs\"
68    "
69
70
71Summary
72=======
73
74Asset Overview
75
76■  U   raspberrypi
77
78Aggregated Policy Overview

Fazit

Mir zeigte dieses Experiment, dass ich meine InSpec-Tests auch mit Mondoo abbilden könnte. Wenn man also nicht zwei verschiedenen Tools betreiben möchte, geht das auch nur mit Mondoo. Der Mehrwert hier ist klar, dass ich einen Mondoo-Account anlegen kann und mir damit den Zugang zu sehr viele vorgeschriebenen Polices sichere. Das erinnert an Chef Compliance. Ein großer Vorteil ist, dass ich lediglich das Mondoo-Binary benötige und sonst keine Dependencies habe. Ein Nachteil wäre der größere Menge an Code die ich schreiben muss um das selbe Ergebnis wie bei InSpec zu erreichen.

Ich finde Mondoo sehr spannend und werde definitiv ein Auge darauf halten.

Wer mehr über Mondoo erfahren möchte schaut auf <mondoo.io> vorbei.

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