Cómo configurar y verificar el cumplimiento de CIS

En este documento, se explica qué es la comparativa de CIS, cómo se relaciona con Container-Optimized OS (COS), cómo auditar el estado de cumplimiento en la instancia y cómo solucionar problemas en caso de fallas.

Descripción general

El Center for Internet Security (CIS) publica comparativas de prácticas recomendadas de seguridad para diversas plataformas. La comparativa de CIS de Container-Optimized OS es un conjunto de recomendaciones para configurar instancias que usan Container-Optimized OS a fin de lograr una posición de seguridad sólida. Las imágenes de COS x86 y ARM cumplen con los estándares del CIS.

Accede a la comparativa

La comparativa de CIS para Container-Optimized OS está disponible en el sitio web de CIS:

Niveles de recomendación de seguridad

El CIS define los siguientes niveles de recomendación para Container-Optimized OS.

Nivel 1

Las recomendaciones en este nivel están diseñadas para que se apliquen a la mayoría de los entornos. Este nivel incluye recomendaciones como las siguientes:

  • La aleatorización del diseño del espacio de direcciones está habilitada
  • /tmp no se puede usar para ejecutar archivos binarios ejecutables
  • El envío de redireccionamiento de paquetes está inhabilitado

Nivel 2

Las recomendaciones en este nivel extienden las recomendaciones del nivel 1, lo que da como resultado un entorno de seguridad más estricto. Las recomendaciones de nivel 2 no necesariamente se aplican a todos los casos, ya que pueden requerir cambios en la aplicación. Debes evaluar las recomendaciones de nivel 2 para tu entorno antes de aplicarlas. Este nivel incluye recomendaciones como las siguientes:

  • Existen reglas de firewall para todos los puertos abiertos
  • No se aceptan redireccionamientos de ICMP ni anuncios de routers
  • El tiempo de espera predeterminado de la shell del usuario es de 900 segundos o menos.

Cómo Container-Optimized OS cumple con las comparativas de CIS

A partir del hito 97, las imágenes de Container-Optimized OS cumplen con el nivel 1 de CIS de forma predeterminada y ofrecen una opción para cumplir con el nivel 2 de CIS. También proporcionamos un verificador que puedes usar para auditar tu instancia en función de los niveles de recomendación del CIS.

La configuración del CIS que define las recomendaciones está presente en /usr/share/google/security/cis-compliance/cis_config.textproto. El verificador de CIS usa la configuración para comprobar el estado de cumplimiento de la instancia. Los resultados de cada ejecución del verificador de cumplimiento del nivel de CIS se escriben en /var/lib/google/cis_scanner_scan_result.textproto. Este archivo se reemplaza en cada ejecución del verificador de CIS. Si falla alguno de los análisis de nivel 1 o 2 del CIS, el archivo cis_scanner_scan_result.textproto contendrá una lista de todas las verificaciones con errores.

Verifica el estado de cumplimiento de la instancia

Las imágenes de Container-Optimized OS proporcionan los siguientes servicios de systemd para la verificación y configuración del cumplimiento:

  • cis-level1.service: Se habilita de forma predeterminada y se inicia durante el arranque. Cuando se inicia el servicio, se verifica si la instancia cumple con el nivel 1 de CIS.
  • cis-level2.service: Inhabilitado de forma predeterminada. Este servicio te permite configurar la instancia para que cumpla con el nivel 2 de CIS y verifica el estado de cumplimiento en relación con los niveles 1 y 2.

En las siguientes secciones, se explica cómo verificar el estado de cumplimiento de la instancia y cómo automatizar el proceso de auditoría.

Verifica el estado de cumplimiento del nivel 1 del CIS

Para ver si tu instancia cumple con el nivel 1 de CIS, verifica el estado de cis-level1.service:

systemctl status cis-level1

El resultado es similar a este:

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 se encuentran verificaciones que no cumplen con los requisitos, consulta Falla la verificación de cumplimiento de CIS de nivel 1 o 2.

La cis-level1.service verifica el cumplimiento del nivel 1 de CIS solo una vez, cuando se inicia la instancia. Para configurar la verificación periódica del cumplimiento, consulta Verificación periódica del estado de cumplimiento de CIS.

Configura el cumplimiento del nivel 2 de CIS y verifica el estado

Puedes usar el servicio cis-level2 para configurar la instancia de modo que cumpla con el nivel 2 de CIS y para verificar el estado de cumplimiento en relación con los niveles 1 y 2. El servicio systemd admite todas las recomendaciones del nivel 2 del CIS excepto las siguientes:

  • 4.1.1.2 Asegúrate de que el registro se esté ejecutando (ID: logging-service-running)

    Esta recomendación está inhabilitada de forma predeterminada, pero se puede volver a habilitar borrando el ID de la lista de inhabilitación que se encuentra en el archivo /etc/cis-scanner/env_vars. Esta verificación solo existe en los hitos 109 y posteriores. En los hitos anteriores, habilitar el registro por tu cuenta te permite cumplir con esta recomendación. Si deshaces la inhabilitación, el servicio cis-level2 ejecuta una secuencia de comandos que inicia el registro de fluent-bit. Mantén logging-service-running inhabilitada si no quieres usar nuestro registro predeterminado o si quieres usar tu propio registro.

En las siguientes recomendaciones, el servicio cis-level2 configura la instancia, pero no verifica el estado de cumplimiento:

  • 105 y menos:

    • 3.3.1.1 Asegúrate de que la política de denegación de firewall de IPv6 sea predeterminada
    • 3.3.1.2 Asegúrate de que el tráfico de bucle invertido de IPv6 esté configurado
    • 3.3.1.3 Asegúrate de que las conexiones salientes y establecidas de IPv6 estén configuradas
    • 3.3.1.4 Asegúrate de que existan reglas de firewall de IPv6 para todos los puertos abiertos
    • 3.3.2.1 Asegúrate de tener una política de denegación de firewall predeterminada
    • 3.3.2.2 Asegúrate de que el tráfico de bucle invertido esté configurado
    • 3.3.2.3 Asegúrate de que las conexiones salientes y establecidas estén configuradas
  • Versión 109 y posteriores:

    • 3.3.1.4 Asegúrate de que existan reglas de firewall de IPv6 para todos los puertos abiertos

El servicio cis-level2 está inhabilitado de forma predeterminada. Para iniciar el servicio, ejecuta el siguiente comando:

systemctl start cis-level2.service

Para ver si tu instancia está configurada correctamente y cumple con las recomendaciones del nivel 2 de CIS, verifica el estado de cis-level2.service:

systemctl status cis-level2

El resultado es similar a este:

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 falla la configuración de la instancia o se encuentran verificaciones que no cumplen con los requisitos, consulta Solución de problemas.

El servicio cis-level2 configura la instancia y verifica el cumplimiento del nivel 2 de CIS solo una vez. Para configurar la verificación periódica del cumplimiento, consulta Verificación periódica del estado de cumplimiento de CIS.

Verificación periódica del estado de cumplimiento de CIS

Las imágenes de Container-Optimized OS incluyen los siguientes servicios para verificar periódicamente el cumplimiento de CIS:

  • cis-compliance-scanner.service: Verifica el estado de cumplimiento en función de las variables de entorno definidas en /etc/cis-scanner/env_vars. De forma predeterminada, este servicio verifica el cumplimiento del nivel 1 de CIS y está inhabilitado.
  • cis-compliance-scanner.timer: Ejecuta cis-compliance-scanner.service periódicamente. El período predeterminado es una vez al día.

Configura el servicio de escáner

El objeto cis-compliance-scanner.service es responsable de verificar el estado de cumplimiento de CIS en función de las variables de entorno definidas en /etc/cis-scanner/env_vars. De forma predeterminada, este servicio verifica el cumplimiento del nivel 1 de CIS.

Para verificar el cumplimiento del nivel 2 de CIS, establece la variable de entorno LEVEL en /etc/cis-scanner/env_vars como 2. El archivo /etc/cis-scanner/env_vars es similar al siguiente:

# 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 el temporizador

Para configurar el análisis de cumplimiento periódico, inicia la unidad cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

De forma predeterminada, cis-compliance-scanner.timer se inicia cis-compliance-scanner.service una vez al día. Para cambiar el período de análisis, anula el campo OnUnitActiveSec de la unidad 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

En este ejemplo, se establece el período del escáner en una vez por hora.

Para aplicar los cambios, vuelve a cargar las unidades de systemd:

systemctl daemon-reload

Cómo inhabilitar verificaciones de cumplimiento de CIS específicas

Las recomendaciones de los niveles 1 y 2 del CIS se diseñaron para que se apliquen a la mayoría de los entornos. Sin embargo ,es posible que algunas recomendaciones no se apliquen a tu entorno específico. Para inhabilitar recomendaciones específicas, usa la variable de entorno EXTRA_OPTIONS en /etc/cis-scanner/env_vars.

El siguiente archivo env_vars de ejemplo inhabilita la recomendación 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"

Automatiza la habilitación y la verificación del estado de cumplimiento de CIS

Puedes automatizar el proceso de verificación del cumplimiento para tus instancias con cloud-init o la política del SO. En los siguientes ejemplos, se muestran algunos casos de uso con cada herramienta:

  • Ejemplo 1: Verifica el cumplimiento del nivel 1 de CIS una vez al día.
  • Ejemplo 2: Verifica el cumplimiento del nivel 1 de CIS una vez por hora.
  • Ejemplo 3: Verifica el cumplimiento del nivel 2 de CIS una vez al día.
  • Ejemplo 4: Inhabilita la verificación de cumplimiento de CIS específica.

Usa cloud‑init

Antes de probar los siguientes ejemplos, asegúrate de saber cómo configurar una instancia de COS con cloud-init. Para ello, sigue las instrucciones en Usa cloud-init con el formato de configuración de Cloud.

Ejemplo 1

La siguiente configuración de ejemplo inicia el análisis periódico de CIS en el nivel 1 con el período predeterminado de una vez al día.

#cloud-config

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

Ejemplo 2

En el siguiente ejemplo, se configura el análisis periódico de CIS en el nivel 1 una vez por hora.

#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

Ejemplo 3

En el siguiente ejemplo, se configura el análisis periódico de CIS en el nivel 2 con el período predeterminado de una vez al día.

#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

Ejemplo 4

En el siguiente ejemplo, se configura el análisis para que se ejecute una vez al día y se inhabilita una recomendación específica del CIS.

#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

Uso de la política del SO

Puedes usar una política del SO para configurar el análisis comparativo de CIS. Antes de comenzar, asegúrate de conocer la Política del SO, incluida la siguiente información:

Además, debes agregar las opciones instanceFilter y rollout en los siguientes ejemplos para la implementación.

Ejemplo 1

La siguiente configuración de ejemplo inicia el análisis periódico de CIS en el nivel 1 con el período predeterminado de una vez al día.

# An OS policy to check CIS level 1 compliance once a day.
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

Ejemplo 2

En el siguiente ejemplo, se configura el análisis periódico de CIS en el nivel 1 una vez por hora.

# An OS policy to check CIS level 1 compliance once an hour.
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

Ejemplo 3

En el siguiente ejemplo, se configura el análisis periódico de CIS en el nivel 2 con el período predeterminado de una vez al día.

# An OS policy to check CIS level 2 compliance once a day.
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

Ejemplo 4

En el siguiente ejemplo, se configura el análisis para que se ejecute una vez al día y se inhabilita una recomendación específica del CIS.

# An OS policy to opt-out of CIS check and check compliance status once a day.
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

Soluciona problemas

En esta sección, se describe cómo resolver problemas relacionados con el análisis comparativo de CIS.

Falla la configuración de una instancia para que cumpla con las recomendaciones del nivel 2 de CIS

Primero, el servicio de cis-level2 configura la instancia para que cumpla con las recomendaciones del nivel 2 de CIS y, luego, verifica el cumplimiento con los niveles 1 y 2 de CIS. En caso de que falle la configuración de la instancia, el servicio cis-level2 se cerrará con el siguiente mensaje de error:

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.

Los registros del diario mencionarán las recomendaciones que no se pudieron aplicar en la instancia y que provocaron la falla del servicio cis-level2 de systemd.

No se pasa la verificación de cumplimiento de CIS de nivel 1 o 2

Los resultados del análisis para cada ejecución del cumplimiento del nivel de CIS se escriben en /var/lib/google/cis_scanner_scan_result.textproto. Si falla alguno de los análisis de nivel 1 o 2 del CIS, el archivo textproto contendrá la lista de todas las verificaciones que fallaron, como en el siguiente ejemplo:

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

Para mitigar las verificaciones fallidas, usa la comparativa de CIS y sigue los pasos de la sección Remediation para la verificación fallida y, así, hacer que la instancia cumpla con los requisitos. Para saber qué recomendación corresponde a una verificación fallida en la comparativa de CIS, busca el ID de non_compliant_benchmark's en el archivo de configuración del verificador de CIS ubicado en /usr/share/google/security/cis-compliance/cis_config.textproto.