CIS-Compliance konfigurieren und prüfen

In diesem Dokument wird erläutert, was die CIS-Benchmark ist, wie sich die Benchmark auf Container-Optimized OS (COS) bezieht, wie der Compliancestatus in der Instanz überprüft wird und wie Fehler im Fehlerfall behoben werden können.

Überblick

Das Center for Internet Security (CIS) veröffentlicht Benchmarks mit Best Practices in Bezug auf Sicherheitsempfehlungen für verschiedene Plattformen. Die CIS-Benchmark von Container-Optimized OS umfasst eine Reihe von Empfehlungen für die Konfiguration von Instanzen, die Container-Optimized OS verwenden, um einen hohen Sicherheitsstatus zu unterstützen. 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.

Stufen der Sicherheitsempfehlungen

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 u. a. folgende Empfehlungen:

  • Randomisierung des Adressraum-Layouts 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 zu einer strengeren Sicherheitsumgebung führt. Die Empfehlungen der Stufe 2 sind nicht unbedingt auf alle Fälle anwendbar, da möglicherweise Anwendungsänderungen erforderlich sind. Sie sollten die Empfehlungen auf Stufe 2 für Ihre Umgebung bewerten, bevor Sie sie anwenden. Diese Ebene enthält u. a. folgende Empfehlungen:

  • Firewallregeln sind für alle offenen Ports vorhanden
  • ICMP-Weiterleitungen und Router-Advertising werden nicht akzeptiert
  • Das standardmäßige Shell-Zeitlimit für Nutzer beträgt maximal 900 Sekunden

So entspricht Container-Optimized OS den CIS-Benchmarks

Ab Meilenstein 97 entsprechen Container-Optimized OS-Images standardmäßig CIS-Level 1 und bieten eine Option zur Einhaltung von CIS-Level 2. Wir bieten auch einen Scanner, mit dem Sie Ihre Instanz anhand der CIS-Empfehlungsstufen prüfen können.

Die CIS-Konfiguration, die die Empfehlungen definiert, ist unter /usr/share/google/security/cis-compliance/cis_config.textproto vorhanden. Der CIS-Scanner prüft anhand der Konfiguration den Compliancestatus der Instanz. Die Ergebnisse der einzelnen Ausführungen des Compliancescanners auf CIS-Ebene werden in /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Diese Datei wird bei jeder Ausführung des CIS-Scanners überschrieben. Wenn einer der CIS-Level-1- oder -Level-2-Scans 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 Complianceprüfung und -konfiguration:

  • cis-level1.service: Standardmäßig aktiviert und beim Booten gestartet. Beim Start des Dienstes wird geprüft, ob die Instanz CIS Level 1 entspricht.
  • cis-level2.service ist standardmäßig deaktiviert. Mit diesem Dienst können Sie die Instanz so konfigurieren, dass sie CIS-Level 2 entspricht, und den Compliancestatus sowohl auf Level 1 als auch auf Level 2 prüfen.

In den folgenden Abschnitten wird erläutert, wie Sie den Compliancestatus der Instanz prüfen und den Audit-Prozess automatisieren.

CIS Level 1-Compliancestatus prüfen

Prüfen Sie den Status von 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 Abschnitt CIS-Konformitätsprüfung Stufe 1/Ebene 2 schlägt fehl.

Der cis-level1.service prüft nur einmal beim Starten der Instanz auf CIS-Level-1-Compliance. Informationen zum Konfigurieren regelmäßiger Complianceprüfungen finden Sie unter Regelmäßige Überprüfung des CIS-Compliancestatus.

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

Sie können den Dienst cis-level2 verwenden, um die Instanz so zu konfigurieren, dass sie CIS-Level 2 entspricht und den Compliancestatus sowohl für Level 1 als auch für Level 2 prüft. Der systemd-Dienst unterstützt alle CIS-Level-2-Empfehlungen mit Ausnahme der folgenden:

  • 4.1.1.2 Achten Sie darauf, dass Logging ausgeführt wird (ID: logging-service-running)

    Diese Empfehlung ist standardmäßig deaktiviert, kann aber wieder aktiviert werden, indem Sie die ID aus der deaktivierten Liste in der Datei /etc/cis-scanner/env_vars löschen. Diese Prüfung existiert nur ab Meilenstein-Version 109. In früheren Meilensteinen erreichen Sie diese Empfehlung, wenn Sie Logging selbst aktivieren. Wenn Sie die Deaktivierung rückgängig machen, wird beim Ausführen des Dienstes cis-level2 ein Skript ausgeführt, das das fluent-Bit-Logging startet. Lassen Sie logging-service-running deaktiviert, wenn Sie nicht unser Standard-Logging oder Ihr eigenes Logging verwenden möchten.

Für die folgenden Empfehlungen konfiguriert der Dienst cis-level2 die Instanz, überprüft jedoch nicht den Compliancestatus:

  • 105 und niedriger:

    • 3.3.1.1 Standardmäßige IPv6-Richtlinie zur Ablehnung der Firewall sicherstellen
    • 3.3.1.2 Sicherstellen, dass IPv6-Loopback-Traffic konfiguriert ist
    • 3.3.1.3 Sicherstellen, dass ausgehende und hergestellte IPv6-Verbindungen konfiguriert sind
    • 3.3.1.4 Sicherstellen, dass IPv6-Firewallregeln für alle offenen Ports vorhanden sind
    • 3.3.2.1 Standard-Firewall-Ablehnungsrichtlinie sicherstellen
    • 3.3.2.2 Sicherstellen, dass Loopback-Traffic konfiguriert ist
    • 3.3.2.3 Sicherstellen, dass ausgehende und hergestellte Verbindungen konfiguriert sind
  • 109 und höher:

    • 3.3.1.4 Sicherstellen, dass IPv6-Firewallregeln für alle offenen Ports vorhanden sind

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

systemctl start cis-level2.service

Prüfen Sie den Status von cis-level2.service, um festzustellen, ob Ihre Instanz erfolgreich konfiguriert wurde 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 Abschnitt Fehlerbehebung.

Der cis-level2-Dienst konfiguriert die Instanz und prüft nur einmal auf die CIS-Level-2-Compliance. Informationen zum Konfigurieren regelmäßiger Complianceprüfungen finden Sie unter Regelmäßige Überprüfung des CIS-Compliancestatus.

Regelmäßige Überprüfung des CIS-Compliancestatus

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

  • cis-compliance-scanner.service: Prüft den Compliancestatus anhand der unter /etc/cis-scanner/env_vars definierten Umgebungsvariablen. Dieser Dienst prüft standardmäßig auf CIS-Level-1-Compliance und ist deaktiviert.
  • cis-compliance-scanner.timer: Führt regelmäßig cis-compliance-scanner.service aus. Der Standardzeitraum ist einmal täglich.

Scanner-Dienst konfigurieren

Die cis-compliance-scanner.service ist für die Prüfung des CIS-Compliancestatus auf Grundlage der unter /etc/cis-scanner/env_vars definierten Umgebungsvariablen verantwortlich. Dieser Dienst prüft standardmäßig auf CIS-Level-1-Compliance.

Legen Sie die Umgebungsvariable LEVEL in /etc/cis-scanner/env_vars auf 2 fest, um die CIS-Level-2-Compliance zu prüfen. Die Datei /etc/cis-scanner/env_vars 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

Starten Sie die Einheit cis-compliance-scanner.timer, um regelmäßige Compliancescans einzurichten:

systemctl start cis-compliance-scanner.timer

Standardmäßig beginnt cis-compliance-scanner.timer einmal täglich am cis-compliance-scanner.service. Um den Scanzeitraum zu ändern, überschreiben Sie das Feld OnUnitActiveSec der Einheit cis-compliance-scanner.timer:

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 Scanner auf einmal pro Stunde festgelegt.

Aktualisieren Sie die systemd-Einheiten, um die Änderungen zu übernehmen:

systemctl daemon-reload

Bestimmte CIS-Compliance-Prüfungen deaktivieren

CIS-Level-1- und -Level-2-Empfehlungen wurden so formuliert, dass sie auf die meisten Umgebungen anwendbar sind. Einige Empfehlungen treffen jedoch möglicherweise nicht auf Ihre spezifische Umgebung zu. Verwenden Sie die Umgebungsvariable EXTRA_OPTIONS in /etc/cis-scanner/env_vars, um bestimmte Empfehlungen zu deaktivieren.

Mit der folgenden Beispieldatei env_vars wird die Empfehlung 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

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

  • Beispiel 1: CIS-Konformitätsstufe 1 einmal täglich prüfen
  • Beispiel 2: CIS-Konformitätsstufe 1 einmal pro Stunde prüfen
  • Beispiel 3: CIS-Konformitätsstufe 2 einmal täglich überprüfen
  • Beispiel 4: Bestimmte CIS-Compliance-Prüfungen deaktivieren

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

Bei der folgenden Beispielkonfiguration werden regelmäßige CIS-Level-1-Scans mit dem Standardzeitraum 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 werden regelmäßige CIS-Level-1-Scans einmal pro Stunde 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 werden regelmäßige CIS-Level-2-Scans mit dem Standardzeitraum 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. Dabei wird eine bestimmte CIS-Empfehlung 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 CIS-Benchmark-Scans zu konfigurieren. Bevor Sie beginnen, sollten Sie sich mit der Betriebssystemrichtlinie vertraut machen, einschließlich der folgenden Themen:

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

Beispiel 1

Bei der folgenden Beispielkonfiguration werden regelmäßige CIS-Level-1-Scans mit dem Standardzeitraum 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 werden regelmäßige CIS-Level-1-Scans einmal pro Stunde 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 werden regelmäßige CIS-Level-2-Scans mit dem Standardzeitraum 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. Dabei wird eine bestimmte CIS-Empfehlung 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 CIS-Benchmark-Scans beheben.

Das Konfigurieren einer Instanz zur Einhaltung der CIS-Level-2-Empfehlungen schlägt fehl

Der cis-level2-Dienst konfiguriert zuerst die Instanz so, dass sie den CIS-Level-2-Empfehlungen entspricht, und prüft dann die Einhaltung von CIS-Level 1 und -Level 2. Falls 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.

Die Journallogs enthalten die Empfehlungen, die auf die Instanz nicht angewendet werden konnten und zum Ausfall des systemd-Dienstes cis-level2 geführt haben.

CIS-Compliance-Prüfung auf Stufe 1 oder 2 schlägt fehl

Die Scanergebnisse für jede Ausführung der Compliance auf CIS-Ebene werden in /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Wenn einer der CIS-Level-1- oder -Level-2-Scans fehlschlägt, enthält die textproto-Datei die 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 zur Vermeidung von fehlgeschlagenen Prüfungen die CIS-Benchmark und folgen Sie den Schritten im Abschnitt Remediation für die fehlgeschlagene Prüfung, um die Instanz konform zu machen. Um herauszufinden, welche Empfehlung einer fehlgeschlagenen Prüfung in der CIS-Benchmark entspricht, suchen Sie die non_compliant_benchmark's-ID in der Konfigurationsdatei des CIS-Scanners unter /usr/share/google/security/cis-compliance/cis_config.textproto.