Configurazione e controllo della conformità CIS

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo documento spiega cos'è il benchmark CIS, in che modo il benchmark si riferisce a Container-Optimized OS (COS), come controllare lo stato di conformità nell'istanza e come risolvere i problemi in caso di errore.

Panoramica

Il Center for Internet Security (CIS) rilascia benchmark per consigli su best practice di sicurezza per diverse piattaforme. Il benchmark CIS del sistema operativo ottimizzato è un insieme di suggerimenti per la configurazione delle istanze che utilizzano il sistema operativo ottimizzato per i container per supportare una solida strategia di sicurezza.

Accedere al benchmark

Il benchmark CIS del sistema operativo ottimizzato per i container è disponibile sul sito web CIS:

Livelli di consigli per la sicurezza

CIS definisce i seguenti livelli di consigli per Container-Optimized OS.

Livello 1

I consigli a questo livello sono pensati per essere applicabili alla maggior parte degli ambienti. Questo livello include consigli come i seguenti:

  • La randomizzazione del layout degli spazi degli indirizzi è abilitata
  • Impossibile utilizzare /tmp per eseguire programmi binari eseguibili
  • Invio reindirizzamento pacchetti disattivato

Livello 2

I consigli a questo livello estendono i consigli del livello 1, ottenendo un ambiente di sicurezza più rigoroso. I consigli di livello 2 non sono necessariamente applicabili a tutti i casi, in quanto potrebbero richiedere modifiche alle applicazioni. Ti consigliamo di valutare i consigli al livello 2 del tuo ambiente prima di applicarli. Questo livello include consigli come i seguenti:

  • Esistono regole firewall per tutte le porte aperte
  • I reindirizzamenti ICMP e gli annunci di router non sono accettati
  • Il timeout predefinito della shell dell'utente è 900 secondi o meno

In che modo il sistema operativo ottimizzato per i container rispetta i benchmark CIS

A partire da Milestone 97, le immagini di Container-Optimized OS sono conformi al CIS di livello 1 per impostazione predefinita e offrono un'opzione per conformarsi al CIS di livello 2. Forniamo anche uno scanner che puoi utilizzare per controllare la tua istanza rispetto ai livelli dei consigli CIS.

La configurazione CIS che definisce i consigli è presente in /usr/share/google/security/cis-compliance/cis_config.textproto. Lo scanner CIS utilizza la configurazione per controllare lo stato di conformità dell'istanza. I risultati di ogni esecuzione dello scanner di conformità a livello di CIS sono scritti in /var/lib/google/cis_scanner_scan_result.textproto. Questo file viene sovrascritto a ogni esecuzione dello scanner CIS. Se una qualsiasi delle scansioni CIS di livello 1 o 2 non va a buon fine, il file cis_scanner_scan_result.textproto conterrà un elenco di tutti i controlli non riusciti.

Verifica lo stato di conformità dell'istanza

Le immagini del sistema operativo ottimizzate per i container offrono i seguenti servizi di sistema per il controllo della conformità e la configurazione:

  • cis-level1.service: abilitato per impostazione predefinita e inizia all'avvio. All'avvio del servizio, controlla se l'istanza è conforme al livello CIS 1.
  • cis-level2.service: disabilitato per impostazione predefinita. Questo servizio consente di configurare l'istanza in modo da essere conforme al livello CIS 2 e di controllare lo stato di conformità sia per il livello 1 che per il livello 2.

Le sezioni seguenti spiegano come verificare lo stato di conformità dell'istanza e come automatizzare il processo di controllo.

Verifica lo stato di conformità CIS di livello 1

Per verificare se la tua istanza è conforme al livello CIS 1, controlla lo stato del cis-level1.service:

systemctl status cis-level1

L'output è simile al seguente:

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

Se sono stati trovati controlli non conformi, fai riferimento all'articolo relativo al controllo di conformità CSI di livello 1/2.

cis-level1.service verifica la conformità CIS di livello 1 una sola volta, quando l'istanza si avvia. Per configurare il controllo periodico della conformità, consulta Verifica periodica dello stato della conformità CIS.

Configura conformità CIS livello 2 e controlla stato

Puoi utilizzare il servizio cis-level2 per configurare l'istanza in modo da rispettare il livello CIS 2 e controllare lo stato di conformità sia per il livello 1 che per il livello 2. Il servizio basato su sistema supporta tutti i consigli del livello CIS 2, tranne per quanto segue:

  • 4.1.1.2 Assicurarsi che il servizio Stackdriver sia in esecuzione

    Questo consiglio è applicabile solo alle istanze che utilizzano l'agente Logging Stackdriver per impostazione predefinita. Poiché gli utenti potrebbero preferire tipi diversi di agenti di logging, consentiamo all'utente di avviare il proprio agente di logging. Pertanto, il servizio cis-level2 non configura l'istanza e non verifica la conformità di questo consiglio.

Per i seguenti consigli, il servizio cis-level2 configura l'istanza ma non verifica lo stato di conformità di questi consigli.

  • 3.3.1.1 Assicurati che il criterio firewall di negazione predefinito IPv6
  • 3.3.1.2 Assicurati che il traffico di loopback IPv6 sia configurato
  • 3.3.1.3 Assicurati che le connessioni in uscita e stabilite in IPv6 siano configurate
  • 3.3.1.4 Assicurati che le regole firewall IPv6 esistano per tutte le porte aperte
  • 3.3.2.1 Assicurati che il criterio firewall di negazione predefinito
  • 3.3.2.2 Assicurati che il traffico di loopback sia configurato
  • 3.3.2.3 Assicurati che le connessioni in uscita e stabilite siano configurate

Il servizio cis-level2 è disattivato per impostazione predefinita. Per avviare il servizio, esegui questo comando:

systemctl start cis-level2.service

Per verificare se la tua istanza è configurata correttamente e è conforme ai consigli CIS di livello 2, controlla lo stato di cis-level2.service:

systemctl status cis-level2

L'output è simile al seguente:

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

Se la configurazione dell'istanza non va a buon fine o vengono rilevati controlli non conformi, consulta la sezione Risoluzione dei problemi.

Il servizio cis-level2 configura l'istanza e verifica la conformità del livello CIS 2 solo una volta. Per configurare il controllo periodico della conformità, consulta Verifica periodica dello stato della conformità CIS.

Controllo periodico dello stato di conformità CIS

Le immagini di Container-Optimized OS includono i seguenti servizi per verificare periodicamente la conformità CIS:

  • cis-compliance-scanner.service: controlla lo stato di conformità in base alle variabili di ambiente definite in /etc/cis-scanner/env_vars. Per impostazione predefinita, questo servizio verifica la conformità CIS di livello 1 e viene disabilitato.
  • cis-compliance-scanner.timer: viene eseguito cis-compliance-scanner.service periodicamente. Il periodo predefinito è una volta al giorno.

Configura il servizio di scansione

cis-compliance-scanner.service è responsabile della verifica dello stato della conformità CIS in base alle variabili di ambiente definite nel criterio /etc/cis-scanner/env_vars. Per impostazione predefinita, questo servizio verifica la conformità di CIS di livello 1.

Per verificare la conformità del livello CIS 2, imposta la variabile di ambiente LEVEL in /etc/cis-scanner/env_vars su 2. Il file /etc/cis-scanner/env_vars è simile al seguente:

# 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=""

Configura il timer

Per configurare la scansione periodica della conformità, avvia l'unità cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Per impostazione predefinita, cis-compliance-scanner.timer inizia cis-compliance-scanner.service una volta al giorno. Per modificare il periodo di scansione, sostituisci il campo OnUnitActiveSec dell'unità 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

Questo esempio imposta il periodo dello scanner su una volta all'ora.

Per applicare le modifiche, ricarica le unità di sistema:

systemctl daemon-reload

Disattivare i controlli di conformità CIS specifici

I consigli relativi ai livelli CIS di livello 1 e 2 sono applicabili alla maggior parte degli ambienti. Tuttavia ,alcuni consigli potrebbero non essere applicabili al tuo ambiente specifico. Per disattivare consigli specifici, utilizza la variabile di ambiente EXTRA_OPTIONS in /etc/cis-scanner/env_vars.

Il seguente file di esempio env_vars disattiva il consiglio etc-passwd-permissions:

# 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"

Automatizza l'attivazione e il controllo dello stato di conformità CIS

Puoi automatizzare la procedura di controllo della conformità per le tue istanze utilizzando cloud-init o il criterio del sistema operativo. I seguenti esempi mostrano alcuni casi d'uso di ogni strumento:

  • Esempio 1: controlla la conformità CIS di livello 1 una volta al giorno.
  • Esempio 2: controlla la conformità CIS di livello 1 una volta all'ora.
  • Esempio 3: controlla la conformità CIS di livello 2 una volta al giorno.
  • Esempio 4: disattivare specifiche verifiche di conformità CIS.

usando cloud-init

Prima di provare i seguenti esempi, assicurati di avere familiarità con la configurazione di un'istanza COS con cloud-init seguendo le istruzioni sull'utilizzo di cloud-init con il formato di configurazione Cloud.

Esempio 1

L'esempio di configurazione seguente avvia una scansione periodica del CIS di livello 1 con il periodo predefinito di una volta al giorno.

#cloud-config

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

Esempio 2

L'esempio seguente configura la scansione periodica del livello CIS 1 una volta all'ora.

#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

Esempio 3

L'esempio seguente configura la scansione periodica del livello CIS di livello 2 con il periodo predefinito di una volta al giorno.

#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

Esempio 4

L'esempio seguente configura lo scanner in modo che venga eseguito una volta al giorno e disattiva un consiglio CIS specifico.

#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

Utilizzo del criterio del sistema operativo

Puoi utilizzare un criterio del sistema operativo per configurare la scansione di benchmark CIS. Prima di iniziare, assicurati di avere familiarità con i criteri del sistema operativo, tra cui:

Inoltre, instanceFilter e rollout devono essere aggiunti dagli utenti nell'esempio di configurazione riportato di seguito per il deployment.

Esempio 1

L'esempio di configurazione seguente avvia una scansione periodica del CIS di livello 1 con il periodo predefinito di una volta al giorno.

# 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

Esempio 2

L'esempio seguente configura la scansione periodica del livello CIS 1 una volta all'ora.

# 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

Esempio 3

L'esempio seguente configura la scansione periodica del livello CIS di livello 2 con il periodo predefinito di una volta al giorno.

# 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

Esempio 4

L'esempio seguente configura lo scanner in modo che venga eseguito una volta al giorno e disattiva un consiglio CIS specifico.

# 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

Risolvere i problemi

Configurazione di un'istanza conforme ai suggerimenti per il livello CIS 2 non riuscita

Il servizio cis-level2 configura prima l'istanza per assicurare la conformità ai suggerimenti per CIS di livello 2 e quindi verifica la conformità sia per il CIS di livello 1 che per il livello 2. Se la configurazione dell'istanza non va a buon fine, il servizio cis-level2 esce con il seguente messaggio di errore:

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.

I log del journal menzionano i suggerimenti che non è stato possibile applicare all'istanza e che generano un errore del servizio cis-level2.

Controllo conformità CIS livello 1 / livello 2 non superato

I risultati della scansione per ogni esecuzione del livello di conformità CIS sono scritti all'indirizzo /var/lib/google/cis_scanner_scan_result.textproto. Se una delle scansioni CIS di livello 1 o di livello 2 non riesce, il file textproto conterrà l'elenco di tutti i controlli non riusciti, come nell'esempio seguente:

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

Per mitigare i controlli non superati, utilizza il Benchmark CIS e segui i passaggi indicati nella sezione Remediation per verificare che il controllo non funzioni per rendere conforme l'istanza. Per trovare quale consiglio corrisponde a un controllo non superato nel benchmark CIS, cerca l'ID non_compliant_benchmark's nel file di configurazione dello scanner CIS all'indirizzo /usr/share/google/security/cis-compliance/cis_config.textproto.