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 geprüft und wie Fehler behoben werden.

Überblick

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

Ebenen für Sicherheitsempfehlungen

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

Stufe 1

Empfehlungen auf dieser Ebene sollten für die meisten Umgebungen gelten. Auf dieser Ebene finden Sie Empfehlungen wie die folgenden:

  • Zufällige Anordnung der Layouts im Adressbereich ist aktiviert
  • /tmp kann nicht zum Ausführen ausführbarer Binärprogramme 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 in allen Fällen anwendbar, da sie möglicherweise Anwendungsänderungen erfordern. Sie sollten die Empfehlungen auf Level 2 für Ihre Umgebung prüfen, bevor Sie sie anwenden. Auf dieser Ebene finden Sie Empfehlungen wie die folgenden:

  • Firewallregeln sind für alle offenen Ports vorhanden
  • ICMP-Weiterleitungen und Router-Werbung werden nicht akzeptiert
  • Das Standardzeitlimit für die Nutzer-Shell darf maximal 900 Sekunden betragen

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

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

Die CIS-Konfiguration für die Empfehlungen finden Sie unter /usr/share/google/security/cis-compliance/cis_config.textproto. Der CIS-Scanner verwendet die Konfiguration, um den Compliancestatus der Instanz zu prüfen. Die Ergebnisse jeder Ausführung des CIS-Compliance-Scanners werden auf /var/lib/google/cis_scanner_scan_result.textproto geschrieben. Diese Datei wird bei jeder Ausführung des CIS-Scanners überschrieben. Wenn ein CIS-Scan der Stufen 1 oder 2 fehlschlägt, enthält die Datei cis_scanner_scan_result.textproto eine Liste mit allen nicht bestandenen Prüfungen.

Compliancestatus der Instanz prüfen

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

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

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

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

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

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 keine nicht konformen Prüfungen gefunden wurden, lesen Sie den Artikel CIS-Compliance mit Prüfung der Stufe 1 und Stufe 2.

cis-level1.service prüft die CIS-Level 1-Compliance nur einmal, wenn die Instanz gestartet wird. Weitere Informationen zur regelmäßigen Prüfung des Compliance-Status finden Sie unter Regelmäßige Prüfung des CIS-Compliance-Status.

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

Mit dem Dienst cis-level2 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üft. Der systemd-Dienst unterstützt alle Empfehlungen der CIS-Level 2 mit Ausnahme von:

  • 4.1.1.2 Stackdriver-Dienst ausführen

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

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

  • 3.3.1.1 IPv6-Standardrichtlinie für Ablehnung ablehnen
  • 3.3.1.2 IPv6-Loopback-Traffic konfigurieren
  • 3.3.1.3 Ausgehende und bestehende IPv6-Verbindungen konfigurieren
  • 3.3.1.4 Für alle offenen Ports müssen IPv6-Firewallregeln vorhanden sein
  • 3.3.2.1: Standardrichtlinie für Ablehnung ablehnen
  • 3.3.2.2 Achten Sie darauf, dass der Loopback-Traffic konfiguriert ist
  • 3.3.2.3 Ausgehende und bestehende Verbindungen konfigurieren

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 den Status von cis-level2.service, um festzustellen, ob Ihre Instanz erfolgreich konfiguriert wurde und den Empfehlungen der CIS-Level 2 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 wurden, lesen Sie den Artikel Fehlerbehebung.

Der Dienst cis-level2 konfiguriert die Instanz und prüft nur einmal, ob die CIS-Level-2-Compliance eingehalten wird. Weitere Informationen zur regelmäßigen Prüfung des Compliance-Status finden Sie unter Regelmäßige Prüfung des CIS-Compliance-Status.

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

Container-Optimized OS-Images umfassen die folgenden Dienste für eine regelmäßige Prüfung der CIS-Compliance:

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

Scannerdienst konfigurieren

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 prüft dieser Dienst die CIS-Level-1-Compliance.

Setzen Sie die Umgebungsvariable LEVEL in /etc/cis-scanner/env_vars auf 2, um die Compliance mit CIS-Level 2 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 zum Einrichten des regelmäßigen Scannens der Compliance die Einheit cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Standardmäßig startet cis-compliance-scanner.timer cis-compliance-scanner.service einmal täglich. 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 Zeitraum für den Scanner auf einmal pro Stunde festgelegt.

Aktualisieren Sie die Systemeinheiten, um die Änderungen zu übernehmen:

systemctl daemon-reload

Bestimmte CIS-Compliance-Prüfungen deaktivieren

CIS-Empfehlungen der Stufen 1 und 2 gelten für die meisten Umgebungen. Einige Empfehlungen treffen jedoch möglicherweise nicht auf Ihre spezifische Umgebung zu. Wenn Sie bestimmte Empfehlungen deaktivieren möchten, verwenden Sie die Umgebungsvariable EXTRA_OPTIONS in /etc/cis-scanner/env_vars.

Im folgenden Beispiel einer env_vars-Datei 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-Compliance-Status automatisieren

Sie können den Compliance-Prüfprozess für Ihre Instanzen mit Cloud-init oder der Betriebssystemrichtlinie automatisieren. Die folgenden Beispiele zeigen einige Anwendungsfälle für jedes Tool:

  • Beispiel 1: Konformität mit CIS-Level 1 einmal täglich prüfen
  • Beispiel 2: CIS-Level 1-Konformität einmal pro Stunde prüfen
  • Beispiel 3: Konformität mit CIS-Level 2 einmal täglich überprüfen
  • Beispiel 4: Bestimmte CIS-Konformitätsprüfung deaktivieren

cloud-init verwenden

Bevor Sie die folgenden Beispiele ausprobieren, sollten Sie mit dem Konfigurieren 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 regelmäßige CIS-Level-1-Scans mit der Standardperiode 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 das CIS-Level 1-Scan 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 wird das regelmäßige Scannen auf CIS-Level 2 mit der Standardperiode 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

Mit einer Betriebssystemrichtlinie können Sie CIS-Benchmark-Scans konfigurieren. Machen Sie sich zuerst mit den folgenden Richtlinien vertraut:

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

Beispiel 1

Die folgende Beispielkonfiguration startet regelmäßige CIS-Level-1-Scans mit der Standardperiode 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 das CIS-Level 1-Scan einmal pro Stunde 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 auf CIS-Level 2 mit der Standardperiode von einmal täglich 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 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.
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
            # 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

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

Der cis-level2-Dienst konfiguriert die Instanz zuerst so, dass sie den CIS-Empfehlungen der Ebene 2 entspricht, und prüft dann, ob sie sowohl die CIS-Stufe 1 als auch die Ebene 2 erfüllt. 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 Journallogs werden die Empfehlungen erwähnt, die auf die Instanz nicht angewendet werden konnten. Dies führte zum Fehler des cis-level2-Systems.

CIS-Complianceprüfung mit Stufe 1 und 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 2 fehlschlägt, enthält die textproto-Datei die Liste aller fehlerhaften 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 zum Minimieren der 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 CIS-Scanner-Konfigurationsdatei unter /usr/share/google/security/cis-compliance/cis_config.textproto.