Configurar e verificar a conformidade com o CIS

Este documento explica o que é a CIS Benchmark, como a benchmark se relaciona com o SO otimizado para contentores (COS), como auditar o estado de conformidade na instância e como resolver problemas em caso de falha.

Vista geral

O Centro para a Segurança da Internet (CIS) publica referências para recomendações de segurança de práticas recomendadas para várias plataformas. A norma CIS do SO otimizado para contentores é um conjunto de recomendações para configurar instâncias que usam o SO otimizado para contentores para suportar uma postura de segurança forte. As imagens COS x86 e ARM estão em conformidade com a CIS.

Aceder ao teste de referência

A norma de referência do CIS do SO otimizado para contentores está disponível no Website do CIS:

Níveis de recomendações de segurança

O CIS define os seguintes níveis de recomendações para o SO otimizado para contentores.

Nível 1

As recomendações neste nível destinam-se a ser aplicáveis à maioria dos ambientes. Este nível inclui recomendações como as seguintes:

  • A aleatorização do esquema do espaço de endereços está ativada
  • Não é possível usar o /tmp para executar ficheiros binários executáveis
  • O envio de redirecionamento de pacotes está desativado

Nível 2

As recomendações neste nível expandem as recomendações do Nível 1, o que resulta num ambiente de segurança mais rigoroso. As recomendações de nível 2 não são necessariamente aplicáveis a todos os casos, uma vez que podem exigir alterações à aplicação. Deve avaliar as recomendações no nível 2 para o seu ambiente antes de as aplicar. Este nível inclui recomendações como as seguintes:

  • Existem regras de firewall para todas as portas abertas
  • Os redirecionamentos ICMP e os anúncios de routers não são aceites
  • O tempo limite da shell do utilizador predefinido é de 900 segundos ou menos

Como o SO otimizado para contentores está em conformidade com as referências da CIS

A partir da Milestone 97, as imagens do SO otimizado para contentores estão em conformidade com o Nível 1 da CIS por predefinição e oferecem uma opção para estarem em conformidade com o Nível 2 da CIS. Também disponibilizamos um scanner que pode usar para auditar a 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á presente em /usr/share/google/security/cis-compliance/cis_config.textproto. O analisador de CIS usa a configuração para verificar o estado de conformidade da instância. Os resultados de cada execução do verificador de conformidade ao nível da CIS são escritos em /var/lib/google/cis_scanner_scan_result.textproto. Este ficheiro é substituído em cada execução do analisador de CIS. Se alguma das análises de Nível 1 ou Nível 2 do CIS falhar, o ficheiro cis_scanner_scan_result.textproto contém uma lista de todas as verificações com falhas.

Verifique o estado de conformidade da instância

As imagens do SO otimizado para contentores fornecem os seguintes serviços systemd para verificação e configuração da conformidade:

  • cis-level1.service: ativado por predefinição e iniciado no arranque. Quando o serviço é iniciado, verifica se a instância está em conformidade com o nível 1 da CIS.
  • cis-level2.service: desativado por predefinição. Este serviço permite-lhe configurar a instância de acordo com o nível 2 da CIS e verifica o estado de conformidade com os níveis 1 e 2.

As secções seguintes explicam como verificar o estado de conformidade da instância e como automatizar o processo de auditoria.

Verifique o estado de conformidade com a norma CIS de nível 1

Para ver se a sua instância está em conformidade com o Nível 1 da CIS, verifique o estado do cis-level1.service:

systemctl status cis-level1

O resultado é semelhante ao seguinte:

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 forem encontradas verificações não conformes, consulte o artigo A verificação de conformidade com a CIS de nível 1/nível 2 falha.

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

Configure a conformidade com o CIS Nível 2 e verifique o estado

Pode usar o serviço cis-level2 para configurar a instância de modo a agir em conformidade com o Nível 2 da CIS e verificar o estado de conformidade com os Níveis 1 e 2. O serviço systemd suporta todas as recomendações do CIS Nível 2, exceto as seguintes:

  • 4.1.1.2 Certifique-se de que o registo está em execução (ID: logging-service-running)

    Esta recomendação está desativada por predefinição, mas pode ser reativada eliminando o ID da lista de desativação, que pode encontrar no ficheiro /etc/cis-scanner/env_vars. Esta verificação só existe nas conquistas 109 e posteriores. Nas etapas anteriores, a ativação do registo por si só torna-o em conformidade com esta recomendação. Se anular a desativação, a execução do serviço cis-level2 executa um script que inicia o registo do fluent-bit. Mantenha a opção logging-service-running desativada se não quiser usar o nosso registo predefinido ou se quiser usar o seu próprio registo.

Para as seguintes recomendações, o serviço cis-level2 configura a instância, mas não valida o estado de conformidade:

  • 105 e inferior:

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

    • 3.3.1.4 Certifique-se de que existem regras de firewall IPv6 para todas as portas abertas

O serviço cis-level2 está desativado por predefinição. Para iniciar o serviço, execute o seguinte comando:

systemctl start cis-level2.service

Para ver se a sua instância está configurada com êxito e em conformidade com as recomendações do CIS de nível 2, verifique o estado de cis-level2.service:

systemctl status cis-level2

O resultado é semelhante ao seguinte:

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 forem encontradas verificações não conformes, consulte a secção Resolução de problemas.

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

Verificação periódica do estado de conformidade com a CIS

As imagens do SO otimizado para contentores incluem os seguintes serviços para verificar periodicamente a conformidade com a CIS:

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

Configure o serviço de scanner

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

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

# 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=""

Configure o temporizador

Para configurar a análise de conformidade periódica, inicie a unidade cis-compliance-scanner.timer:

systemctl start cis-compliance-scanner.timer

Por predefinição, o cis-compliance-scanner.timer é iniciado cis-compliance-scanner.service vez por dia. Para alterar o período de análise, 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 de análise como uma vez por hora.

Para aplicar as alterações, recarregue as unidades systemd:

systemctl daemon-reload

Desativar verificações de conformidade com a CIS específicas

As recomendações do Nível 1 e Nível 2 do CIS são feitas para serem 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 ficheiro de exemplo env_vars seguinte 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"

Automatize a ativação e a verificação do estado de conformidade com o CIS

Pode automatizar o processo de verificação da conformidade para as suas instâncias através do cloud-init ou da política de SO. Os exemplos seguintes mostram alguns exemplos de utilização com cada ferramenta:

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

Usar o cloud-init

Antes de experimentar os exemplos seguintes, certifique-se de que está familiarizado com a configuração de uma instância do COS com o cloud-init seguindo as instruções em Usar o cloud-init com o formato de configuração na nuvem.

Exemplo 1

A configuração de exemplo seguinte inicia a análise periódica do Nível 1 da CIS com o período predefinido 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 seguinte configura a análise periódica do Nível 1 da CIS 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 seguinte configura a análise periódica de nível 2 da CIS com o período predefinido 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 seguinte configura o verificador para ser executado uma vez por dia e desativa uma recomendação específica da 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 a política do SO

Pode usar uma política do SO para configurar a análise de referências da CIS. Antes de começar, certifique-se de que conhece a Política de SO, incluindo o seguinte:

Além disso, tem de adicionar as opções instanceFilter e rollout nos exemplos seguintes para a implementação.

Exemplo 1

A configuração de exemplo seguinte inicia a análise periódica do Nível 1 da CIS com o período predefinido 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 seguinte configura a análise periódica do Nível 1 da CIS 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 seguinte configura a análise periódica de nível 2 da CIS com o período predefinido 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 seguinte configura o verificador para ser executado uma vez por dia e desativa uma recomendação específica da 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

Resolução de problemas

Esta secção descreve como resolver problemas relacionados com a análise de referência da CIS.

A configuração de uma instância para agir em conformidade com as recomendações do CIS de nível 2 falha

O serviço cis-level2 configura primeiro a instância para agir em conformidade com as recomendações do nível 2 da CIS e, em seguida, verifica a conformidade com os níveis 1 e 2 da CIS. Caso a configuração da instância falhe, o serviço cis-level2 é terminado 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 registos do diário vão mencionar as recomendações que não foram aplicadas na instância e que resultaram na falha do serviço cis-level2 systemd.

A verificação de conformidade com a CIS de Nível 1 ou Nível 2 falha

Os resultados da análise de cada execução da conformidade ao nível da CIS são escritos em /var/lib/google/cis_scanner_scan_result.textproto. Se alguma das análises de Nível 1 ou Nível 2 da CIS falhar, o ficheiro textproto contém a lista de todas as verificações com falhas, como no exemplo seguinte:

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 falhas, use a referência CIS e siga os passos na secção Remediation para a verificação com falhas para tornar a instância compatível. Para saber que recomendação corresponde a uma verificação com falhas na norma de referência do CIS, procure o ID non_compliant_benchmark's no ficheiro de configuração do analisador do CIS localizado em /usr/share/google/security/cis-compliance/cis_config.textproto.