CIS-Compliance konfigurieren und prüfen

In diesem Dokument wird erläutert, was die CIS Benchmark ist, wie sie sich auf Container-Optimized OS (COS) bezieht, wie Sie den Compliance-Status in der Instanz prüfen und wie Sie bei einem Fehler Fehlerbehebung durchführen.

Übersicht

Das Center for Internet Security (CIS) veröffentlicht Benchmarks für Best-Practice-Sicherheitsempfehlungen für verschiedene Plattformen. Die CIS-Benchmark für Container-Optimized OS besteht aus einer Reihe von Empfehlungen für die Konfiguration von Instanzen, die Container-Optimized OS verwenden, um ein hohes Sicherheitsniveau zu bieten. Sowohl COS-x86- als auch ARM-Images sind CIS-konform.

Auf die Benchmark zugreifen

Die CIS-Benchmark von Container-Optimized OS ist auf der CIS-Website verfügbar:

  • Rufen Sie die CIS-Benchmarks-Downloadseite auf.
  • Suchen Sie die CIS Google Container-Optimized OS-Benchmark.
  • Klicken Sie auf PDF herunterladen.

Sicherheitsempfehlungsstufen

CIS definiert die folgenden Empfehlungsstufen für Container-Optimized OS.

Stufe 1

Empfehlungen auf dieser Ebene sollten für die meisten Umgebungen gelten. Diese Ebene enthält Empfehlungen wie die folgenden:

  • Die Adressraum-Layout-Zufallsmix-Funktion ist aktiviert
  • /tmp kann nicht zum Ausführen ausführbarer Binärdateien verwendet werden
  • Das Senden von Paketweiterleitungen ist deaktiviert

Stufe 2

Empfehlungen auf dieser Ebene erweitern die Empfehlungen der Stufe 1, was eine strengere Sicherheitsumgebung zur Folge hat. Die Empfehlungen der Ebene 2 gelten nicht unbedingt für alle Fälle, da sie möglicherweise Änderungen an der Anwendung erfordern. Sie sollten die Empfehlungen auf Stufe 2 für Ihre Umgebung bewerten, bevor Sie sie anwenden. Diese Ebene enthält Empfehlungen wie die folgenden:

  • Firewallregeln für alle offenen Ports vorhanden
  • ICMP-Weiterleitungen und Router-Anzeigen werden nicht akzeptiert
  • Das Standardzeitlimit für die Nutzer-Shell beträgt maximal 900 Sekunden.

Einhaltung der CIS-Benchmarks durch Container-Optimized OS

Ab Meilenstein 97 entsprechen Container-Optimized OS-Images standardmäßig CIS-Level 1 und bieten die Möglichkeit, CIS-Level 2 einzuhalten. Außerdem stellen wir einen Scanner bereit, mit dem Sie Ihre Instanz anhand der CIS-Empfehlungsstufen prüfen können.

Die CIS-Konfiguration, die die Empfehlungen definiert, befindet sich unter /usr/share/google/security/cis-compliance/cis_config.textproto. Der CIS-Scanner verwendet die Konfiguration, um den Compliance-Status der Instanz zu prüfen. Die Ergebnisse jedes Durchlaufs des Compliance-Scanners auf CIS-Ebene werden in /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Diese Datei wird bei jedem Durchlauf des CIS-Scanners überschrieben. Wenn einer der CIS-Scans der Ebene 1 oder 2 fehlschlägt, enthält die Datei cis_scanner_scan_result.textproto eine Liste aller fehlgeschlagenen Prüfungen.

Compliancestatus der Instanz prüfen

Container-Optimized OS-Images bieten die folgenden systemd-Dienste für die Compliance-Prüfung und -Konfiguration:

  • cis-level1.service: Standardmäßig aktiviert und wird beim Starten gestartet. Beim Starten des Dienstes wird geprüft, ob die Instanz CIS Level 1 entspricht.
  • cis-level2.service: Standardmäßig deaktiviert. Mit diesem Dienst können Sie die Instanz so konfigurieren, dass sie CIS Level 2 entspricht. Der Compliance-Status wird sowohl anhand von Level 1 als auch von Level 2 geprüft.

In den folgenden Abschnitten wird beschrieben, wie Sie den Compliance-Status der Instanz prüfen und den Auditprozess automatisieren.

Compliance-Status für CIS Level 1 prüfen

Prüfen Sie den Status der cis-level1.service, um festzustellen, ob Ihre Instanz CIS Level 1-konform ist:

systemctl status cis-level1

Die Ausgabe sieht in etwa so aus:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 62 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

Wenn nicht konforme Prüfungen gefunden werden, lesen Sie den Hilfeartikel CIS-Compliance-Prüfung auf Stufe 1/Stufe 2 schlägt fehl.

Die cis-level1.service prüft nur einmal, beim Starten der Instanz, ob die CIS-Level-1-Anforderungen erfüllt sind. Informationen zum Konfigurieren der regelmäßigen Compliance-Prüfung finden Sie unter Regelmäßige Prüfung des CIS-Compliance-Status.

CIS-Level-2-Compliance konfigurieren und Status prüfen

Mit dem cis-level2-Dienst können Sie die Instanz so konfigurieren, dass sie CIS-Level 2 entspricht, und den Compliance-Status sowohl für Level 1 als auch für Level 2 prüfen. Der systemd-Dienst unterstützt alle CIS Level 2-Empfehlungen außer den folgenden:

  • 4.1.1.2 Prüfen, ob die Protokollierung ausgeführt wird (ID: logging-service-running)

    Diese Empfehlung ist standardmäßig deaktiviert. Sie kann jedoch wieder aktiviert werden, indem Sie die ID aus der Liste der deaktivierten Empfehlungen in der Datei /etc/cis-scanner/env_vars löschen. Diese Prüfung gibt es nur in den Meilensteinen 109 und höher. Bei früheren Meilensteinen erfüllen Sie diese Empfehlung, wenn Sie die Option „Selbst erfassen“ aktivieren. Wenn Sie die Deaktivierung rückgängig machen, wird beim Ausführen des cis-level2-Dienstes ein Script ausgeführt, das das Fluent-Bit-Logging startet. Lassen Sie logging-service-running deaktiviert, wenn Sie unser Standard-Logging nicht verwenden oder Ihr eigenes Logging verwenden möchten.

Bei den folgenden Empfehlungen konfiguriert der cis-level2-Dienst die Instanz, überprüft den Compliance-Status jedoch nicht:

  • 105 und niedriger:

    • 3.3.1.1 Sicherstellen, dass die Standard-DENY-Firewallrichtlinie für IPv6 festgelegt ist
    • 3.3.1.2 IPv6-Loopback-Traffic muss konfiguriert sein
    • 3.3.1.3 IPv6-Ausgehende und bestehende Verbindungen müssen konfiguriert sein
    • 3.3.1.4 IPv6-Firewallregeln für alle offenen Ports
    • 3.3.2.1 Sicherstellen, dass die Standard-DENY-Firewallrichtlinie festgelegt ist
    • 3.3.2.2 Sicherstellen, dass Loopback-Traffic konfiguriert ist
    • 3.3.2.3 Ausgehende und bestehende Verbindungen müssen konfiguriert sein
  • 109 und höher:

    • 3.3.1.4 IPv6-Firewallregeln für alle offenen Ports

Der cis-level2-Dienst ist standardmäßig deaktiviert. Führen Sie den folgenden Befehl aus, um den Dienst zu starten:

systemctl start cis-level2.service

Prüfen Sie anhand des Status von cis-level2.service, ob Ihre Instanz erfolgreich konfiguriert ist und den CIS Level 2-Empfehlungen entspricht:

systemctl status cis-level2

Die Ausgabe sieht in etwa so aus:

Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 112 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto

Wenn die Instanzkonfiguration fehlschlägt oder nicht konforme Prüfungen gefunden werden, lesen Sie den Hilfeartikel Fehlerbehebung.

Der cis-level2-Dienst konfiguriert die Instanz und prüft nur einmal auf CIS-Level 2-Compliance. Informationen zum Konfigurieren der regelmäßigen Compliance-Prüfung finden Sie unter Regelmäßige Prüfung des CIS-Compliance-Status.

Regelmäßige Prüfung des CIS-Compliance-Status

Container-Optimized OS-Images enthalten die folgenden Dienste zur regelmäßigen Überprüfung der CIS-Compliance:

  • cis-compliance-scanner.service: Prüft den Compliance-Status anhand der unter /etc/cis-scanner/env_vars definierten Umgebungsvariablen. Standardmäßig wird mit diesem Dienst die Einhaltung von CIS Level 1 geprüft. Der Dienst ist deaktiviert.
  • cis-compliance-scanner.timer: wird regelmäßig ausgeführt.cis-compliance-scanner.service Standardmäßig wird einmal pro Tag ein Bericht erstellt.

Scannerdienst konfigurieren

Der cis-compliance-scanner.service ist dafür verantwortlich, den Status der CIS-Compliance anhand der unter /etc/cis-scanner/env_vars definierten Umgebungsvariablen zu prüfen. Standardmäßig wird mit diesem Dienst die Einhaltung von CIS Level 1 geprüft.

Wenn Sie die Einhaltung von CIS Level 2 prüfen möchten, legen Sie die Umgebungsvariable LEVEL in /etc/cis-scanner/env_vars auf 2 fest. Die /etc/cis-scanner/env_vars-Datei sieht in etwa so aus:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="2"
# Extra options that can be passed to cis_scanner
# For valid options, see output of `cis_scanner -h`
EXTRA_OPTIONS=""

Timer konfigurieren

So richten Sie regelmäßige Compliance-Scans ein:cis-compliance-scanner.timer

systemctl start cis-compliance-scanner.timer

Standardmäßig startet cis-compliance-scanner.timer einmal täglich um cis-compliance-scanner.service. Wenn Sie den Scanzeitraum ändern möchten, überschreiben Sie das Feld OnUnitActiveSec der cis-compliance-scanner.timer-Einheit:

sudo mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
sudo tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
[Unit]
Description=Run CIS Scanner once an hour
[Timer]
OnUnitActiveSec=1h
EOF

In diesem Beispiel wird der Scanzeitraum auf einmal pro Stunde festgelegt.

Um die Änderungen anzuwenden, laden Sie die systemd-Einheiten neu:

systemctl daemon-reload

Bestimmte CIS-Compliance-Prüfungen deaktivieren

Die Empfehlungen von CIS Level 1 und Level 2 sollen für die meisten Umgebungen gelten. Einige Empfehlungen sind jedoch möglicherweise nicht auf Ihre spezifische Umgebung anwendbar. Wenn Sie bestimmte Empfehlungen deaktivieren möchten, verwenden Sie die Umgebungsvariable EXTRA_OPTIONS in /etc/cis-scanner/env_vars.

In der folgenden Beispiel-env_vars-Datei wird die Empfehlung für etc-passwd-permissions deaktiviert:

# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="1"
# Extra options that can be passed to cis_scanner
# For valid options:`cis_scanner -h`
EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"

Aktivierung und Prüfung des CIS-Compliancestatus automatisieren

Sie können die Compliance-Prüfung für Ihre Instanzen mit cloud-init oder Betriebssystemrichtlinien automatisieren. Die folgenden Beispiele zeigen einige Anwendungsfälle für jedes Tool:

  • Beispiel 1: CIS-Level-1-Compliance einmal täglich prüfen
  • Beispiel 2: Einhaltung der CIS-Level-1-Anforderungen einmal pro Stunde prüfen
  • Beispiel 3: CIS-Level-2-Compliance einmal täglich prüfen
  • Beispiel 4: Deaktivierung einer bestimmten CIS-Compliance-Prüfung

cloud-init verwenden

Bevor Sie die folgenden Beispiele ausprobieren, sollten Sie sich mit der Konfiguration einer COS-Instanz mit cloud-init vertraut machen. Folgen Sie dazu der Anleitung unter cloud-init mit dem Cloud-Konfigurationsformat verwenden.

Beispiel 1

In der folgenden Beispielkonfiguration wird ein regelmäßiger CIS-Level-1-Scan mit dem Standardzeitraum von einmal täglich gestartet.

#cloud-config

runcmd:
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Beispiel 2

Im folgenden Beispiel wird ein stündliches, regelmäßiges CIS-Level-1-Scannen konfiguriert.

#cloud-config

# Override cis-compliance-scanner.timer with 1 hour frequency.
write_files:

- path: /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf
  permissions: 0600
  owner: root
  content: |
    [Unit]
    Description=Run CIS Scanner once an hour

    [Timer]
    OnUnitActiveSec=1h

runcmd:
# Reload systemd units.
- systemctl daemon-reload
# Check the compliance status of the instance once an hour.
- systemctl start cis-compliance-scanner.timer

Beispiel 3

Im folgenden Beispiel wird ein regelmäßiger CIS-Level-2-Scan mit dem Standardzeitraum von einmal täglich konfiguriert.

#cloud-config

runcmd:
# Configure the instance for CIS level 2.
- systemctl start cis-level2.service
# Change the scan level to CIS Level 2.
- sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
# Check the compliance status of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Beispiel 4

Im folgenden Beispiel wird der Scanner so konfiguriert, dass er einmal täglich ausgeführt wird, und eine bestimmte CIS-Empfehlung wird deaktiviert.

#cloud-config

runcmd:
# Opt-out of the etc-passwd-permissions check.
- sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars
# Check the compliance of the instance once a day.
- systemctl start cis-compliance-scanner.timer

Betriebssystemrichtlinie verwenden

Sie können eine Betriebssystemrichtlinie verwenden, um das CIS-Benchmark-Scannen zu konfigurieren. Machen Sie sich vor Beginn mit den Betriebssystemrichtlinien vertraut, einschließlich der folgenden Themen:

Außerdem müssen Sie in den folgenden Beispielen für die Bereitstellung die Optionen instanceFilter und rollout hinzufügen.

Beispiel 1

In der folgenden Beispielkonfiguration wird ein regelmäßiger CIS-Level-1-Scan mit dem Standardzeitraum von einmal täglich gestartet.

# An OS policy to check CIS level 1 compliance once a day.
id: ensure-cis-level1-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # COS 97 images are by-default CIS Level 1 compliant and there is no
          # additional configuration needed. However, if certain changes
          # cause non-compliance because of the workload on the instance, this
          # section can be used to automate to make fixes. For example, the
          # workload might generate a file that does not comply with the
          # recommended file permissions.
          # Return an exit code of 100 to indicate that the desired changes
          # successfully applied.
          script: |-
            # optional <your code>
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

Beispiel 2

Im folgenden Beispiel wird ein stündliches, regelmäßiges CIS-Level-1-Scannen konfiguriert.

# An OS policy to check CIS level 1 compliance once an hour.
id: ensure-cis-level1-compliance-once-an-hour-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level1-compliance-once-an-hour
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Overwrite "OnUnitActiveSec" field of the
            # cis-compliance-scanner.timer to trigger
            # cis-compliance-scanner.service once an hour
            # instead of once a day.
            mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
            tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
            [Unit]
            Description=Run CIS Scanner once an hour

            [Timer]
            OnUnitActiveSec=1h
            EOF
            # Reload systemd units.
            systemctl daemon-reload
            # Check the compliance of the instance once an hour.
            systemctl start cis-compliance-scanner.timer && exit 100

Beispiel 3

Im folgenden Beispiel wird ein regelmäßiger CIS-Level-2-Scan mit dem Standardzeitraum von einmal täglich konfiguriert.

# An OS policy to check CIS level 2 compliance once a day.
id: ensure-cis-level2-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: ensure-cis-level2-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Configure the instance for CIS level 2.
            systemctl start cis-level2.service
            # Change the scan level to 2.
            sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer && exit 100

Beispiel 4

Im folgenden Beispiel wird der Scanner so konfiguriert, dass er einmal täglich ausgeführt wird, und eine bestimmte CIS-Empfehlung wird deaktiviert.

# An OS policy to opt-out of CIS check and check compliance status once a day.
id: exclude-cis-check-and-check-compliance-once-a-day-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: exclude-cis-check-and-check-compliance-once-a-day
      exec:
        validate:
          interpreter: SHELL
          # If cis-compliance-scanner.service is active, return an exit code
          # 100 to indicate that the instance is in compliant state.
          # Otherwise, return an exit code of 101 to run `enforce` step.
          script: |-
            is_active=$(systemctl is-active cis-compliance-scanner.timer)
            result=$(systemctl show -p Result --value cis-compliance-scanner.service)

            if [ "$is_active" == "active" ] && [ "$result" == "success" ]; then
              exit 100;
            else
              exit 101;
            fi
        enforce:
          interpreter: SHELL
          # Return an exit code of 100 to indicate that the desired changes
          # were successfully applied.
          script: |-
            # Opt-out of the etc-passwd-permissions check.
            sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars &&
            # Check the compliance of the instance once a day.
            systemctl start cis-compliance-scanner.timer
            # Ensure cis-compliance-scanner completes before exiting
            PID=$(systemctl show --property MainPID --value cis-compliance-scanner.service) &&
            timeout 5m bash -c -- 'while [ -e /proc/'$PID' ]; do echo "CIS Scanner with PID:'$PID' is still running"; sleep 1; done' &&
            exit 100

Fehlerbehebung

In diesem Abschnitt wird beschrieben, wie Sie Probleme im Zusammenhang mit dem CIS-Benchmark-Scan beheben.

Konfiguration einer Instanz gemäß den CIS-Empfehlungen der Stufe 2 schlägt fehl

Der cis-level2-Dienst konfiguriert die Instanz zuerst so, dass sie den CIS-Empfehlungen der Stufe 2 entspricht, und prüft dann, ob sie sowohl CIS-Level 1 als auch CIS-Level 2 entspricht. Wenn die Konfiguration der Instanz fehlschlägt, wird der cis-level2-Dienst mit der folgenden Fehlermeldung beendet:

Job for cis-level2.service failed because the control process exited with error code.
See "systemctl status cis-level2.service" and "journalctl -xeu cis-level2.service" for details.

In den Journalprotokollen werden die Empfehlungen aufgeführt, die nicht auf die Instanz angewendet werden konnten und zum Absturz des cis-level2-Systemd-Dienstes geführt haben.

CIS-Compliance-Prüfung auf Stufe 1 oder 2 fehlgeschlagen

Die Scanergebnisse für jeden Durchlauf der Compliance-Prüfung auf CIS-Ebene werden unter /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Wenn einer der CIS-Scans der Ebene 1 oder 2 fehlschlägt, enthält die Textproto-Datei eine Liste aller fehlgeschlagenen Prüfungen, wie im folgenden Beispiel:

cat /var/lib/google/cis_scanner_scan_result.textproto

# Output
start_time: {
  seconds: 1648241700
  nanos: 763152171
}
end_time: {
  seconds: 1648241700
  nanos: 812992527
}
scanner_version: "1.1.4.3"
benchmark_version: "1.0.0"
status: {
  status: SUCCEEDED
}
non_compliant_benchmarks: {
  id: "etc-passwd-permissions"
  compliance_occurrence: {
    non_compliant_files: {
      path: "/etc/passwd"
      reason: "File permission is 0664, expected the following bits to be set: 0444 and the following bits to be clear: 0133"
    }
  }
}
compliant_benchmarks:  {
  id:  "etc-passwd-permissions"
  compliance_occurrence:  {}
}

Verwenden Sie den CIS-Benchmark, um die fehlgeschlagenen Prüfungen zu beheben, und folgen Sie der Anleitung im Abschnitt Remediation für die fehlgeschlagene Prüfung, um die Instanz konform zu machen. Wenn Sie wissen möchten, welche Empfehlung einer fehlgeschlagenen Prüfung in der CIS-Benchmark entspricht, suchen Sie in der CIS-Scannerkonfigurationsdatei unter /usr/share/google/security/cis-compliance/cis_config.textproto nach der non_compliant_benchmark's-ID.