Configurar y comprobar el cumplimiento de CIS

En este documento se explica qué es el benchmark del 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 fallo.

Información general

El Center for Internet Security (CIS) publica comparativas de prácticas recomendadas de seguridad para varias plataformas. El benchmark de CIS de Container-Optimized OS es un conjunto de recomendaciones para configurar instancias que usan Container-Optimized OS para mantener una postura de seguridad sólida. Las imágenes de COS x86 y ARM cumplen los estándares del CIS.

Acceder a la comparativa

El benchmark de CIS de Container-Optimized OS está disponible en el sitio web de CIS:

Niveles de recomendaciones de seguridad

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

Nivel 1

Las recomendaciones de este nivel están pensadas para que se puedan aplicar a la mayoría de los entornos. Este nivel incluye recomendaciones como las siguientes:

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

Nivel 2

Las recomendaciones de este nivel amplían las del nivel 1, lo que da como resultado un entorno de seguridad más estricto. Las recomendaciones de nivel 2 no se aplican necesariamente 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 cortafuegos para todos los puertos abiertos
  • No se aceptan redirecciones ICMP ni anuncios de routers
  • El tiempo de espera predeterminado del shell de usuario es de 900 segundos o menos

Cómo cumple Container-Optimized OS los CIS Benchmarks

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

La configuración de CIS que define las recomendaciones se encuentra en /usr/share/google/security/cis-compliance/cis_config.textproto. El escáner de CIS usa la configuración para comprobar el estado de cumplimiento de la instancia. Los resultados de cada ejecución del escáner de cumplimiento del nivel de CIS se escriben en /var/lib/google/cis_scanner_scan_result.textproto. Este archivo se sobrescribe cada vez que se ejecuta el analizador de CIS. Si falla alguna de las comprobaciones de nivel 1 o 2 de CIS, el archivo cis_scanner_scan_result.textproto contendrá una lista de todas las comprobaciones que no se hayan superado.

Comprobar el estado de cumplimiento de una instancia

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

  • cis-level1.service: está habilitado de forma predeterminada y se inicia al arrancar. Cuando se inicia el servicio, comprueba si la instancia cumple el nivel 1 de CIS.
  • cis-level2.service: inhabilitado de forma predeterminada. Este servicio te permite configurar la instancia para que cumpla el nivel 2 de CIS y comprueba el estado de cumplimiento de los niveles 1 y 2.

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

Comprobar el estado de cumplimiento del nivel 1 de CIS

Para comprobar si tu instancia cumple el nivel 1 de CIS, consulta el estado de cis-level1.service:

systemctl status cis-level1

El resultado debería ser 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 detecta alguna comprobación que no cumple los requisitos, consulta Fallo en la comprobación de cumplimiento de CIS de nivel 1 o 2.

La comprobación cis-level1.service solo se realiza una vez, cuando se inicia la instancia, para verificar el cumplimiento del nivel 1 de CIS. Para configurar la comprobación periódica del cumplimiento, consulta Comprobación periódica del estado de cumplimiento de CIS.

Configurar el cumplimiento del nivel 2 de CIS y comprobar el estado

Puedes usar el servicio cis-level2 para configurar la instancia de forma que cumpla el nivel 2 de CIS y para comprobar el estado de cumplimiento de los niveles 1 y 2. El servicio systemd admite todas las recomendaciones de nivel 2 del CIS excepto las siguientes:

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

    Esta recomendación está inhabilitada de forma predeterminada, pero se puede volver a habilitar eliminando el ID de la lista de inhabilitación, que se encuentra en el archivo /etc/cis-scanner/env_vars. Esta comprobación solo está disponible en las versiones 109 y posteriores. En las fases anteriores, si habilitas el registro tú mismo, cumples esta recomendación. Si deshaces la inhabilitación, al ejecutar el servicio cis-level2 se ejecuta una secuencia de comandos que inicia el registro de fluent-bit. Mantén la opción logging-service-running desactivada si no quieres usar nuestro registro predeterminado o si quieres usar tu propio registro.

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

  • 105 y versiones anteriores:

    • 3.3.1.1 Asegurarse de que la política de cortafuegos predeterminada de IPv6 deniega el acceso
    • 3.3.1.2. Asegúrate de que el tráfico de bucle de retorno IPv6 esté configurado
    • 3.3.1.3 Asegurarse de que las conexiones salientes y establecidas de IPv6 estén configuradas
    • 3.3.1.4 Asegurarse de que existen reglas de cortafuegos IPv6 para todos los puertos abiertos
    • 3.3.2.1 Asegurarse de que la política de cortafuegos de denegación predeterminada
    • 3.3.2.2. Asegúrate de que el tráfico de bucle esté configurado
    • 3.3.2.3. Asegúrate de que las conexiones salientes y establecidas estén configuradas
  • 109 y versiones posteriores:

    • 3.3.1.4 Asegurarse de que existen reglas de cortafuegos 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 comprobar si tu instancia se ha configurado correctamente y cumple las recomendaciones del nivel 2 de CIS, consulta el estado de cis-level2.service:

systemctl status cis-level2

El resultado debería ser 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 detectan comprobaciones no conformes, consulta la sección Solución de problemas.

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

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

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

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

Configurar el servicio de escáner

El cis-compliance-scanner.service se encarga de comprobar 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 comprueba el cumplimiento del nivel 1 de CIS.

Para comprobar si se cumple el nivel 2 de CIS, asigna el valor 2 a la variable de entorno LEVEL en /etc/cis-scanner/env_vars. 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=""

Configurar el temporizador

Para configurar la comprobación periódica del cumplimiento, 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 periodo 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, el periodo del escáner se establece en una vez cada hora.

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

systemctl daemon-reload

Inhabilitar comprobaciones de cumplimiento de CIS específicas

Las recomendaciones de los niveles 1 y 2 del CIS se han creado para que se puedan aplicar 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 ejemplo, el archivo env_vars no sigue 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"

Automatizar la habilitación y la comprobación del estado de cumplimiento de CIS

Puedes automatizar el proceso de comprobación del cumplimiento de tus instancias mediante cloud-init o la política de SO. En los siguientes ejemplos se muestran algunos casos prácticos de cada herramienta:

  • Ejemplo 1: comprueba el cumplimiento del nivel 1 de CIS una vez al día.
  • Ejemplo 2: comprueba el cumplimiento del nivel 1 de CIS una vez cada hora.
  • Ejemplo 3: comprueba el cumplimiento del nivel 2 de CIS una vez al día.
  • Ejemplo 4: Inhabilitar una comprobación de cumplimiento de CIS específica.

Usar cloud-init

Antes de probar los ejemplos siguientes, asegúrate de que sabes cómo configurar una instancia de COS con cloud-init. Para ello, sigue las instrucciones que se indican en el artículo Usar cloud-init con el formato de configuración de Cloud.

Ejemplo 1

La siguiente configuración de ejemplo inicia análisis periódicos de nivel 1 de CIS con el periodo 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 la comprobación periódica de nivel 1 de CIS una vez cada 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 la comprobación periódica de nivel 2 de CIS con el periodo 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 empezar, asegúrate de que conoces la política del SO, incluidos los siguientes aspectos:

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

Ejemplo 1

La siguiente configuración de ejemplo inicia análisis periódicos de nivel 1 de CIS con el periodo 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 la comprobación periódica de nivel 1 de CIS una vez cada 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 la comprobación periódica de nivel 2 de CIS con el periodo 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 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.
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

Solución de problemas

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

No se puede configurar una instancia para que cumpla las recomendaciones de nivel 2 de CIS

El servicio cis-level2 primero configura la instancia para que cumpla las recomendaciones de nivel 2 de CIS y, a continuación, comprueba si cumple los niveles 1 y 2 de CIS. Si no se puede configurar 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.

Los registros del diario mencionarán las recomendaciones que no se han podido aplicar en la instancia y que han provocado un error en el servicio cis-level2 systemd.

Falla la comprobación de cumplimiento de CIS de nivel 1 o 2

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