Solução de problemas de "withcond" nas vinculações de papéis e políticas

Quando você visualiza uma política de gerenciamento de identidade e acesso (IAM, na sigla em inglês), é possível ver nomes de papéis que incluem a string withcond, seguida por um valor de hash. Por exemplo, um nome de papel pode ser exibido como roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

Nesta página, explicamos quando e por que a string withcond é exibida em uma política do IAM. Saiba também quais são as ações recomendadas caso essa string seja exibida.

Versões de política e vinculações de papéis condicionais

Uma política do IAM pode ser representada de várias formas diferentes. Cada forma é conhecida como uma versão da política.

Em uma política do IAM que usa a versão 1, algumas vinculações de papel podem conter a string withcond em um nome de papel, seguido por um valor de hash:

{
  "bindings": [
    {
      "members": [
        "user:dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Esse formato indica que a vinculação de papel é condicional. Em outras palavras, o papel é concedido apenas se condições específicas forem atendidas.

As políticas de versão 1 não mostram essas condições. Se você vir a string withcond e um valor de hash, a vinculação de papel incluirá uma condição que não será exibida.

Solução: especifique a versão 3 da política

Para garantir a visualização e a atualização de toda a política do IAM, incluindo as condições dela, sempre especifique a versão da política 3 nas solicitações. Para especificar a versão 3 da política, conclua as tarefas nas seções a seguir.

Atualizar a ferramenta gcloud

Se você usar a ferramenta de linha de comando gcloud, execute gcloud version para verificar o número da versão. A saída inclui uma string semelhante a Google Cloud SDK 279.0.0.

Se o número da versão for menor que 263.0.0, execute gcloud components update para atualizar a ferramenta gcloud. Na versão 263.0.0 e posterior, a ferramenta gcloud especifica automaticamente uma versão da política compatível com as condições.

Atualizar bibliotecas de clientes

Se seu aplicativo usa uma biblioteca de cliente, siga estas etapas:

  1. Encontre o nome e o número da versão da biblioteca de cliente e, em seguida, consulte a lista de bibliotecas de cliente compatíveis com versões de política.

    • Se você já usa uma versão recente da biblioteca de cliente e ela é compatível com a versões de política, não é necessário atualizar sua biblioteca de cliente. Passe para a próxima etapa.

    • Se você usar uma versão mais antiga da biblioteca de cliente e uma versão mais recente for compatível com versões de política, atualize a biblioteca de cliente para a versão mais recente.

    • Se você usar uma biblioteca de cliente que não seja compatível com versões de políticas, poderá adicionar outra biblioteca de cliente que seja compatível com versões de política para seu aplicativo. Use essa biblioteca de cliente para trabalhar com as políticas do IAM. Como alternativa, é possível usar a API REST do IAM diretamente.

  2. Atualize qualquer código no aplicativo que receba e defina políticas do IAM:

Atualizar chamadas da API REST

Se o aplicativo usar a API REST do IAM diretamente, atualize qualquer código que receba e defina políticas do IAM:

Atualizar ferramentas de gestão para políticas do IAM

Se você mantiver cópias locais das políticas do IAM, por exemplo, se armazená-las em um sistema de controle de versões e tratá-las como código, verifique se todas as ferramentas usadas atendem a estes critérios:

  • Todas as solicitações especificam a versão 3 da política.
  • Todas as solicitações para atualizar uma política incluem o campo etag na solicitação.

Se uma ferramenta não atender a esses critérios, procure uma versão atualizada da ferramenta.

Além disso, verifique se suas ferramentas de gerenciamento preservam as concessões de papel condicional, em vez de adicionar uma concessão de papel duplicado que não inclua uma condição. Por exemplo, considere o seguinte cenário:

  1. Você concede o papel Criar contas de serviço (roles/iam.serviceAccountCreator) para o usuário vikram@example.com na pasta my-folder. A política do IAM para a pasta é semelhante a este exemplo:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. Você usa uma ferramenta para recuperar a política do IAM e armazená-la em um sistema de controle de versões.

  3. Você adiciona uma condição para que vikram@example.com crie contas de serviço somente durante a semana normal de trabalho, com base na data e hora em Berlim, na Alemanha. A política atualizada do IAM é semelhante a este exemplo:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. Você usa uma ferramenta para recuperar a política do IAM atualizada. A ferramenta não especifica uma versão da política ao solicitá-la. Portanto, você recebe a versão 1 da política com um nome de papel modificado:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

Neste ponto, a ferramenta de gerenciamento pode decidir que a vinculação de vikram@example.com ao papel roles/iam.serviceAccountCreator desapareceu e que precisa restaurar a vinculação de papel original à política:

Evitar: vinculação de papel adicional sem condição

{
  "bindings": [
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

Esta alteração não está correta. Ela concede o papel roles/iam.serviceAccountCreator a vikram@example.com independentemente do dia da semana. Como resultado, a condição da primeira vinculação de papel não tem efeito.

Se suas ferramentas de gerenciamento tentarem fazer esse tipo de alteração, não aprove a alteração. Em vez disso, você precisa atualizar suas ferramentas de gerenciamento para especificar a versão 3 da política nas solicitações.

A seguir