Guia de início rápido: monitorar a segurança dos pods com validação contínua

Saiba como começar a usar a validação contínua de autorização binária (CV) com políticas baseadas em verificação. Neste guia de início rápido, use as seguintes verificações de CV para validar continuamente os pods em execução para as seguintes condições:

  • Diretório confiável: verifica se as imagens associadas ao pod residem em um ou mais diretórios confiáveis especificados na política.
  • Atualização de imagem: verifica se as imagens do pod foram enviadas dentro de um número de dias especificado na política.

Antes de começar

  1. Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a Google Cloud CLI.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Selecione ou crie um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: a seleção de um projeto não exige um papel específico do IAM. Você pode selecionar qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, você precisa do papel de criador de projetos (roles/resourcemanager.projectCreator), que contém a resourcemanager.projects.create permissão. Saiba como conceder papéis.
    • Crie um Google Cloud projeto do:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o Google Cloud projeto que você está criando.

    • Selecione o Google Cloud projeto que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do Google Cloud projeto.

  6. Verifique se o faturamento está ativado para o Google Cloud projeto.

  7. Ative as APIs de autorização binária e do Google Kubernetes Engine:

    Funções necessárias para ativar APIs

    Para ativar as APIs, você precisa do papel do IAM de administrador de uso do serviço (roles/serviceusage.serviceUsageAdmin), que contém a serviceusage.services.enable permissão. Saiba como conceder papéis.

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  8. Instale a Google Cloud CLI.

  9. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. Selecione ou crie um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: a seleção de um projeto não exige um papel específico do IAM. Você pode selecionar qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, você precisa do papel de criador de projetos (roles/resourcemanager.projectCreator), que contém a resourcemanager.projects.create permissão. Saiba como conceder papéis.
    • Crie um Google Cloud projeto do:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o Google Cloud projeto que você está criando.

    • Selecione o Google Cloud projeto que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do Google Cloud projeto.

  12. Verifique se o faturamento está ativado para o Google Cloud projeto.

  13. Ative as APIs de autorização binária e do Google Kubernetes Engine:

    Funções necessárias para ativar APIs

    Para ativar as APIs, você precisa do papel do IAM de administrador de uso do serviço (roles/serviceusage.serviceUsageAdmin), que contém a serviceusage.services.enable permissão. Saiba como conceder papéis.

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  14. Instale a ferramenta de linha de comando kubectl.
  15. Se as políticas de autorização binária e os clusters do GKE estiverem em projetos diferentes, verifique se a autorização binária está ativada nos dois projetos.

Criar uma política de plataforma

Para configurar uma política da plataforma de CV do GKE, faça isto:

  1. Crie o arquivo YAML de política da plataforma:

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - trustedDirectoryCheck:
            trustedDirPatterns:
            - us-central1-docker.pkg.dev/my-project/my-directory
          displayName: My trusted directory check
        - imageFreshnessCheck:
            maxUploadAgeDays: 30
          displayName: My image freshness check
        displayName: My trusted directory and image freshness check set
    EOF
    

    Essa política verifica as seguintes condições:

    • As imagens dos pods são armazenadas no repositório do Artifact Registry chamado us-central1-docker.pkg.dev/my-project/my-directory.

    • As imagens dos pods foram enviadas para os repositórios Artifact Registry ou Container Registry nos últimos 30 dias.

  2. Crie a política da plataforma:

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=/tmp/my-policy.yaml \
        --project=POLICY_PROJECT_ID
    

    Substitua:

    • POLICY_ID: um ID de sua escolha
    • POLICY_PROJECT_ID: o ID do projeto de política

Criar ou atualizar um cluster

Para ativar o CV em um cluster, crie um novo cluster ou atualize um cluster existente.

  • Para criar um cluster com a política de plataforma baseada em verificação ativada, execute o seguinte comando:

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    Substitua:

    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: o local. Por exemplo: us-central1 ou asia-south1.
    • POLICY_PROJECT_ID: o ID do projeto em que a política está armazenada
    • POLICY_ID: o ID da política
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Aguarde a criação do cluster.

  • Para atualizar um cluster com políticas baseadas em verificação ativadas, execute o comando a seguir.

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    Substitua:

    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: o local. Por exemplo: us-central1 ou asia-south1.
    • POLICY_PROJECT_ID: o ID do projeto em que a política está armazenada
    • POLICY_ID: o ID da política
    • CLUSTER_PROJECT_ID: o ID do projeto do cluster

    Aguarde a atualização do cluster.

Implantar uma imagem

  1. Consiga a credencial de kubectl:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  2. Implantar uma imagem:

    kubectl run hello-app \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    

    A imagem us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 satisfaz a verificação de atualização porque ela foi enviada para o repositório nos últimos 30 dias. No entanto, a imagem não atende à verificação de diretório confiável porque ela não está em us-central1-docker.pkg.dev/my-project/my-directory. Como resultado, o CV produz TrustedDirectoryCheck entradas de registro no Cloud Logging.

Visualize os registros

A entrada de registro aparece no Cloud Logging até 24 horas após a implantação do pod, mas pode aparecer em algumas horas.

Para ver o registro no Cloud Logging, use o seguinte filtro:

logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation"
"policyName"

O registro do pod hello-app é semelhante ao abaixo. Alguns campos podem ser diferentes dependendo do ID do projeto, do nome do cluster etc.

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/1234567890/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "Default check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

A entrada de registro mostra informações sobre a violação da política, incluindo os seguintes campos:

  • policyName: uma política da plataforma que a CV estava usando quando identificou a violação
  • checkResults: um bloco de resultados que inclui os seguintes campos:

    • explanation: uma mensagem de erro
    • checkSetName: o valor de displayName para o conjunto de verificação
    • checkSetIndex: o índice da verificação definida na política
    • checkName: o nome da verificação
    • checkIndex: o índice da verificação no conjunto de verificação
    • verdict: o veredito que resultou na entrada de registro, neste caso NOT_CONFORMANT porque a verificação não foi atendida.

Algumas verificações podem incluir outras informações que podem ajudar a entender por que a verificação não foi atendida.

Como a imagem cumpriu a verificação, ela não aparece no registro.

Liberar espaço

Para evitar cobranças na conta do Google Cloud pelos recursos usados nesta página, exclua o Google Cloud projeto do e os recursos.

Nesta seção, descrevemos como liberar espaço do monitoramento de CV configurado anteriormente neste guia.

É possível desativar o monitoramento de CV ou a autorização binária e a CV no cluster.

Desativar a autorização binária em um cluster

Para desativar a aplicação do CV e da autorização binária no seu cluster, execute o seguinte comando:

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • LOCATION: o local do cluster
  • CLUSTER_PROJECT_ID: o ID do projeto do cluster

Desativar o monitoramento de políticas com base em verificações em um cluster

Para desativar o CV com políticas baseadas em verificação no cluster e reativar a aplicação usando a política de autorização binária, execute o seguinte comando:

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • LOCATION: o local do cluster
  • CLUSTER_PROJECT_ID: o ID do projeto do cluster

Observe que --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE é equivalente à sinalização --enable-binauthz mais antiga.

Exclua a política:

Para excluir a política, execute o comando a seguir. Não é necessário excluir a política de plataforma com base em verificação para desativar esse tipo de auditoria.

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

Substitua:

  • POLICY_ID: o ID da política
  • POLICY_PROJECT_ID: o ID do projeto de política

A seguir