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

Ao visualizar uma política de permissão, você verá nomes de papéis que incluem a string withcond, seguida de 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 formulário é conhecido como uma versão da política de permissão.

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 que você possa visualizar e atualizar toda a política de permissões, incluindo as condições dela, sempre especifique a versão 3 ao receber ou definir uma política de permissão. 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 CLI do Google Cloud, execute gcloud version para verificar o número da versão. A saída inclui uma string semelhante a Google Cloud CLI 279.0.0.

Se o número da versão for menor que 263.0.0, execute gcloud components update para atualizar a CLI gcloud. Na versão 263.0.0 e posteriores, a CLI gcloud especifica automaticamente uma versão da política de permissão que aceita 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. Continue 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 gerenciamento para políticas

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 para receber ou definir uma política de permissão especificam a versão 3
  • Todas as solicitações para definir uma política de permissão incluem o campo etag.

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 de permissão ao solicitar a política de permissão. Portanto, você recebe uma versão de política de permissão 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 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