Configuration et vérification de la conformité CIS

Ce document explique ce qu'est le benchmark CIS, comment il est associé à Container-Optimized OS (COS), comment auditer l'état de conformité dans l'instance et comment résoudre les problèmes en cas d'échec.

Présentation

Le Centre pour la sécurité sur Internet (CIS) publie des benchmarks sur les bonnes pratiques de sécurité pour différentes plates-formes. Le benchmark CIS de Container-Optimized OS est un ensemble de recommandations permettant de configurer des instances qui utilisent Container-Optimized OS afin de renforcer une stratégie de sécurité.

Accéder au benchmark

Le benchmark CIS de Container-Optimized OS est disponible sur le site Web de CIS:

Niveaux de recommandation de sécurité

CIS définit les niveaux de recommandation suivants pour Container-Optimized OS.

Niveau 1

À ce niveau, les recommandations s'appliquent à la plupart des environnements. Il inclut les recommandations suivantes:

  • La randomisation de la mise en page des espaces d'adresse est activée
  • /tmp ne peut pas être utilisé pour exécuter des binaires exécutables
  • L'envoi de paquets à l'aide de la redirection est désactivé

Niveau 2

Les recommandations à ce niveau étendent les recommandations de niveau 1, ce qui crée un environnement de sécurité plus strict. Les recommandations de niveau 2 ne s'appliquent pas nécessairement à toutes les demandes, car elles peuvent nécessiter des modifications de la demande de participation. Vous devez évaluer les recommandations au niveau 2 de votre environnement avant de les appliquer. Il inclut les recommandations suivantes:

  • Des règles de pare-feu existent pour tous les ports ouverts
  • Les redirections ICMP et les annonces de routeurs ne sont pas acceptées.
  • Le délai avant expiration de l'interface utilisateur par défaut est de 900 secondes ou moins

Comment Container-Optimized OS est conforme aux benchmarks CIS

À partir de Milestone 97, les images Container-Optimized OS sont conformes par défaut au niveau 1 de CIS et permettent de passer au niveau 2 avec niveau CIS. Nous fournissons également un scanner que vous pouvez utiliser pour auditer votre instance par rapport aux niveaux de recommandation CIS.

La configuration CIS définissant les recommandations est disponible sur /usr/share/google/security/cis-compliance/cis_config.textproto. L'outil d'analyse CIS utilise la configuration pour vérifier l'état de conformité de l'instance. Les résultats de chaque exécution de l'outil d'analyse de conformité CIS sont écrits dans /var/lib/google/cis_scanner_scan_result.textproto. Ce fichier est écrasé à chaque exécution de l'outil d'analyse CIS. Si l'une des analyses de niveau 1 ou 2 échoue, le fichier cis_scanner_scan_result.textproto contient la liste de toutes les vérifications ayant échoué.

Vérifier l'état de conformité de l'instance

Les images Container-Optimized OS fournissent les services système suivants pour vérifier la conformité et configurer les services:

  • cis-level1.service: activé par défaut et démarre au démarrage. Au démarrage du service, il vérifie si l'instance respecte le niveau 1 de la CIS.
  • cis-level2.service : désactivé par défaut. Ce service vous permet de configurer l'instance pour qu'elle soit conforme au niveau 2 du CIS, et vérifie l'état de conformité par rapport aux niveaux 1 et 2.

Les sections suivantes expliquent comment vérifier l'état de conformité de l'instance et automatiser le processus d'audit.

Vérifier l'état de conformité CIS de niveau 1

Pour vérifier si votre instance est conforme à la norme CIS 1, vérifiez l'état de la cis-level1.service :

systemctl status cis-level1

Le résultat ressemble à ce qui suit :

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

Si des vérifications non conformes sont détectées, consultez Échec de la vérification de conformité CIS de niveau 1 et de niveau 2.

Le cis-level1.service vérifie la conformité de la CIS de niveau 1 une seule fois, au démarrage de l'instance. Pour savoir comment configurer la vérification périodique de la conformité, consultez Contrôle périodique de l'état de conformité CIS.

Configurer la conformité CIS de niveau 2 et vérifier l'état

Vous pouvez utiliser le service cis-level2 pour configurer l'instance afin qu'elle respecte le niveau 2 de la CIS, et pour vérifier l'état de conformité par rapport aux niveaux 1 et 2. Le service Systemd est compatible avec toutes les recommandations de niveau C2 de niveau CIS, sauf les suivantes:

  • 4.1.1.2 Vérifier que le service Stackdriver est en cours d'exécution

    Cette recommandation ne s'applique que par défaut aux instances qui utilisent l'agent Logging. Étant donné que les utilisateurs préfèrent les différents types d'agents de journalisation, nous leur demandons de démarrer leur propre agent de journalisation. Par conséquent, le service cis-level2 ne configure pas l'instance et ne vérifie pas la conformité de cette recommandation.

Pour les recommandations suivantes, le service cis-level2 configure l'instance, mais ne vérifie pas l'état de conformité de ces recommandations.

  • 3.3.1.1 S'assurer que la règle de pare-feu de refus par défaut du protocole IPv6 est
  • 3.3.1.2 Vérifier que le trafic de bouclage IPv6 est configuré
  • 3.3.1.3 Vérifier que les connexions sortantes et établies avec IPv6 sont configurées
  • 3.3.1.4 Vérifier que les règles de pare-feu IPv6 existent pour tous les ports ouverts
  • 3.3.2.1 S'assurer que la règle de pare-feu de refus par défaut est activée
  • 3.3.2.2 Vérifier que le trafic de bouclage est configuré
  • 3.3.2.3 S'assurer que les connexions sortantes et établies sont configurées

Le service cis-level2 est désactivé par défaut. Pour lancer le service, exécutez la commande suivante:

systemctl start cis-level2.service

Pour vérifier si votre instance a bien été configurée et respecte les recommandations de niveau 2 de CIS, vérifiez l'état de cis-level2.service :

systemctl status cis-level2

Le résultat ressemble à ce qui suit :

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

Si la configuration de l'instance échoue ou si des vérifications non conformes sont détectées, consultez la section Dépannage.

Le service cis-level2 configure l'instance et vérifie la conformité de CIS de niveau 2 une seule fois. Pour savoir comment configurer la vérification périodique de la conformité, consultez Contrôle périodique de l'état de conformité CIS.

Vérification périodique de l'état de conformité CIS

Les images Container-Optimized OS incluent les services suivants pour vérifier régulièrement la conformité avec la norme CIS:

  • cis-compliance-scanner.service: vérifie l'état de conformité des variables grâce aux variables d'environnement définies sur la page /etc/cis-scanner/env_vars. Par défaut, ce service vérifie la conformité de la CIS de niveau 1 et est désactivé.
  • cis-compliance-scanner.timer: exécute cis-compliance-scanner.service régulièrement. La période par défaut est d'une fois par jour.

Configurer le service de scanner

Le cis-compliance-scanner.service est chargé de vérifier l'état de conformité CIS en fonction des variables d'environnement définies à l'adresse /etc/cis-scanner/env_vars. Par défaut, ce service vérifie la conformité de la norme CIS de niveau 1.

Pour vérifier la conformité de CIS de niveau 2, définissez la variable d'environnement LEVEL dans /etc/cis-scanner/env_vars sur 2. Le fichier /etc/cis-scanner/env_vars est semblable à celui-ci:

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

Configurer le minuteur

Pour configurer l'analyse périodique de la conformité, démarrez l'unité cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Par défaut, cis-compliance-scanner.timer démarre cis-compliance-scanner.service une fois par jour. Pour modifier la période d'analyse, ignorez le champ OnUnitActiveSec de l'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

Dans cet exemple, la période d'analyse est définie sur une fois par heure.

Pour appliquer les modifications, actualisez les unités système:

systemctl daemon-reload

Désactiver des vérifications de conformité CIS spécifiques

Les recommandations de CIS de niveaux 1 et 2 sont applicables à la plupart des environnements. Toutefois ,certaines recommandations peuvent ne pas s'appliquer à votre environnement spécifique. Pour désactiver des recommandations spécifiques, utilisez la variable d'environnement EXTRA_OPTIONS dans /etc/cis-scanner/env_vars.

L'exemple de fichier env_vars suivant désactive la recommandation 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"

Automatiser l'activation et la vérification de l'état de conformité CIS

Vous pouvez automatiser le processus de vérification de la conformité de vos instances à l'aide de cloud-init ou d'OS Policy. Les exemples suivants présentent des cas d'utilisation spécifiques à chaque outil:

  • Exemple 1: Une fois par jour, vérifiez la conformité de la norme CIS de niveau 1.
  • Exemple 2: Vérifiez la conformité de la CIS de niveau 1 toutes les heures.
  • Exemple 3: Vérifiez la conformité de la CIS de niveau 2 une fois par jour.
  • Exemple 4: Désactiver la vérification de conformité CIS

Utiliser cloud-init

Avant de tester les exemples suivants, assurez-vous de bien maîtriser la configuration d'une instance COS avec cloud-init en suivant les instructions de la section Utiliser cloud-init avec le format de configuration Cloud.

Exemple 1

L'exemple de configuration suivant lance l'analyse périodique de niveau 1 de CIS avec la période par défaut d'une fois par jour.

#cloud-config

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

Exemple 2

L'exemple suivant configure une analyse périodique de niveau 1 CIS une fois par heure.

#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

Exemple 3

L'exemple suivant configure un scan CIS de niveau 2 périodique avec la période par défaut une fois par jour.

#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

Exemple 4

L'exemple suivant configure le scanner pour qu'il s'exécute une fois par jour et désactive une recommandation CIS spécifique.

#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

Utiliser la règle d'OS

Vous pouvez utiliser une règle d'OS pour configurer l'analyse CIS Benchmark. Avant de commencer, assurez-vous d'avoir connaissance des règles d'OS, y compris les suivantes:

De plus, instanceFilter et rollout doivent être ajoutés par les utilisateurs dans l'exemple de configuration ci-dessous pour le déploiement.

Exemple 1

L'exemple de configuration suivant lance l'analyse périodique de niveau 1 de CIS avec la période par défaut d'une fois par jour.

# 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

Exemple 2

L'exemple suivant configure une analyse périodique de niveau 1 CIS une fois par heure.

# 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

Exemple 3

L'exemple suivant configure un scan CIS de niveau 2 périodique avec la période par défaut une fois par jour.

# 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

Exemple 4

L'exemple suivant configure le scanner pour qu'il s'exécute une fois par jour et désactive une recommandation CIS spécifique.

# 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

Dépannage

Échec de la configuration d'une instance pour répondre aux recommandations de niveau 2 de CIS

Le service cis-level2 configure d'abord l'instance pour se conformer aux recommandations de niveau 2 de CIS, puis vérifie la conformité avec les niveaux de niveau 1 et 2 de CIS. En cas de défaillance de l'instance, le service cis-level2 se ferme et affiche le message d'erreur suivant:

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.

Les journaux de journal indiqueront les recommandations qui n'ont pas pu être appliquées sur l'instance et ont entraîné l'échec du service système de cis-level2.

Échec de la vérification de la conformité CIS de niveau 1 et 2

Les résultats d'analyse pour chaque exécution du niveau de CIS sont écrits sur /var/lib/google/cis_scanner_scan_result.textproto. Si l'une des analyses CIS de niveau 1 ou 2 échoue, le fichier textproto contient la liste de toutes les vérifications ayant échoué, comme dans l'exemple suivant:

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

Pour limiter les échecs de vérification, utilisez le CIS Benchmark et suivez les étapes de la section Remediation pour que la vérification échoue pour que l'instance soit conforme. Pour déterminer la recommandation correspondant à une vérification ayant échoué lors du benchmark CIS, recherchez l'ID non_compliant_benchmark's dans le fichier de configuration du lecteur CIS situé à l'adresse /usr/share/google/security/cis-compliance/cis_config.textproto.