Jürgen Brüder, Senior IT-Consultant

Über den Autor

Jürgen Brüder ist ein Senior IT-Consultant für Infralovers und IT-Trainer für Commandemy. Er war der technische Leiter des Big-Data-Startups Xeer und war auch als Berater für verschiedenste Firmen aktiv. GitHub Twitter LinkedIn

Alle Artikel dieses Autors sehen

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:

bash -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://docs.mondoo.io/platform/policies/development

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:

cat /etc/os-release

PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_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

command('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:

policies:
  - uid: os-check
    name: Check OS
    version: "1.0.0"
    specs:
      - asset_filter:
          query: platform.family.contains(_ == 'unix')
        data_queries:
          os-data-01:
queries:
  - uid:  os-data-01
    title: Check for OS version
    query: command('cat /etc/os-release').stdout == /11 \(bullseye\)/
    docs:
      desc: |
        Raspian should be installed in version 11
      audit: Run the `cat /etc/os-release` command and verify that Raspian version is 11
      remediation: |
        Install latest version of Raspian.

Zum Vergleich, so sieht derselbe Test mit InSpec aus:

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

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:

mondoo 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:

→ no configuration file provided
                        .-.
                        : :
,-.,-.,-. .--. ,-.,-. .-' : .--.  .--. ™
: ,. ,. :' .; :: ,. :' .; :' .; :' .; :
:_;:_;:_;`.__.':_;:_;`.__.'`.__.'`.__.'

x could not initialize credentials for upstream connection error="cannot configure client authentication: cannot load retrieved key: AuthKey must be a valid .p8 PEM file"
→ discover related assets for 1 asset(s)
→ resolved assets resolved-assets=1
→ execute policies
→ enabled incognito mode
→ establish connection to asset raspberrypi (unknown)
→ run policies for asset asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R

███████████████████████████████████████████████████████████████████████████ 100% raspberrypi

→ send all results asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
→ generate report asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R
→ scan complete asset=//assets.api.mondoo.app/spaces/incognito-local-execution/assets/21S5VOX7Lt7FeOSeuDCBuA9mH7R

raspberrypi
===========

┌▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄┐
│  _   _                     │
│ | | | |  Unrated 0/100     │
│ | |_| |  100% complete     │
│  \___/                     │
└────────────────────────────┘

Url: https://console.mondoo.app/space/fleet/21S5VOX7Lt7FeOSeuDCBuA9mH7R?spaceId=incognito-local-execution

Asset Policy 21S5VOX7Lt7FeOSeuDCBuA9mH7R
----------------------------------------

■  U   Check OS

Check OS
--------

┌▄▄▄▄▄▄▄▄▄┐
│  _   _  │  Policy:  Check OS
│ | | | | │  Version: 1.0.0
│ | |_| | │  Mrn:     //policy.api.mondoo.app/spaces/incognito-local-execution/policies/os-check
│  \___/  │  Score:   0 (completion: 100%, via average score)
└─────────┘


no scored queries

Data Queries:

■ Title: Check for OS version
  ID:    //policy.api.mondoo.app/spaces/incognito-local-execution/queries/os-data-01
  Query: command('cat /etc/os-release').stdout == /11 \(bullseye\)/
  Result:
    [ok] value: "PRETTY_NAME=\"Raspbian GNU/Linux 11 (bullseye)\"
    NAME=\"Raspbian GNU/Linux\"
    VERSION_ID=\"11\"
    VERSION=\"11 (bullseye)\"
    VERSION_CODENAME=bullseye
    ID=raspbian
    ID_LIKE=debian
    HOME_URL=\"http://www.raspbian.org/\"
    SUPPORT_URL=\"http://www.raspbian.org/RaspbianForums\"
    BUG_REPORT_URL=\"http://www.raspbian.org/RaspbianBugs\"
    "


Summary
=======

Asset Overview

■  U   raspberrypi

Aggregated 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 vorbei.

Du willst mehr über dieses Thema lernen?

Wissen pur lernt man nicht aus Büchern oder gibt es nicht in Kapselform. Die effektivste Form des Trainings ist immer noch mit Sparringpartnern und einem Guide. Daher bieten wir als Commandemy Schulungen für den IT-Experten von Morgen an.

Werde zum unumstrittenen König des Codes und schau dir jetzt unseren aktuellen Kurse an!

Zu den aktuellen Kursen