Autenticação com OpenID Connect (OIDC)

Aprenda a configurar o GKE na AWS para usar o OpenID Connect (OIDC) para autenticação em clusters de usuários. Este tópico aborda o processo de configuração do GKE na AWS com qualquer provedor OpenID.

Para atualizar um cluster que usa autenticação OIDC para o Kubernetes 1.21, consulte Atualizar para 1.21 .

Para uma visão geral do fluxo de autenticação do GKE na AWS, consulte Autenticação .

Visão geral

O GKE na AWS oferece suporte ao OIDC como um dos mecanismos de autenticação para interação com o servidor da API do Kubernetes de um cluster de usuários. Com o OIDC, você pode gerenciar o acesso aos clusters do Kubernetes usando os procedimentos padrão da sua organização para criar, habilitar e desabilitar contas de usuário.

Antes de começar

  • Este tópico pressupõe que você esteja familiarizado com os seguintes conceitos de autenticação e OpenID:

  • O Google Cloud CLI deve ser instalado na máquina local de cada desenvolvedor.

  • Sistemas headless não são suportados. Para autenticar, você precisa abrir um navegador na máquina local que executa a CLI do gcloud. O navegador então solicitará que você autorize sua conta de usuário.

  • Para autenticar através do Google Cloud console, cada cluster que você deseja configurar para autenticação OIDC deve ser registrado com Google Cloud .

Personas

Este tópico se refere a três personas:

  • Administrador da organização : essa pessoa escolhe um provedor OpenID e registra aplicativos clientes com o provedor.

  • Administrador de cluster : essa pessoa cria um ou mais clusters de usuários e cria arquivos de configuração de autenticação para desenvolvedores que usam os clusters.

  • Desenvolvedor : essa pessoa executa cargas de trabalho em um ou mais clusters e usa o OIDC para autenticação.

Escolha um provedor OpenID

Esta seção é para administradores de organizações .

Você pode usar qualquer provedor OpenID de sua escolha. Para obter uma lista de provedores certificados, consulte Certificação OpenID .

Criar URLs de redirecionamento

Esta seção é para administradores de organizações .

O provedor OpenID usa URLs de redirecionamento para retornar tokens de ID. Você deve criar URLs de redirecionamento para a CLI do gcloud e para oGoogle Cloud console.

Definir a URL de redirecionamento da CLI do gcloud

Ao configurar seu provedor OpenID, especifique sua URL de redirecionamento CLI como http://localhost: PORT /callback

Substitua PORT pelo seu número de porta maior que 1024.

Defina o Google Cloud URL de redirecionamento do console

O URL de redirecionamento para o Google Cloud console é:

https://console.cloud.google.com/kubernetes/oidc

Ao configurar seu provedor OIDC, especifique https://console.cloud.google.com/kubernetes/oidc como uma das suas URLs de redirecionamento.

Registre seus aplicativos de cliente com o provedor OpenID

Esta seção é para administradores de organizações .

Antes que seus desenvolvedores possam usar o Google Cloud CLI ou o Google Cloud console com seu provedor OpenID, você precisa registrar esses dois clientes com o provedor OpenID. O registro inclui estas etapas:

  • Aprenda o URI do emissor do seu provedor. O CLI do gcloud ouGoogle Cloud o console envia solicitações de autenticação para este URI.

  • Configure seu provedor com o URL de redirecionamento, incluindo seu número de porta, para o gcloud CLI.

  • Configure seu provedor com o URL de redirecionamento para o Google Cloud console, https://console.cloud.google.com/kubernetes/oidc .

  • Crie um único ID de cliente que seu provedor usa para identificar o Google Cloud CLI e oGoogle Cloud console.

  • Crie um segredo de cliente único que o CLI do gcloud e o Google Cloud console usado para autenticar o provedor OpenID.

  • Crie um escopo personalizado que o gcloud CLI ou Google Cloud o console pode ser usado para solicitar os grupos de segurança do usuário.

  • Crie um nome de reivindicação personalizado que o provedor usa para retornar os grupos de segurança do usuário.

Configure seu cluster

Esta seção é para administradores de cluster .

Para configurar a autenticação OIDC, você precisa configurar o recurso AWSCluster do seu cluster de usuários com detalhes de autenticação para um cluster. Os detalhes do AWSCluster são usados ​​para configurar o OIDC para ambos Google Cloud console e o Plug-in de Autenticação para o GKE Enterprise. A configuração inclui as seguintes informações do OIDC:

authentication:
  awsIAM:
    adminIdentityARNs:
      - AWS_IAM_ARN
  oidc:
  -   certificateAuthorityData: CERTIFICATE_STRING
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET 
      extraParams:  EXTRA_PARAMS
      groupsClaim:  GROUPS_CLAIM
      groupPrefix:  GROUP_PREFIX
      issuerURI:  ISSUER_URI
      kubectlRedirectURI:  KUBECTL_REDIRECT_URI
      scopes:  SCOPES
      userClaim:  USER_CLAIM
      userPrefix:  USER_PREFIX

Campos de autenticação

A tabela a seguir descreve os campos do objeto authentication.awsIAM.adminIdentityARNs .

A tabela a seguir descreve os campos do objeto `oidc`.
Campo Obrigatório Descrição Formatar
adminIdentityARNs Sim, se estiver configurando o OIDC. Nome de Recurso da Amazon (ARN) das identidades do IAM da AWS (usuários ou funções) que receberam acesso de administrador de cluster do GKE na AWS. Exemplo: arn:aws:iam::123456789012:group/Developers Corda
Campo Obrigatório Descrição Formatar
Dados de Autoridade de Certificado Não Um certificado PEM codificado em base64 para o provedor OIDC. Para criar a string, codifique o certificado, incluindo os cabeçalhos, em base64. Inclua a string resultante em certificateAuthorityData como uma única linha. Exemplo: certificateAuthorityData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tC...k1JSUN2RENDQWFT== Corda
ID do cliente Sim ID do aplicativo cliente que faz solicitações de autenticação ao provedor OpenID. Corda
clienteSecret Não Segredo compartilhado entre o aplicativo cliente OIDC e o provedor OIDC. Corda
parâmetros extras Não Parâmetros chave-valor adicionais para enviar ao provedor OpenID. Se você estiver autorizando um grupo, passe resource=token-groups-claim .

Se o seu servidor de autorização solicitar consentimento, para autenticação com o Microsoft Azure e o Okta, defina extraParams como prompt=consent . Para o Cloud Identity, defina extraParams como prompt=consent,access_type=offline .

Lista delimitada por vírgulas
gruposReivindicação Não Reivindicação JWT que o provedor usa para retornar seus grupos de segurança. Corda
prefixo de grupo Não Prefixo adicionado às declarações de grupo para evitar conflitos com nomes existentes. Por exemplo, se você tiver dois grupos chamados foobar , adicione o prefixo gid- , e o grupo resultante será gid-foobar . Corda
emissorURI Sim URL para onde as solicitações de autorização são enviadas ao seu OpenID, como https://example.com/adfs . O servidor da API do Kubernetes usa essa URL para descobrir chaves públicas para verificar tokens. O URI deve usar HTTPS. Cadeia de caracteres de URL
kubectlRedirectURI Sim A URL de redirecionamento que `kubectl` usa para autorização. Cadeia de caracteres de URL
escopos Sim Escopos adicionais para enviar ao provedor OpenID. O Microsoft Azure e o Okta exigem o escopo offline_access . Lista delimitada por vírgulas
reivindicação do usuário Não Reivindicação JWT a ser usada como nome de usuário. Você pode escolher outras reivindicações, como e-mail ou nome, dependendo do provedor OpenID. No entanto, reivindicações diferentes de e-mail são prefixadas com a URL do emissor para evitar conflitos de nomenclatura. Corda
prefixo do usuário Não Prefixo adicionado às declarações de nome de usuário para evitar conflitos com nomes existentes. Corda

Exemplo: Autorizando usuários e grupos

Muitos provedores codificam propriedades de identificação do usuário, como e-mail e IDs de usuário, em um token. No entanto, essas propriedades apresentam riscos implícitos para as políticas de autenticação:

  • IDs de usuário podem dificultar a leitura e a auditoria de políticas.
  • O uso de endereços de e-mail pode criar um risco de disponibilidade (se um usuário alterar seu e-mail principal) e um risco de segurança (se um e-mail puder ser reatribuído).

Em vez de atribuir IDs de usuário, recomendamos políticas de grupo, que podem ser persistentes e mais fáceis de auditar.

Suponha que seu provedor crie tokens de identidade que incluam os seguintes campos:

{
  'iss': 'https://server.example.com'
  'sub': 'u98523-4509823'
  'groupList': ['developers@example.corp', 'us-east1-cluster-admins@example.corp']
  ...
}

Dado esse formato de token, você preencheria a especificação oidc do seu arquivo de configuração assim:

issuerURL: 'https://server.example.com'
username: 'sub'
usernamePrefix: 'uid-'
group: 'groupList'
groupPrefix: 'gid-'
extraParams: 'resource=token-groups-claim'
...

Depois de criar seu cluster de usuários, use o controle de acesso baseado em função (RBAC) do Kubernetes para conceder acesso privilegiado aos usuários autenticados.

No exemplo a seguir, você cria um ClusterRole que concede aos seus usuários acesso somente leitura aos segredos do cluster e cria um recurso ClusterRoleBinding para vincular a função ao grupo autenticado.

  1. Defina um ClusterRole . Copie o seguinte YAML em um arquivo chamado secret-reader-role.yaml .

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: secret-reader
    rules:
    - apiGroups: [""]
      # The resource type for which access is granted
      resources: ["secrets"]
      # The permissions granted by the ClusterRole
      verbs: ["get", "watch", "list"]
    
  2. Defina um ClusterRoleBinding . Copie o seguinte YAML em um arquivo chamado secret-reader-admins.yaml .

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: read-secrets-admins
    subjects:
      # Allows anyone in the "us-east1-cluster-admins" group to
      # read Secrets in any namespace within this cluster.
    - kind: Group
      name: gid-us-east1-cluster-admins # Name is case sensitive
      apiGroup: rbac.authorization.k8s.io
      # Allows this specific user to read Secrets in any
      # namespace within this cluster
    - kind: User
      name: uid-u98523-4509823
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: secret-reader
      apiGroup: rbac.authorization.k8s.io
    
  3. Aplique secret-reader-role.yaml e secret-reader-admins.yaml ao seu cluster com kubectl .

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f secret-reader-role.yaml && \
      kubectl apply -f secret-reader-admins.yaml
    

    Usuários com acesso concedido em read-secrets-admins agora têm acesso para ler segredos no seu cluster.

Crie uma configuração de login

Esta seção é para administradores de cluster .

Depois de criar um cluster de usuário, você precisa gerar um arquivo de configuração para o cluster usando gcloud anthos create-login-config .

  1. No seu diretório anthos-aws , use anthos-gke para alternar o contexto para seu cluster de usuários.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do seu cluster de usuário.

  2. Crie a configuração com gcloud anthos .

    gcloud anthos create-login-config --kubeconfig usercluster-kubeconfig
    

    Substitua usercluster-kubeconfig pelo caminho para o arquivo kubeconfig do seu cluster de usuários. No Linux e no macOS, por padrão, este arquivo está em ~/.kube/config .

Este comando gera um arquivo ( kubectl-anthos-config.yaml ) contendo as informações de configuração que seus desenvolvedores usam para autenticar no cluster com a CLI do gcloud. Você não deve modificar este arquivo.

Para entender mais sobre o conteúdo de kubectl-anthos-config.yaml , consulte o apêndice .

Distribuir a configuração de login

Distribua o arquivo de configuração aos usuários que precisam se autenticar nos seus clusters de usuários. Você pode distribuir a configuração das seguintes maneiras:

  • Colocando o arquivo no diretório padrão.
  • Distribuindo o arquivo com segurança.
  • Hospedar o arquivo em um servidor HTTPS.

Diretórios padrão de configuração de login

Os locais padrão para armazenar o arquivo de configuração para cada sistema operacional são os seguintes:

Linux
$HOME/.config/google/anthos/kubectl-anthos-config.yaml , onde $HOME é o diretório inicial do usuário.
macOS
$HOME/Library/Preferences/google/anthos/kubectl-anthos-config.yaml , onde $HOME é o diretório inicial do usuário.
Windows
%APPDATA%/google/anthos/kubectl-anthos-config.yaml , onde %APPDATA% é o diretório de dados do aplicativo do usuário.

Após a configuração de login ser distribuída, seus desenvolvedores estarão prontos para configurar o gcloud CLI para acessar o cluster.

Modifique seu cluster após atualizar para o Kubernetes 1.21

Após atualizar seu cluster para o Kubernetes 1.21, você precisará configurar o Serviço de Identidade do GKE e remover as informações do OIDC da configuração do cluster. Para atualizar a configuração, siga estas etapas:

  1. Siga as etapas em Atualizar seu cluster .

  2. No seu diretório anthos-aws , use anthos-gke para alternar o contexto para seu cluster de usuários.

    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Substitua CLUSTER_NAME pelo nome do seu cluster de usuário.

  3. Abra o manifesto que contém o AWSCluster em um editor de texto. Mantenha o arquivo aberto e use os valores do objeto oidc para seguir as etapas em Configurando clusters para o Serviço de Identidade do GKE .

  4. No seu diretório anthos-aws , use anthos-gke para alternar o contexto para seu serviço de gerenciamento.

    cd anthos-aws
    anthos-gke aws management get-credentials

  5. Abra o arquivo YAML que criou seu AWSCluster em um editor de texto. Se você não tiver o arquivo YAML inicial, pode usar kubectl edit .

    Editar YAML

    Se você seguiu as instruções em Criando um cluster de usuários , seu arquivo YAML será chamado cluster-0.yaml . Abra este arquivo em um editor de texto.

    kubectl editar

    Para usar kubectl edit para editar seu AWSCluster, execute o seguinte comando:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl edit awscluster cluster-name
    

    Substitua cluster-name pelo seu AWSCluster. Por exemplo, para editar o cluster padrão, cluster-0 , execute o seguinte comando:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl edit awscluster cluster-0
    
  6. Exclua o objeto oidc do manifesto do seu cluster.

  7. Salve o arquivo. Se você estiver usando kubectl edit , kubectl aplicará as alterações automaticamente. Se estiver editando o arquivo YAML, aplique-o ao seu serviço de gerenciamento com o seguinte comando:

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f cluster-0.yaml
    

    O serviço de gerenciamento então atualiza seu AWSCluster.

Configurando o gcloud para acessar seu cluster

Esta seção é para desenvolvedores ou administradores de cluster .

Pré-requisitos

Para concluir esta seção, você deve concluir o seguinte:

  • Uma configuração de login .
  • Uma versão atualizada do gcloud CLI com os componentes anthos-auth .

    gcloud components update
    gcloud components install anthos-auth
    
  • Verifique se o gcloud CLI foi instalado com sucesso executando o seguinte comando, que deve responder com detalhes sobre os argumentos necessários e as opções disponíveis.

    gcloud anthos auth
    

Autenticar no seu cluster

Você pode se autenticar no seu cluster das seguintes maneiras:

  • Com o gcloud CLI na sua máquina local.
  • Com o gcloud CLI em uma máquina remota usando um túnel SSH.
  • Com Connect no Google Cloud console.

gcloud local

Use gcloud anthos auth login para autenticar seu cluster com sua configuração de login.

Se você tiver definido a configuração de login no local padrão e o nome do cluster estiver configurado, poderá usar gcloud anthos auth login sem opções. Você também pode configurar o cluster, o usuário e outros detalhes de autenticação com parâmetros opcionais.

Padrão

gcloud anthos auth login --cluster CLUSTER_NAME

Substitua CLUSTER_NAME por um nome de cluster totalmente qualificado. Por exemplo, projects/my-gcp-project/locations/global/memberships/cluster-0-0123456a .

Parâmetros opcionais

gcloud anthos auth login oferece suporte aos seguintes parâmetros opcionais:

gcloud anthos auth login --cluster CLUSTER_NAME \
--user USERNAME --login-config ANTHOS_CONFIG_YAML \
--login-config-cert LOGIN_CONFIG_CERT_PEM \
--kubeconfig=KUBECONFIG --dry-run

Os parâmetros são descritos na tabela a seguir.

Parâmetro Descrição
cluster O nome do cluster para autenticação. O padrão é o cluster em `kubectl-anthos-config.yaml`.
user Nome de usuário para credenciais no kubeconfig . O padrão é {cluster-name}-anthos-default-user .
login-config O caminho para o arquivo de configuração gerado pelo administrador do cluster para o desenvolvedor ou uma URL que hospeda o arquivo. O padrão é kubectl-anthos-config.yaml .
login-config-cert Se estiver usando uma URL para login-config , o caminho para o arquivo de certificado da CA para fazer conexões HTTPS.
kubeconfig Caminho para o arquivo kubeconfig que contém os tokens. O padrão é $HOME/.kube/config` .
teste de simulação Teste suas opções de linha de comando sem alterar sua configuração ou cluster.

O comando gcloud anthos login inicia um navegador que solicita que o usuário efetue login com suas credenciais corporativas, realiza a troca de credenciais OIDC e adquire os tokens relevantes. A CLI do gcloud então grava os tokens em um arquivo kubeconfig . kubectl usa esse arquivo para autenticar no cluster de usuários.

Para verificar se a autenticação foi bem-sucedida, execute qualquer comando kubectl com seu arquivo kubeconfig :

env HTTPS_PROXY=http://localhost:8118 \
  kubectl get nodes --kubeconfig my.kubeconfig

túnel gcloud

Se você quiser se autenticar em um cluster de usuários a partir de uma máquina remota, poderá realizar a autenticação usando um túnel SSH. Para usar um túnel, seu arquivo de configuração de autenticação deve estar na máquina remota e você deve conseguir acessar seu provedor de Open ID a partir da sua máquina local.

Na sua máquina local, execute o seguinte comando:

ssh USERNAME@REMOTE_MACHINE -L LOCAL_PORT:localhost:REMOTE_PORT

Substitua o seguinte:

  • USERNAME com um usuário que tenha acesso SSH à máquina remota.

  • REMOTE_MACHINE com o nome do host ou endereço IP da máquina remota.

  • LOCAL_PORT é uma porta disponível na sua máquina local que ssh usa para fazer um túnel para a máquina remota.

  • REMOTE_PORT é a porta que você configurou para o URL de redirecionamento do OIDC. O número da porta faz parte do campo kubectlRedirectURI do seu arquivo de configuração de autenticação.

No seu shell SSH, execute o seguinte comando para iniciar a autenticação:

gcloud anthos auth login --login-config AUTH_CONFIG_FILE

Substitua AUTH_CONFIG_FILE pelo caminho do seu arquivo de configuração de autenticação na máquina remota. A CLI do gcloud executa um servidor web na máquina remota.

Na sua máquina local, em um navegador, acesse http://localhost: LOCAL_PORT /login e siga o fluxo de login do OIDC.

O arquivo kubeconfig na sua máquina remota agora tem o token para acessar o cluster de usuários.

No seu shell SSH, verifique se você tem acesso ao cluster de usuários:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes

Console

Você pode autenticar com o Google Cloud console, inicie o fluxo de autenticação na página de clusters do Kubernetes no Google Cloud console:

  1. Abra o Google Cloud console:

    Visite a página de clusters do Kubernetes

  2. Localize seu cluster do GKE na AWS na lista e clique em Login .

  3. Selecione Autenticar com o Provedor de Identidade configurado para o cluster e clique em LOGIN .

    Você será redirecionado ao seu provedor de identidade, onde poderá ser necessário efetuar login ou consentir com o Google Cloud console acessando sua conta. Você será redirecionado de volta para a página de clusters do Kubernetes no Google Cloud console.

Atualizando a configuração do OIDC

Para atualizar a configuração do OIDC no seu cluster, use o comando kubectl edit .

env HTTPS_PROXY=http://localhost:8118 \
  kubectl edit clientconfigs -n kube-public default

A ferramenta kubectl carrega o recurso ClientConfig no seu editor padrão. Para atualizar a configuração, salve o arquivo. A ferramenta kubectl atualiza o recurso ClientConfig no seu cluster.

Para obter informações sobre o conteúdo do recurso ClientConfig, consulte a seção a seguir.

Apêndice: Exemplo de configuração de login

Segue um exemplo de kubectl-anthos-config.yaml . Este exemplo está incluído para facilitar a compreensão do seu conteúdo. Você deve sempre gerar o arquivo com gcloud anthos create-login-config .

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
 name: default
 namespace: kube-public
spec:
  authentication:
  - name: oidc
    oidc:
      clientID: CLIENT_CONFIG
      clientSecret: CLIENT_SECRET
      extraParams: resource=k8s-group-claim,domain_hint=consumers
      certificateAuthorityData:   CERTIFICATE_STRING
      issuerURI: https://adfs.contoso.com/adfs
      kubectlRedirectURI: http://redirect.kubectl.com/
      scopes: allatclaim,group
      userClaim: "sub"
      groupsClaim: "groups"
    proxy: PROXY_URL #Optional
  certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
  name: projects/my-project/locations/global/membership/cluster-0
  server: https://192.168.0.1:PORT
  preferredAuthentication: oidc

Para explicações sobre o conteúdo dos campos, consulte Campos de autenticação .

O que vem a seguir

Implante sua primeira carga de trabalho no GKE na AWS.