Configurer et vérifier la conformité CIS

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

Présentation

Le CIS (Center for Internet Security) 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 visant à configurer des instances qui utilisent Container-Optimized OS pour garantir un niveau de sécurité élevé. Les images COS x86 et ARM sont conformes à la norme CIS.

Accéder au benchmark

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

Niveaux de recommandations de sécurité

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

Niveau 1

Les recommandations à ce niveau sont destinées à être appliquées à la majorité des environnements. Ce niveau comprend les recommandations suivantes:

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

Niveau 2

Les recommandations à ce niveau étendent les recommandations du niveau 1, ce qui se traduit par un environnement de sécurité plus strict. Les recommandations de niveau 2 ne s'appliquent pas nécessairement à tous les cas, car elles peuvent nécessiter de modifier l'application. Vous devez évaluer les recommandations de niveau 2 pour votre environnement avant de les appliquer. Ce niveau comprend les recommandations suivantes:

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

Conformité de Container-Optimized OS avec les benchmarks CIS

À partir de l'étape 97, les images Container-Optimized OS sont conformes au niveau CIS 1 par défaut et offrent une option pour atteindre le niveau CIS 2. Nous mettons également à votre disposition un outil d'analyse qui vous permet de vérifier que votre instance respecte les niveaux de recommandations CIS.

La configuration CIS définissant les recommandations est disponible à l'adresse /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é au niveau du 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 CIS 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 systemd suivants pour la vérification et la configuration de la conformité:

  • cis-level1.service: activé par défaut et démarré au démarrage. Lorsque le service démarre, il vérifie si l'instance est conforme au niveau CIS 1.
  • cis-level2.service: désactivé par défaut. Ce service vous permet de configurer l'instance pour qu'elle soit conforme au niveau CIS 2, et de vérifier l'état de conformité vis-à-vis des 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 savoir si votre instance est conforme à la norme CIS de niveau 1, vérifiez l'état du 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 la conformité CIS de niveau 1/2.

cis-level1.service ne vérifie la conformité CIS de niveau 1 qu'une seule fois au démarrage de l'instance. Pour configurer la vérification périodique de la conformité, reportez-vous à la section Vérification 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 soit conforme au niveau CIS 2, et pour vérifier l'état de conformité vis-à-vis des niveaux 1 et 2. Le service systemd est compatible avec toutes les recommandations de niveau 2 de la CIS, à l'exception des suivantes:

  • 4.1.1.2 Vérifier que Logging est en cours d'exécution (ID: logging-service-running)

    Cette recommandation est désactivée par défaut, mais vous pouvez la réactiver en supprimant l'ID de la liste des personnes désactivées qui se trouve dans le fichier /etc/cis-scanner/env_vars. Cette vérification n'existe que pour les jalons 109 et ultérieurs. Dans les étapes précédentes, l'activation de Logging vous-même vous permet de respecter cette recommandation. Si vous annulez la désactivation, l'exécution du service cis-level2 exécute un script qui lance la journalisation fluent-bit. Si vous ne souhaitez pas utiliser la journalisation par défaut ou la vôtre, laissez logging-service-running désactivé.

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

  • 105 et versions antérieures:

    • 3.3.1.1 Garantir une stratégie de refus de pare-feu IPv6 par défaut
    • 3.3.1.2 Assurez-vous que le trafic de bouclage IPv6 est configuré
    • 3.3.1.3 Vérifier que les connexions IPv6 sortantes et établies sont configurées
    • 3.3.1.4 Assurez-vous que des règles de pare-feu IPv6 existent pour tous les ports ouverts
    • 3.3.2.1 Garantir la stratégie de refus de pare-feu par défaut
    • 3.3.2.2 Vérifier que le trafic de rebouclage est configuré
    • 3.3.2.3 Vérifier que les connexions sortantes et établies sont configurées
  • 109 et versions ultérieures:

    • 3.3.1.4 Assurez-vous que des règles de pare-feu IPv6 existent pour tous les ports ouverts

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

systemctl start cis-level2.service

Pour savoir si votre instance est correctement configurée et est conforme aux recommandations CIS de niveau 2, 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, reportez-vous à la section Dépannage.

Le service cis-level2 configure l'instance et ne vérifie la conformité CIS de niveau 2 qu'une seule fois. Pour configurer la vérification périodique de la conformité, reportez-vous à la section Vérification 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é CIS:

  • cis-compliance-scanner.service: vérifie l'état de conformité en fonction de variables d'environnement définies sur /etc/cis-scanner/env_vars. Par défaut, ce service vérifie la conformité CIS de niveau 1 et est désactivé.
  • cis-compliance-scanner.timer: exécute cis-compliance-scanner.service régulièrement. Les règles par défaut sont une fois par jour.

Configurer le service d'analyse

Le cis-compliance-scanner.service est chargé de vérifier l'état de la 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é CIS de niveau 1.

Pour vérifier la conformité avec le niveau 2 CIS, définissez la variable d'environnement LEVEL dans /etc/cis-scanner/env_vars sur 2. Le fichier /etc/cis-scanner/env_vars se présente comme suit:

# 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 une analyse de conformité périodique, 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, remplacez 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 systemd:

systemctl daemon-reload

Désactiver des contrôles de conformité CIS spécifiques

Les recommandations de niveaux 1 et 2 de la CIS sont faites pour être applicables à la plupart des environnements. Cependant ,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.

Dans l'exemple suivant, le fichier env_vars 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é pour vos instances à l'aide de cloud-init ou de règles d'OS. Les exemples suivants illustrent des cas d'utilisation avec chaque outil:

  • Exemple 1: Vérifiez la conformité CIS de niveau 1 une fois par jour.
  • Exemple 2: Vérifiez la conformité avec le niveau 1 de CIS une fois par heure.
  • Exemple 3: Vérifiez la conformité CIS de niveau 2 une fois par jour.
  • Exemple 4: désactivation d'une vérification de conformité CIS spécifique

Utiliser cloud-init

Avant d'essayer les exemples suivants, assurez-vous de savoir configurer 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 une analyse périodique du niveau 1 du 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 CIS périodique de niveau 1 toutes les heures.

#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 une analyse CIS périodique de niveau 2 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 l'analyseur 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 une règle d'OS

Vous pouvez utiliser une règle d'OS pour configurer l'analyse de benchmark CIS. Avant de commencer, assurez-vous de bien connaître les règles d'OS, y compris les points suivants:

De plus, vous devez ajouter les options instanceFilter et rollout dans les exemples de déploiement suivants.

Exemple 1

L'exemple de configuration suivant lance une analyse périodique du niveau 1 du 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 CIS périodique de niveau 1 toutes les heures.

# 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 une analyse CIS périodique de niveau 2 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 l'analyseur 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
            # 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

Dépannage

Cette section explique comment résoudre les problèmes liés à l'analyse des benchmarks CIS.

Échec de la configuration d'une instance pour respecter les recommandations de niveau 2 de la CIS

Le service cis-level2 configure d'abord l'instance pour qu'elle soit conforme aux recommandations de niveau 2 du CIS, puis vérifie la conformité avec les niveaux CIS 1 et 2. Si la configuration de l'instance échoue, le service cis-level2 se ferme avec 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 mentionnent les recommandations qui n'ont pas pu être appliquées sur l'instance, entraînant l'échec du service systemd cis-level2.

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

Les résultats de l'analyse pour chaque exécution de conformité au niveau CIS sont écrits sous /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 benchmark CIS et suivez les étapes de la section Remediation pour l'échec d'une vérification permettant de rendre l'instance conforme. Pour identifier la recommandation correspondant à un échec de vérification dans le benchmark CIS, recherchez l'ID non_compliant_benchmark's dans le fichier de configuration de l'analyseur CIS situé à l'adresse /usr/share/google/security/cis-compliance/cis_config.textproto.