CIS-Compliance konfigurieren und prüfen

In diesem Dokument wird erklärt, was das CIS-Benchmark ist, wie sich die Benchmark auf Container-Optimized OS (COS) bezieht, wie der Compliancestatus in der Instanz geprüft werden kann und wie Sie im Falle einer Fehlfunktion Fehler beheben können.

Übersicht

Das Center for Internet Security (CIS) veröffentlicht Benchmarks für Best Practice-Sicherheitsempfehlungen für verschiedene Plattformen. Die CIS-Benchmark von Container-Optimized OS enthält Empfehlungen zur Konfiguration von Instanzen, die Container-Optimized OS verwenden, um eine starke Sicherheitslage zu unterstützen.

Auf die Benchmark zugreifen

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

  • Rufen Sie die CIS-Benchmarks-Downloadseite auf.
  • Suchen Sie nach 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 gelten für die meisten Umgebungen. Auf dieser Stufe finden Sie Empfehlungen wie die folgenden:

  • Zufällige Anordnung der Adressbereiche ist aktiviert
  • /tmp kann nicht zum Ausführen von ausführbaren Binärprogrammen verwendet werden
  • Senden von Paketweiterleitungen ist deaktiviert

Stufe 2

Durch Empfehlungen auf dieser Ebene werden die Empfehlungen der Stufe 1 erweitert, was zu einer strengeren Sicherheitsumgebung führt. Die Empfehlungen der Stufe 2 gelten nicht unbedingt für alle Fälle, da sie Anwendungsänderungen erfordern. Sie sollten die Empfehlungen auf Ebene 2 für Ihre Umgebung bewerten, bevor Sie sie übernehmen. Auf dieser Stufe finden Sie Empfehlungen wie die folgenden:

  • Firewallregeln für alle offenen Ports vorhanden
  • ICMP-Weiterleitungen und Router-Werbung sind nicht zulässig
  • Das Standardzeitlimit für die Nutzershell beträgt 900 Sekunden oder weniger.

Wie Container-Optimized OS die CIS-Benchmarks erfüllt

Ab Milestone 97 entsprechen Container-Optimized OS-Images standardmäßig der CIS-Ebene 1 und bieten eine Option für die Einhaltung der CIS-Ebene 2. Wir bieten auch einen Scanner, mit dem Sie Ihre Instanz anhand der CIS-Empfehlungsstufen überprüfen können.

Die CIS-Konfiguration, die die Empfehlungen definiert, ist unter /usr/share/google/security/cis-compliance/cis_config.textproto verfügbar. Der CIS-Scanner verwendet die Konfiguration, um den Compliancestatus der Instanz zu prüfen. Die Ergebnisse der einzelnen Ausführungen des CIS-Level-Scanners werden auf /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Diese Datei wird bei jeder Ausführung des CIS-Scanners überschrieben. Wenn einer der CIS-Scans der Stufe 1 oder Stufe 2 fehlschlägt, enthält die Datei cis_scanner_scan_result.textproto eine Liste aller fehlerhaften Prüfungen.

Compliancestatus der Instanz prüfen

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

  • cis-level1.service: Diese Option ist standardmäßig aktiviert und startet beim Start. Wenn der Dienst gestartet wird, wird geprüft, ob die Instanz dem CIS-Level 1 entspricht.
  • cis-level2.service: Diese Option ist standardmäßig deaktiviert. Dieser Dienst ermöglicht Ihnen, die Instanz so zu konfigurieren, dass sie dem CIS-Level 2 entspricht, und vergleicht den Compliance-Status mit Level 1 und 2.

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

Compliancestatus des CIS-Levels 1 prüfen

Prüfen Sie den Status von cis-level1.service, ob Ihre Instanz die CIS-Stufe 1 erfüllt:

systemctl status cis-level1

Die Ausgabe sieht 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 keine konformen Prüfungen gefunden wurden, lesen Sie den Abschnitt CIS-Konformitätsprüfung für Stufe 1/Stufe 2.

cis-level1.service prüft beim Booten der Instanz nur einmal die CIS-Stufe 1-Compliance. Wie Sie die regelmäßige Complianceprüfung konfigurieren, erfahren Sie im Hilfeartikel Regelmäßige Überprüfung des CIS-Compliancestatus.

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

Mit dem Dienst cis-level2 können Sie die Instanz so konfigurieren, dass sie der CIS-Stufe 2 entspricht und den Compliancestatus mit der Stufe 1 und 2 vergleicht. Der systemd-Dienst unterstützt alle CIS-Empfehlungen der Stufe 2 außer Folgendes:

  • 4.1.1.2 Sicherstellen, dass der Stackdriver-Dienst ausgeführt wird

    Diese Empfehlung gilt nur für Instanzen, die den Stackdriver Logging-Agent standardmäßig verwenden. Da Nutzer möglicherweise unterschiedliche Arten von Logging-Agents bevorzugen, überlassen wir diese dem Nutzer, um einen eigenen Logging-Agent zu starten. Daher konfiguriert der cis-level2-Dienst die Instanz nicht und prüft nicht, ob die Empfehlung eingehalten wird.

Bei den folgenden Empfehlungen konfiguriert der Dienst cis-level2 die Instanz, prüft jedoch nicht den Compliancestatus dieser Empfehlungen.

  • 3.3.1.1 Firewall-Standard-Ablehnungsrichtlinie von IPv6 sicherstellen
  • 3.3.1.2 IPv6-Loopback-Traffic konfigurieren
  • 3.3.1.3 Ausgehende und etablierte IPv6-Verbindungen konfigurieren
  • 3.3.1.4 IPv6-Firewallregeln für alle offenen Ports vorhanden
  • 3.3.2.1 Standardmäßige Firewallrichtlinie zum Ablehnen ablehnen
  • 3.3.2.2 Schleifenverkehr konfigurieren
  • 3.3.2.3 Ausgehende und bestehende Verbindungen konfigurieren

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 zu sehen, ob Ihre Instanz erfolgreich konfiguriert wurde und den CIS-Empfehlungen der Stufe 2 entspricht:

systemctl status cis-level2

Die Ausgabe sieht 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 bei der Instanzkonfiguration Fehler auftreten oder nicht konforme Prüfungen gefunden werden, lesen Sie den Abschnitt Fehlerbehebung.

Der Dienst cis-level2 konfiguriert die Instanz und prüft die Einhaltung der CIS-Level 2 nur einmal. Wie Sie die regelmäßige Complianceprüfung konfigurieren, erfahren Sie im Hilfeartikel Regelmäßige Überprüfung des CIS-Compliancestatus.

Regelmäßige Prüfung des CIS-Compliancestatus

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

  • cis-compliance-scanner.service: Der Compliancestatus wird anhand der unter /etc/cis-scanner/env_vars definierten Umgebungsvariablen überprüft. Dieser Dienst sucht standardmäßig nach der CIS-Stufe 1 und ist deaktiviert.
  • cis-compliance-scanner.timer: Führt cis-compliance-scanner.service regelmäßig aus. Der Standardzeitraum ist einmal täglich.

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. Dieser Dienst prüft standardmäßig auf die CIS-Stufe 1.

Setzen Sie die Umgebungsvariable LEVEL in /etc/cis-scanner/env_vars auf 2, 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

Wenn Sie das periodische Compliancescannen einrichten möchten, starten Sie die Einheit cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Standardmäßig beginnt die App „cis-compliance-scanner.timercis-compliance-scanner.service einmal pro Tag. Überschreibe das Feld OnUnitActiveSec der cis-compliance-scanner.timer-Einheit, um den Scanzeitraum zu ändern:

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

Um die Änderungen zu übernehmen, aktualisieren Sie die systemisierten Einheiten:

systemctl daemon-reload

Bestimmte CIS-Compliance-Prüfungen deaktivieren

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

Im folgenden Beispiel einer env_vars-Datei wird die Empfehlung für etc-passwd-permissions abgelehnt:

# 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 Überprüfung des CIS-Compliancestatus automatisieren

Sie können den Compliance-Prozess für Ihre Instanzen mit cloud-init- oder OS-Richtlinien automatisieren. Die folgenden Beispiele zeigen einige Anwendungsfälle für jedes Tool:

  • Beispiel 1: Überprüfen Sie die Einhaltung des CIS-Levels 1.
  • Beispiel 2: Überprüfung der CIS-Stufe 1 pro Stunde
  • Beispiel 3: Einmal die Einhaltung von CIS-Level 2 prüfen
  • Beispiel 4: Bestimmte CIS-Compliance-Prüfung deaktivieren

cloud-init verwenden

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

Beispiel 1

Die folgende Beispielkonfiguration startet ein periodisches CIS-Level-1-Scan mit dem Standardzeitraum von einmal täglich.

#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 regelmäßig jede Stunde der CIS-Level 1 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 das regelmäßige Scannen von CIS-Level 2 mit dem Standardzeitraum von einem Tag 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 einmal täglich konfiguriert und 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 OS-Richtlinie zum Konfigurieren von CIS-Benchmark-Scans verwenden. Hinweis: Bevor Sie beginnen, sollten Sie mit den Betriebssystemrichtlinien vertraut sein. Dazu gehören:

Außerdem müssen instanceFilter und rollout von Nutzern in der Beispielkonfiguration unten für die Bereitstellung hinzugefügt werden.

Beispiel 1

Die folgende Beispielkonfiguration startet ein periodisches CIS-Level-1-Scan mit dem Standardzeitraum von einmal täglich.

# An OS policy to check CIS level 1 compliance once a day.
osPolicies:
- 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 regelmäßig jede Stunde der CIS-Level 1 konfiguriert.

# An OS policy to check CIS level 1 compliance once an hour.
osPolicies:
- 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 das regelmäßige Scannen von CIS-Level 2 mit dem Standardzeitraum von einem Tag konfiguriert.

# An OS policy to check CIS level 2 compliance once a day.
osPolicies:
- 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 einmal täglich konfiguriert und eine bestimmte CIS-Empfehlung deaktiviert.

# An OS policy to opt-out of CIS check and check compliance status once a day.
osPolicies:
- 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 && exit 100

Problembehebung

Eine Instanz so zu konfigurieren, dass sie den CIS-Empfehlungen der Stufe 2 entspricht

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

In den Journallogs werden die Empfehlungen aufgeführt, die nicht auf die Instanz angewendet werden konnten. Dies führte zu einem Fehler des Systemdienstes von cis-level2.

CIS-Compliancestufe 1 / Stufe 2 schlägt fehl

Die Scanergebnisse für jede Ausführung der CIS-Compliance sind auf /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Wenn einer der CIS-Scans der Stufe 1 oder Stufe 2 fehlschlägt, enthält die Textproto-Datei die Liste aller fehlgeschlagenen Prüfungen, wie im folgenden Beispiel gezeigt:

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:  {}
}

Um die fehlgeschlagenen Prüfungen zu reduzieren, verwenden Sie das CIS-Benchmark und folgen Sie den Schritten im Abschnitt Remediation für die fehlgeschlagene Prüfung, um die Instanz konform zu machen. Sie können die non_compliant_benchmark's-ID in der CIS-Scanner-Konfigurationsdatei unter /usr/share/google/security/cis-compliance/cis_config.textproto finden.