Como configurar e verificar a conformidade com o CIS

Este documento explica o que é o comparativo de mercado do CIS, como ele se relaciona ao Container-Optimized OS (COS), como auditar o status de compliance na instância e como solucionar problemas em caso de falha.

Visão geral

O Center for Internet Security (CIS) lança comparativos de mercado com práticas recomendadas de segurança para várias plataformas. O comparativo de mercado do CIS do Container-Optimized OS é um conjunto de recomendações para configurar instâncias que usam o Container-Optimized OS para oferecer uma postura de segurança sólida. As imagens do COS x86 e ARM estão em conformidade com o CIS.

Como acessar o comparativo de mercado

O comparativo de mercado da CIS para Container-Optimized OS está disponível no site da CIS:

Níveis de recomendação de segurança

O CIS define os seguintes níveis de recomendação para o Container-Optimized OS.

Nível 1

As recomendações nesse nível são aplicáveis à maioria dos ambientes. Esse nível inclui recomendações como as seguintes:

  • A randomização do layout do espaço de endereço está ativada
  • O /tmp não pode ser usado para executar binários executáveis.
  • O envio de redirecionamento de pacote está desativado

Nível 2

As recomendações nesse nível estendem as recomendações de nível 1, resultando em um ambiente de segurança mais rigoroso. As recomendações do nível 2 não são necessariamente aplicáveis a todos os casos, já que podem exigir mudanças no aplicativo. Avalie as recomendações no nível 2 para seu ambiente antes de aplicá-las. Esse nível inclui recomendações como as seguintes:

  • Existem regras de firewall para todas as portas abertas
  • Redirecionamentos ICMP e anúncios de roteador não são aceitos
  • O tempo limite padrão do shell do usuário é de 900 segundos ou menos

Como o Container-Optimized OS está em conformidade com os comparativos de mercado do CIS

A partir do Milestone 97, as imagens do Container-Optimized OS obedecem ao nível 1 da CIS por padrão e oferecem uma opção para obedecer ao nível 2 da CIS. Também oferecemos um scanner que pode ser usado para auditar sua instância em relação aos níveis de recomendação do CIS.

A configuração do CIS que define as recomendações está em /usr/share/google/security/cis-compliance/cis_config.textproto. O scanner do CIS usa a configuração para verificar o status de conformidade da instância. Os resultados de cada execução do scanner de conformidade de nível do CIS são gravados em /var/lib/google/cis_scanner_scan_result.textproto. Esse arquivo é substituído a cada execução do scanner do CIS. Se alguma das verificações de nível 1 ou 2 do CIS falhar, o arquivo cis_scanner_scan_result.textproto vai conter uma lista de todas as verificações com falha.

Verificar o status de conformidade da instância

As imagens do Container-Optimized OS fornecem os seguintes serviços do systemd para verificação e configuração de compliance:

  • cis-level1.service: ativado por padrão e iniciado na inicialização. Quando o serviço é iniciado, ele verifica se a instância está em conformidade com o nível 1 do CIS.
  • cis-level2.service: desativado por padrão. Com esse serviço, é possível configurar a instância para obedecer ao CIS nível 2 e verificar o status de conformidade em relação aos níveis 1 e 2.

As seções a seguir explicam como verificar o status de compliance da instância e como automatizar o processo de auditoria.

Verificar o status de compliance do nível 1 do CIS

Para saber se a instância está em conformidade com o nível 1 do CIS, verifique o status do cis-level1.service:

systemctl status cis-level1

O resultado será assim:

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

Se houver verificações não compatíveis, consulte Falhas na verificação de compliance do CIS nível 1/nível 2.

A cis-level1.service verifica a conformidade com o nível 1 do CIS apenas uma vez, quando a instância é inicializada. Para configurar a verificação periódica de compliance, consulte Verificação periódica do status de compliance do CIS.

Configurar a conformidade com o CIS de nível 2 e verificar o status

Use o serviço cis-level2 para configurar a instância de acordo com o nível 2 do CIS e verificar o status de conformidade com os níveis 1 e 2. O serviço systemd oferece suporte a todas as recomendações do Nível 2 do CIS, exceto as seguintes:

  • 4.1.1.2 Verifique se o Logging está em execução (ID: logging-service-running)

    Essa recomendação é desativada por padrão, mas pode ser reativada excluindo o ID da lista de desativação, que pode ser encontrada no arquivo /etc/cis-scanner/env_vars. Essa verificação só existe nos marcos 109 e mais recentes. Em marcos anteriores, ativar o registro em log por conta própria deixa você em conformidade com essa recomendação. Se você desfizer a recusa, a execução do serviço cis-level2 vai executar um script que inicia a geração de registros do fluent-bit. Mantenha a opção logging-service-running desativada se você não quiser usar o registro padrão ou quiser usar o seu próprio.

Para as recomendações a seguir, a configuração do serviço cis-level2 configura a instância, mas não verifica o status de conformidade:

  • 105 e versões anteriores:

    • 3.3.1.1 Certifique-se de que a política de firewall de negação padrão IPv6
    • 3.3.1.2 Verifique se o tráfego de loopback do IPv6 está configurado
    • 3.3.1.3 Verifique se as conexões de saída e estabelecidas do IPv6 estão configuradas
    • 3.3.1.4 Verifique se existem regras de firewall IPv6 para todas as portas abertas
    • 3.3.2.1 Certifique-se de que a política de firewall de negação padrão
    • 3.3.2.2 Verifique se o tráfego de loopback está configurado
    • 3.3.2.3 Verifique se as conexões de saída e estabelecidas estão configuradas
  • 109 e mais recentes:

    • 3.3.1.4 Verifique se existem regras de firewall IPv6 para todas as portas abertas

O serviço cis-level2 fica desativado por padrão. Para iniciar o serviço, execute o seguinte comando:

systemctl start cis-level2.service

Para verificar se a instância foi configurada corretamente e está em conformidade com as recomendações do nível 2 do CIS, verifique o status de cis-level2.service:

systemctl status cis-level2

O resultado será assim:

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

Se a configuração da instância falhar ou se houver verificações não conformes, consulte Solução de problemas.

O serviço cis-level2 configura a instância e verifica a conformidade com o CIS de nível 2 apenas uma vez. Para configurar a verificação periódica de compliance, consulte Verificação periódica do status de compliance do CIS.

Verificação periódica do status de compliance do CIS

As imagens do Container-Optimized OS incluem os seguintes serviços para verificar periodicamente a conformidade com o CIS:

  • cis-compliance-scanner.service: verifica o status de conformidade com base nas variáveis de ambiente definidas em /etc/cis-scanner/env_vars. Por padrão, esse serviço verifica a conformidade com o CIS de nível 1 e está desativado.
  • cis-compliance-scanner.timer: executa cis-compliance-scanner.service periodicamente. O período padrão é uma vez por dia.

Configurar o serviço de scanner

O cis-compliance-scanner.service é responsável por verificar o status da conformidade com o CIS com base nas variáveis de ambiente definidas em /etc/cis-scanner/env_vars. Por padrão, esse serviço verifica a conformidade com o nível 1 do CIS.

Para verificar a conformidade com o nível 2 do CIS, defina a variável de ambiente LEVEL em /etc/cis-scanner/env_vars como 2. O arquivo /etc/cis-scanner/env_vars é semelhante a este:

# 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 o timer

Para configurar a verificação periódica de compliance, inicie a unidade cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Por padrão, o cis-compliance-scanner.timer começa cis-compliance-scanner.service uma vez por dia. Para mudar o período de verificação, substitua o campo OnUnitActiveSec da unidade 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

Este exemplo define o período do scanner como uma vez por hora.

Para aplicar as mudanças, recarregue as unidades do systemd:

systemctl daemon-reload

Como desativar verificações de compliance do CIS específicas

As recomendações dos níveis 1 e 2 do CIS são aplicáveis à maioria dos ambientes. No entanto ,algumas recomendações podem não ser aplicáveis ao seu ambiente específico. Para desativar recomendações específicas, use a variável de ambiente EXTRA_OPTIONS em /etc/cis-scanner/env_vars.

O exemplo de arquivo env_vars a seguir desativa a recomendação 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 a ativação e a verificação do status de conformidade do CIS

É possível automatizar o processo de verificação de compliance das instâncias usando o cloud-init ou a política do SO. Confira alguns exemplos de casos de uso com cada ferramenta:

  • Exemplo 1: verifique a conformidade com o CIS de nível 1 uma vez por dia.
  • Exemplo 2: verifique a conformidade com o nível 1 do CIS uma vez por hora.
  • Exemplo 3: verifique a conformidade com o CIS de nível 2 uma vez por dia.
  • Exemplo 4: desativar uma verificação de conformidade específica do CIS.

Como usar o cloud-init

Antes de testar os exemplos a seguir, confira se você sabe como configurar uma instância do COS com o cloud-init seguindo as instruções em Como usar o cloud-init com o formato de configuração do Cloud.

Exemplo 1

A configuração de exemplo a seguir inicia a verificação periódica de CIS de nível 1 com o período padrão de uma vez por dia.

#cloud-config

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

Exemplo 2

O exemplo a seguir configura a verificação periódica de CIS de nível 1 uma 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

Exemplo 3

O exemplo a seguir configura a verificação periódica de CIS de nível 2 com o período padrão de uma vez por dia.

#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

Exemplo 4

O exemplo a seguir configura o scanner para ser executado uma vez por dia e desativa uma recomendação específica do 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

Como usar a política do SO

É possível usar uma política do SO para configurar a verificação do comparativo de mercado do CIS. Antes de começar, confira se você conhece a política do SO, incluindo o seguinte:

Além disso, adicione as opções instanceFilter e rollout nos exemplos a seguir para a implantação.

Exemplo 1

A configuração de exemplo a seguir inicia a verificação periódica de CIS de nível 1 com o período padrão de uma vez por dia.

# 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

Exemplo 2

O exemplo a seguir configura a verificação periódica de CIS de nível 1 uma 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

Exemplo 3

O exemplo a seguir configura a verificação periódica de CIS de nível 2 com o período padrão de uma vez por dia.

# 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

Exemplo 4

O exemplo a seguir configura o scanner para ser executado uma vez por dia e desativa uma recomendação específica do 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

Solução de problemas

Esta seção descreve como resolver problemas relacionados à verificação de comparativo de mercado do CIS.

A configuração de uma instância para obedecer às recomendações do CIS de nível 2 falha

O serviço cis-level2 primeiro configura a instância para obedecer às recomendações do CIS de nível 2 e depois verifica a conformidade com os níveis 1 e 2 do CIS. Se a configuração da instância falhar, o serviço cis-level2 será encerrado com a seguinte mensagem de erro:

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.

Os registros do diário vão mencionar as recomendações que não foram aplicadas na instância e resultaram na falha do serviço cis-level2 do systemd.

Falha na verificação de compliance com o CIS nível 1 ou 2

Os resultados da verificação de cada execução da conformidade no nível do CIS são gravados em /var/lib/google/cis_scanner_scan_result.textproto. Se alguma das verificações de nível 1 ou 2 do CIS falhar, o arquivo textproto vai conter a lista de todas as verificações com falha, como no exemplo a seguir:

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 as verificações com falha, use o Comparativo de mercado do CIS e siga as etapas na seção Remediation para a verificação com falha e deixe a instância em conformidade. Para saber qual recomendação corresponde a uma verificação com falha no comparativo de mercado do CIS, procure o ID non_compliant_benchmark's no arquivo de configuração do scanner do CIS localizado em /usr/share/google/security/cis-compliance/cis_config.textproto.