Configurar y comprobar el cumplimiento de CIS

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

Descripción general

Center for Internet Security (CIS) lanza comparativas para ofrecer prácticas recomendadas de seguridad en varias plataformas. La comparativa de CIS para Container-Optimized OS es un conjunto de recomendaciones para configurar instancias que usan Container-Optimized OS para admitir una postura de seguridad sólida.

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

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

Nivel 1

Las recomendaciones de este nivel deben aplicarse a la mayoría de los entornos. Este nivel incluye recomendaciones como las siguientes:

  • Se habilitó la aleatorización del diseño del espacio de direcciones
  • No se puede usar /tmp para ejecutar objetos binarios ejecutables
  • Se inhabilitó el envío de paquetes

Nivel 2

Las recomendaciones en este nivel extienden las recomendaciones de nivel 1, lo que da como resultado un entorno de seguridad más estricto. Las recomendaciones de nivel 2 no son necesariamente aplicables a todos los casos, ya que pueden requerir cambios en las aplicaciones. Debes evaluar las recomendaciones del 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 ICMP ni anuncios del router
  • El tiempo de espera predeterminado de la shell del usuario es de 900 segundos o menos

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

A partir de la meta 97, las imágenes de Container-Optimized OS cumplen con el nivel 1 de CIS de forma predeterminada y proporcionan una opción para cumplir con el nivel 2 de CIS. También proporcionamos un escáner que puedes usar para auditar tu instancia según los niveles de recomendación de CIS.

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

Verificar el estado de cumplimiento de la instancia

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

  • cis-level1.service: Habilitado de forma predeterminada y comienza con el inicio. Cuando se inicia el servicio, se verifica si la instancia cumple con el nivel de CIS 1.
  • cis-level2.service: Inhabilitado de forma predeterminada Este servicio te permite configurar la instancia para que cumpla con el nivel de CIS 2 y verifica el estado del cumplimiento 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 de nivel 1 de CIS

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

systemctl status cis-level1

El resultado es similar al siguiente:

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 encontraron verificaciones que no cumplen con las políticas, consulte Error de verificación de nivel 1 o Nivel 2 de CIS.

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

Configura el cumplimiento de CIS para nivel 2 y el estado

Puedes usar el servicio cis-level2 para configurar la instancia a fin de cumplir con el nivel 2 de CIS y verificar el estado del cumplimiento con los niveles 1 y 2. El servicio systemd es compatible con todas las recomendaciones de CIS de nivel 2 excepto para lo siguiente:

  • 4.1.1.2 Asegúrese de que el servicio de Stackdriver se esté ejecutando

    Esta recomendación solo se aplica a las instancias que usan el agente de Stackdriver Logging de forma predeterminada. Dado que es posible que los usuarios prefieran diferentes tipos de agentes de registro, les dejamos a los usuarios el inicio de su propio agente de Logging. Por lo tanto, el servicio cis-level2 no configura la instancia y no verifica el cumplimiento de esta recomendación.

Para las siguientes recomendaciones, el servicio cis-level2 configura la instancia, pero no verifica el estado de cumplimiento de estas recomendaciones.

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

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

systemctl start cis-level2.service

Para verificar si la instancia se configuró de forma correcta y cumple con las recomendaciones de CIS de nivel 2, verifica el estado de cis-level2.service:

systemctl status cis-level2

El resultado es similar al siguiente:

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

El servicio cis-level2 configura la instancia y verifica el cumplimiento de CIS de nivel 2 solo una vez. Para configurar la verificación periódica de cumplimiento, consulta la sección sobre la 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 de forma periódica el cumplimiento de CIS:

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

Configura el servicio de análisis

cis-compliance-scanner.service es responsable de verificar el estado del 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 de la CIS (nivel 1).

Para comprobar si cumple con el nivel de CIS, configure 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 periódico del cumplimiento, inicia la unidad cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

De forma predeterminada, cis-compliance-scanner.timer 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 de 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 una vez por hora.

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

systemctl daemon-reload

Inhabilita las verificaciones de cumplimiento de CIS específicas

Las recomendaciones de nivel 1 y 2 de CIS se aplican 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.

En el siguiente archivo env_vars de ejemplo, se 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"

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

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

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

Usa cloud‑init

Antes de probar los siguientes ejemplos, sigue las instrucciones en Cómo usar cloud-init con el formato de configuración de Cloud para asegurarte de estar familiarizado con la configuración de una instancia de COS con cloud-init.

Ejemplo 1

En la siguiente configuración de ejemplo, se inicia el análisis periódico de nivel 1 de CIS 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 de 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 de 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 escáner para que se ejecute una vez al día y se inhabilita una recomendación específica de 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

Usar la política de SO

Puedes usar una política de SO para configurar el análisis de CIS Benchmark. Antes de comenzar, asegúrate de estar familiarizado con la política de SO, incluido lo siguiente:

Además, los usuarios deben agregar instanceFilter y rollout en la configuración de ejemplo siguiente para la implementación.

Ejemplo 1

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

# 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

Ejemplo 2

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

# 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

Ejemplo 3

En el siguiente ejemplo, se configura el análisis periódico de CIS de 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.
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

Ejemplo 4

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

# 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

Solución de problemas

La configuración de una instancia para cumplir con las recomendaciones de CIS de nivel 2 falla

El servicio de cis-level2 configura primero la instancia para que satisfaga las recomendaciones de CIS de nivel 2 y, luego, verifica si cumple con los niveles de CIS de nivel 1 y 2. En caso de que falle la configuración de la instancia, el servicio cis-level2 se cierra 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.

En los registros del diario, se mencionarán las recomendaciones que no se pudieron aplicar en la instancia y dieron como resultado un error del servicio del sistema cis-level2.

No se pudo comprobar el cumplimiento de nivel 1 o de nivel 2 de CIS

Los resultados del análisis para cada ejecución de cumplimiento de CIS se escriben en /var/lib/google/cis_scanner_scan_result.textproto. Si falla alguno de los análisis de CIS de nivel 1 o 2, el archivo textproto contendrá la lista de todas las verificaciones fallidas, como se muestra 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 con errores, usa CIS Benchmark y sigue los pasos en la sección Remediation de la verificación con errores para que la instancia cumpla con los requisitos. Para encontrar qué recomendación corresponde a una verificación con errores en la comparativa de CIS, busca el ID de non_compliant_benchmark's en el archivo de configuración del escáner de CIS ubicado en /usr/share/google/security/cis-compliance/cis_config.textproto.