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:
- Betriebssystemrichtlinie schreiben
- Zuweisung von Betriebssystemrichtlinien
- Berichte zur Zuweisung von Betriebssystemrichtlinien aufrufen
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
.