x

Menü

mondoo.io mit HashiCorp Packer in Gitlab CICD

veröffentlicht in: HashiCorp Devops Cloud Native Datum: 05.03.2021
Martin Buchleitner, Senior IT-Consultant

Über den Autor

Martin Buchleitner ist ein Senior IT-Berater für Infralovers und für Commandemy. Twitter github LinkedIn

Alle Artikel von diesem Autor sehen

Was ist mondoo

Hinter mondoo befindet sich das Team, welches bereits maßgebend an InSpec sowie dem DevSec Projekt mitgearbeitet hat. Das Team arbeitet mit einer Passion daran IT Operationen für Menschen lesbar und ausfürbar zu machen.

Mit Mondoo kann man Informationen über die Verwundbarkeit seiner gesamten Infrastruktur erfassen. Mondoo ermöglich es von lokalen Linux Installationen, Servern auf Hardware, Docker Containern und selbst Kubernetes Clustern und Cloud Umgebungen Daten zu erfassen.

Zudem kann mondoo beim Build integriert werden, aber auch in sämtliche Laufzeitumgebunden. So kann mondoo einfach in bereits existierende CI/CD Prozesse integriert werden - so zum Beispiel auch als Teil von HashiCorp Packer oder Terraform, aber auch in sämtliche verfügbaren Instanzen oder Containern ,um die Sicherheit frühest möglich zu erhöhen.

Wie kann man mondoo in Packer integrieren

Wir starten hier in diesem Beispiel mit dem offiziellen Ubuntu Focal 20.04 LTS Image und lassen den mondoo Provisionerungsprozess innerhalb von Packer laufen. Für das initiale Setup ist es am einfachsten dermondoo Quickstart Dokumentation zu folgen, und anschließend auch der mondoo packer Dokumentation.

Wenn dann ein mondoo Agent registriert ist können wir auch mit dem packer Prozess beginnen.

data "amazon-ami" "ubuntu_focal" {
  filters = {
    name                = "ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"
    root-device-type    = "ebs"
    virtualization-type = "hvm"
  }
  most_recent = true
  owners      = ["099720109477"]
  region      = "us-east-1"
}

locals {
  timestamp = regex_replace(timestamp(), "[- TZ:]", "")
  ami_name = "mondoo-example ${local.timestamp}"
}

source "amazon-ebs" "ubuntu_focal" {
  ami_name      = "${local.ami_name}"
  instance_type = "t2.micro"
  region        = "us-east-1"
  source_ami    = "${data.amazon-ami.ubuntu_focal.id}"
  ssh_username  = "ubuntu"
}

build {
  sources = ["source.amazon-ebs.ubuntu_focal"]

  provisioner "shell" {
    inline = ["ls -al /home/ubuntu"]
  }

  provisioner "mondoo" {
    on_failure = "continue"
  }
}

Die Ausgabe des Packer Builds enthält dann die Ausgabe des mondoo Plugins.

packer build aws_ubuntu.pkr.hcl
amazon-ebs.ubuntu_focal: output will be in this color.

==> amazon-ebs.ubuntu_focal: Prevalidating any provided VPC information
==> amazon-ebs.ubuntu_focal: Prevalidating AMI Name: mondoo-example 20210303131641
    amazon-ebs.ubuntu_focal: Found Image ID: ami-042e8287309f5df03
...
==> amazon-ebs.ubuntu_focal: Running mondoo (Version: 1.1.0, Build: 96bf459)
==> amazon-ebs.ubuntu_focal: activated continue on detected issues
==> amazon-ebs.ubuntu_focal: Executing Mondoo: [mondoo scan]
    amazon-ebs.ubuntu_focal:                         .-.
    amazon-ebs.ubuntu_focal: → loaded configuration from /home/m/.mondoo.yml
    amazon-ebs.ubuntu_focal:                         : :
    amazon-ebs.ubuntu_focal: → resolve assets
    amazon-ebs.ubuntu_focal: ,-.,-.,-. .--. ,-.,-. .-' : .--.  .--.
    amazon-ebs.ubuntu_focal: → discover related assets for 1 assets
    amazon-ebs.ubuntu_focal: : ,. ,. :' .; :: ,. :' .; :' .; :' .; :
    amazon-ebs.ubuntu_focal: → resolved 1 assets
    amazon-ebs.ubuntu_focal: :_;:_;:_;`.__.':_;:_;`.__.'`.__.'`.__.'
    amazon-ebs.ubuntu_focal:
    amazon-ebs.ubuntu_focal: → execute policies
    amazon-ebs.ubuntu_focal: → establish connection to asset 34.203.240.185 (baremetal)
    amazon-ebs.ubuntu_focal: → verify platform access to 34.203.240.185
    amazon-ebs.ubuntu_focal: → gather platform details build= platform=ubuntu release=20.04
    amazon-ebs.ubuntu_focal: → synchronize asset name=ip-172-31-24-155
    amazon-ebs.ubuntu_focal: → run policies for asset asset=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal: → marketplace> fetched policy bundle from usptream policy=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal: → send all results asset=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal: → generate report asset=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal: → scan complete asset=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal: → render report asset=//assets.api.mondoo.app/spaces/beautiful-matsumoto-174617/assets/1pFSj47di9ALLhJM7QE33zsNrGq
    amazon-ebs.ubuntu_focal:
    amazon-ebs.ubuntu_focal: ip-172-31-24-155
    amazon-ebs.ubuntu_focal: ================
    amazon-ebs.ubuntu_focal:
    amazon-ebs.ubuntu_focal: +----------------------------+
    amazon-ebs.ubuntu_focal: |   ___                      |
    amazon-ebs.ubuntu_focal: |  / __|   Fair 41/100       |
    amazon-ebs.ubuntu_focal: | | (__    75% complete      |
    amazon-ebs.ubuntu_focal: |  \___|   == ==             |
    amazon-ebs.ubuntu_focal: +----------------------------+
    amazon-ebs.ubuntu_focal:
    amazon-ebs.ubuntu_focal: Url: https://mondoo.app/space/assets/1pFSj47di9ALLhJM7QE33zsNrGq?spaceId=my-test-space
    amazon-ebs.ubuntu_focal:
    amazon-ebs.ubuntu_focal: Asset Policy 1pFSj47di9ALLhJM7QE33zsNrGq
    ...

Dieser Bericht wird zugleich auch auf mondoo.app verfügbar gemacht und kann über die UI abgerufen werden. Das Standard Ubuntu AMI hat also den einen oder anderen Verbesserungsbedarf wie wir im Bericht von mondoo sehen können.

ein beispiel mondoo report

Wie kann man mondoo innerhalb von Gitlab CI/CD verwenden

Nun wollen wir diese Funktionalität auch innerhalb von Gitlab CI/CD verwenden. Wir können hierzu aus dem Konfigurationsdialog auf mondoo.app den Base64 enkodierten String verwenden:

mondoo cicd configuration

Mit diesen Daten erstellen wir eine CICD Variable innerhalb von Gitlab. Im before_script Schritt installieren wir dann die mondoo Applikation und auch den mondoo packer Provisioner:

stage: packer
image:
    name: hashicorp/packer:1.7.0
    entrypoint:
        [
        "/usr/bin/env",
        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
        ]
variables:
    MONDOO_CONFIG_PATH: "/tmp/mondoo.json"
before_script:
    - apk add --no-cach --quiet jq aws-cli gettext bash curl
    - echo "$MONDOO_AGENT_ACCOUNT" | base64 -d > "$MONDOO_CONFIG_PATH"
    - curl -sSL https://mondoo.io/download.sh | bash && mv mondoo /usr/local/bin/
    - mkdir -p ~/.packer.d/plugins
    - curl https://releases.mondoo.io/packer-provisioner-mondoo/latest.json | jq -r '.files[] | select (.platform=="linux").filename' | xargs -n 1 curl | tar -xz > ~/.packer.d/plugins/packer-provisioner-mondoo
    - chmod +x ~/.packer.d/plugins/packer-provisioner-mondoo
script:
    - packer build aws_ubuntu.pkr.hcl

Fazit

Mondoo ist sehr einfach zu verwenden und bietet ein benutzerfreundliches Userinterface, um die einzelnen Konfigurationen und Assets zu visualisieren. Auch das initiale Setup ist unkompliziert und gut dokumentiert. Mit wenigen Klicks kann man sich so ein eigenes Regelset in der UI zusammenstellen, um zum Beispiel Ausnahmen zu konfigurieren, da man root Logins unter Linux ermöglichen will, aber nur ohne Passwort.

Im Moment bestehen noch 2 Dinge, wo es noch Änderungsbedarf gibt:

  • Es wäre schön Änderungen in der Detektion eines einzelnen Assets über die Zeit zu sehen. So kann man Veränderungen die beim Betriebssystem oder auch der Provisionierung enstehen auch zurückverfolgen.

  • Im Anwendungsfall von Packer wäre es wünschenswert eine andere Ansicht des Assets zu bekommen. Im Moment wird die jeweilige IP dargestellt, wobei aber bei Packer der Name der Packerdefinition bzw Builds interessant wäre, um auch hier Veränderungen zu sehen. So bekommt man im Moment bei jedem Build ein neues Asset angezeigt und kann nach einer gewissen Zeit aber keine Zuordnung mehr zwischen Asset und Buildlauf treffen.