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

Quando você visualiza uma política do Cloud Identity and Access Management (Cloud IAM), talvez veja nomes de papéis que incluem a string withcond, seguida por um valor de hash. Por exemplo, você pode ver um nome de papel como roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

Esta página explica quando e por que você pode ver a sequência withcond em uma política do Cloud IAM. Ele também recomenda ações que você precisa tomar se vir essa string.

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

Uma política do Cloud IAM pode ser representada em vários formulários diferentes. Cada formulário é conhecido como uma versão da política.

Em uma política do Cloud IAM que usa a versão 1, algumas vinculações de papel podem conter a string withcond em um nome do 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 1 da versão 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 que você possa visualizar e atualizar toda a política do Cloud IAM, incluindo as respectivas condições, sempre especifique 3 da versão da política em suas solicitações. Para especificar 3 da versão 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-cliente e, em seguida, consulte a lista de bibliotecas-cliente compatíveis com as versões de política.

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

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

    • Se você usar uma biblioteca 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 Cloud IAM. Como alternativa, você pode usar a API REST do Cloud IAM diretamente.

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

Atualizar chamadas da API REST

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

Atualizar ferramentas de gerenciamento para políticas do Cloud IAM

Se você mantém cópias locais das políticas do Cloud IAM, por exemplo, se as armazena em um sistema de controle de versão e as trata como código, verifique se todas as ferramentas usadas atendem a estes critérios:

  • Todas as solicitações especificam 3 da versão 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 para criar contas de serviço (roles/iam.serviceAccountCreator) para o usuário vikram@example.com na pasta my-folder. A política do Cloud 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 Cloud IAM e armazená-la em um sistema de controle de versão.

  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 do Cloud IAM atualizada será 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 Cloud IAM atualizada. A ferramenta não especifica uma versão da política quando ela solicita a política. Portanto, você recebe uma versão com a política 1 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 papelroles/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 para vikram@example.com independentemente do dia da semana. Como resultado, a condição na 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 3 da versão de política nas solicitações.

A seguir