Use a identidade da carga de trabalho com a AWS

A identidade da carga de trabalho permite que você atribua identidades e autorizações distintas e granulares para cada aplicativo em seu cluster. A identidade da carga de trabalho é a maneira recomendada para aplicativos em execução no GKE na AWS acessarem a AWS e Google Cloud serviços. Para obter mais informações, consulte Identidade da carga de trabalho .

Este tópico explica como criar um provedor OIDC, provisionar contas de serviço e testar uma carga de trabalho de exemplo usando a identidade da carga de trabalho. Esta página é para administradores de identidade e conta, operadores e desenvolvedores que desejam criar e gerenciar políticas relacionadas a permissões de usuário. Para saber mais sobre funções comuns e tarefas de exemplo que mencionamos em Google Cloud conteúdo, consulte Funções e tarefas comuns do usuário do GKE Enterprise .

Crie um provedor AWS IAM OIDC para seu cluster

Para usar a identidade da carga de trabalho com seu cluster, primeiro crie um provedor OIDC do IAM da AWS que faça referência ao seu cluster. Se você já possui um provedor OIDC do IAM para o seu cluster, pode pular esta seção.

Para criar o provedor, siga estas etapas:

  1. Determine o URI do emissor do OIDC para seu cluster:

    gcloud container aws clusters describe CLUSTER_NAME \
         --location=GOOGLE_CLOUD_LOCATION \
         --format='value(workloadIdentityConfig.issuerUri)'
    

    Substitua o seguinte:

    • CLUSTER_NAME : o nome do seu cluster
    • GOOGLE_CLOUD_LOCATION : o nome do Google Cloudlocal a partir do qual este pool de nós será gerenciado, conforme definido em Google Cloud regiões de gestão

    A saída inclui o URI do emissor do OIDC do seu cluster. Salve esse valor para a próxima etapa.

  2. Em seguida, crie um provedor AWS IAM OIDC que faça referência ao seu cluster com o seguinte comando:

    aws iam create-open-id-connect-provider \
        --url ISSUER_URI \
        --client-id-list sts.amazonaws.com \
        --thumbprint-list 08745487e891c19e3078c1f2a07e452950ef36f6
    

    Substitua ISSUER_URI pelo URI do emissor da etapa anterior.

    A impressão digital do Google Cloud o serviço que atende o URI do emissor é sempre 08745487e891c19e3078c1f2a07e452950ef36f6 .

Configurar uma função do AWS IAM com uma política do IAM anexada

Para configurar uma função do AWS IAM e anexar uma política a ela, siga estas etapas:

  1. Determine o host emissor removendo o prefixo https:// do URI do emissor. Por exemplo, se o seu URI for https://oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster , o host será oidc-provider.com/v1/projects/pid/locations/us-west1/awsClusters/awscluster . Salve este valor. Você precisará dele mais tarde.

  2. Determine o Amazon Resource Name (ARN) do provedor executando:

    aws iam list-open-id-connect-providers --output=text \
        --query 'OpenIDConnectProviderList[?ends_with(Arn, `ISSUER_HOST`) == `true`].Arn'
    

    Substitua ISSUER_HOST pelo nome do host do URI do emissor do cluster.

  3. Em seguida, crie uma política de confiança para fornecer credenciais OIDC à conta de serviço do Kubernetes. Crie um arquivo chamado trust-policy.json com o seguinte conteúdo:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "PROVIDER_ARN"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "ISSUER_HOST:sub": "system:serviceaccount:NAMESPACE:KSA_NAME"
            }
          }
        }
      ]
    }
    

    Substitua o seguinte:

    • PROVIDER_ARN : o ARN do provedor IAM OIDC do cluster
    • ISSUER_HOST : o nome do host do URI do emissor para o cluster.
    • NAMESPACE : o namespace do Kubernetes onde o aplicativo é executado
    • KSA_NAME : a conta de serviço do Kubernetes (KSA) a ser usada para o aplicativo
  4. Crie uma função do AWS IAM:

    aws iam create-role --role-name=AWS_ROLE_NAME \
        --assume-role-policy-document file://trust-policy.json
    

    Substitua AWS_ROLE_NAME pelo nome da função do AWS IAM para o aplicativo.

  5. Anexe uma política do AWS IAM à função:

    aws iam attach-role-policy --role-name=AWS_ROLE_NAME \
        --policy-arn=AWS_POLICY_ARN
    

    Substitua o seguinte:

    • AWS_ROLE_NAME : o nome da função do AWS IAM para o aplicativo

    Por exemplo, para criar uma função chamada ec2-readonly , com a arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess , execute o seguinte comando:

    aws iam attach-role-policy --role-name=ec2-readonly \
        --policy-arn=arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

Implantar um aplicativo de amostra

Para testar a identidade da carga de trabalho, siga estas etapas para implantar um aplicativo de exemplo:

  1. Determine o ARN da função:

    aws iam get-role --role-name=AWS_ROLE_NAME --query 'Role.Arn'
    

    Substitua AWS_ROLE_NAME .

  2. Crie um manifesto para um namespace, KSA e pod do Kubernetes. Copie o seguinte manifesto em um arquivo chamado workload-identity-test.yaml :

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: aws-cli-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: aws-cli
        image: amazon/aws-cli:latest
        command:
        - /bin/bash
        - -c
        - "set -eu -o pipefail; while true; do aws ec2 describe-availability-zones; sleep 5; done"
        env:
        - name: AWS_ROLE_ARN
          value: AWS_ROLE_ARN
        - name: AWS_WEB_IDENTITY_TOKEN_FILE
          value: /var/run/secrets/aws-iam-token/serviceaccount/token
        - name: AWS_REGION
          value: AWS_REGION
        volumeMounts:
        - mountPath: /var/run/secrets/aws-iam-token/serviceaccount
          name: aws-iam-token
          readOnly: true
      volumes:
      - name: aws-iam-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: sts.amazonaws.com
              expirationSeconds: 86400
              path: token
    

    Substitua o seguinte:

    • NAMESPACE
    • KSA_NAME
    • AWS_ROLE_ARN : o ARN da função AWS IAM para o aplicativo
    • AWS_REGION : a região AWS do cluster
  3. Aplique o manifesto:

    kubectl apply -f workload-identity-test.yaml
    

    Aguarde alguns minutos para que o Pod inicie e prossiga para a próxima seção.

Verifique se o aplicativo de exemplo está funcionando

Para verificar se o aplicativo de exemplo pode acessar a API do EC2, observe os logs do pod:

kubectl logs -f aws-cli-example -n NAMESPACE

Se o Pod puder acessar a API do EC2, a saída incluirá informações sobre zonas de disponibilidade do EC2 e será semelhante ao seguinte:

-------------------------------------------------
|           DescribeAvailabilityZones           |
+-----------------------------------------------+
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az1             ||
||  ZoneName           |  us-west-2a           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az2             ||
||  ZoneName           |  us-west-2b           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az3             ||
||  ZoneName           |  us-west-2c           ||
|+---------------------+-----------------------+|
||              AvailabilityZones              ||
|+---------------------+-----------------------+|
||  GroupName          |  us-west-2            ||
||  NetworkBorderGroup |  us-west-2            ||
||  OptInStatus        |  opt-in-not-required  ||
||  RegionName         |  us-west-2            ||
||  State              |  available            ||
||  ZoneId             |  usw2-az4             ||
||  ZoneName           |  us-west-2d           ||
|+---------------------+-----------------------+|

Limpar

Para remover este aplicativo de exemplo, siga estas etapas:

  1. Exclua o manifesto do aplicativo de exemplo do seu cluster:

    kubectl delete -f workload-identity-test.yaml
    
  2. Desvincule a política do AWS IAM da função:

    aws iam detach-role-policy --role-name AWS_ROLE_NAME \
        --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
    

    Substitua AWS_ROLE_NAME pelo nome da função do AWS IAM para o aplicativo.

  3. Excluir a função do AWS IAM:

    aws iam delete-role --role-name AWS_ROLE_NAME
    

    Substitua AWS_ROLE_NAME pelo nome da função do AWS IAM para o aplicativo.

  4. Exclua o provedor AWS IAM OIDC:

    aws iam delete-open-id-connect-provider --open-id-connect-provider-arn PROVIDER_ARN
    

    Substitua PROVIDER_ARN pelo ARN do provedor IAM OIDC do cluster.

O que vem a seguir