Autenticando Usuários do Cluster com um Provedor de Identidades do OIDC (OpenID Connect) Externo
Saiba mais sobre o uso de provedores de identidade externos do OpenID Connect (OIDC) para autenticar usuários de clusters que você cria com o Kubernetes Engine (OKE).
Por padrão, os clusters que você cria com o Kubernetes Engine usam o Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) para autenticar usuários. O OCI IAM e o Autorizador do Kubernetes RBAC trabalham juntos para permitir que usuários que foram autorizados com sucesso por pelo menos um deles concluam a operação solicitada do Kubernetes. Consulte Sobre o Controle de Acesso e o Kubernetes Engine (OKE).
Além do OCI IAM, você pode especificar que os clusters criados com o Kubernetes Engine usem um provedor de identidades externo do OpenID Connect (OIDC) (IdP) para autenticar usuários. Você pode especificar outro provedor de identidades do OIDC para diferentes clusters. O uso de um provedor de identidades OIDC externo (como Keycloak) para autenticação do usuário permite que você aproveite os provedores de identidades existentes que sua organização já mantém, em vez de criar novas contas de usuário no OCI IAM. E como os usuários não estão definidos no OCI IAM, eles só podem acessar o cluster e não têm acesso a outros recursos do OCI.
Tendo ativado um cluster para autenticação do OIDC, o cluster usa um plug-in de autenticador do OIDC para autenticar usuários com um provedor de identidades do OIDC designado. Em resumo, o fluxo de autenticação é o seguinte:
- O usuário faz log-in no provedor de identidades do OIDC para obter um id_token.
- O usuário emite um comando kubectl para o cluster, informando id_token como argumento.
- O servidor de API do Kubernetes em execução no cluster valida o id_token usando informações do provedor de identidades do OIDC.
- O servidor de API do Kubernetes executa a autorização RBAC do Kubernetes.
- Se o usuário estiver autorizado, o servidor de API do Kubernetes executará a operação solicitada e o kubectl retornará uma resposta ao usuário.
Para obter uma descrição completa do fluxo de autenticação do OIDC no Kubernetes, consulte Tokens do OpenID Connect na documentação do Kubernetes.
Se você ativar um cluster para autenticação do OIDC, também poderá usar o Autorizador RBAC do Kubernetes para impor um controle de acesso detalhado adicional para usuários em clusters específicos. Você pode configurar atribuições e clusterroles do Kubernetes RBAC da mesma forma que faria se estivesse usando a autenticação do OCI IAM, conforme descrito em Sobre Controle de Acesso e Kubernetes Engine (OKE). No entanto, ao definir um rolebinding ou clusterrolebinding do Kubernetes RBAC para mapear uma atribuição ou clusterrole para um usuário ou grupo, em vez de especificar um OCID definido no OCI IAM, você especifica o nome do usuário ou grupo definido no provedor de identidades OIDC externo.
Observe o seguinte:
- Você pode especificar um provedor de identidades do OIDC para clusters com nós virtuais, nós gerenciados e nós autogerenciados.
- A autenticação do OCI IAM está sempre ativada, mesmo quando a autenticação do OIDC está ativada. Portanto, os usuários do OCI IAM e do OIDC podem ser autenticados pelo mesmo cluster e executar operações nesse cluster para o qual estão autorizados.
- O Kubernetes Engine não implementa um cliente OIDC. É sua responsabilidade configurar e manter detalhes de autenticação do usuário no provedor de identidades OIDC externo e obter um id_token do provedor de identidades.
- Use o log do kubernetes-apiserver para solucionar problemas com o início do plug-in do autenticador do OIDC e problemas com a validação do token. Para obter mais informações, consulte Exibindo Logs de Serviço do Kubernetes Engine (OKE).
Pré-requisitos para autenticação do OIDC
Observe os seguintes pré-requisitos para ativar um cluster para autenticação do OIDC:
- O cluster deve ser um cluster aprimorado. A autenticação do OIDC não é suportada para clusters básicos.
- O cluster deve ser um novo cluster ou um "cluster nativo da VCN". Ou seja, um cluster que tem seu ponto final de API do Kubernetes integrado à sua própria VCN (consulte Migrando para Clusters Nativos da VCN). A autenticação do OIDC não é suportada para clusters com pontos finais da API do Kubernetes que não estão integrados à sua própria VCN.
- O cluster deve estar executando o Kubernetes versão 1.21 (ou posterior).
Observe os seguintes pré-requisitos para acessar um cluster ativado para OIDC:
- Os detalhes de autenticação do usuário devem existir no provedor de identidades OIDC externo.
- Deve existir uma regra de saída para a sub-rede de ponto final da API do Kubernetes do cluster que permita o tráfego para o endereço IP e o número da porta do provedor de identidades OIDC externo:
Estado: Destino Protocolo / Dest. Porta Descrição: Com monitoramento de estado Endereço IP do provedor de identidades Dependente do provedor de identidades Permitir tráfego para o provedor de identidades OIDC externo.
Ativando um Cluster para Autenticação do OIDC
Para permitir que um cluster criado com o Kubernetes Engine autentique usuários com um provedor de identidades OIDC, defina as propriedades URL do emissor OIDC e ID do cliente OIDC do cluster no mínimo.
Além disso, você pode opcionalmente definir outras propriedades para controlar a autenticação do OIDC. Para obter uma lista completa de propriedades, consulte Configurando o Servidor de API na documentação do Kubernetes.
Usando a CLI para Especificar um Provedor de Identidades do OIDC (OpenID Connect) Externo
Para obter informações sobre como usar a CLI, consulte Interface de Linha de Comando (CLI). Para obter uma lista completa de flags e opções disponíveis para comandos da CLI, consulte a Referência da Linha de Comando.
Criando um Cluster e Especificando um Único Provedor de Identidades Externo do OpenID Connect (OIDC)
Para usar a CLI para criar um cluster aprimorado que use um único provedor de identidades externo do OpenID Connect (OIDC), use o comando oci ce cluster create
e inclua pelo menos os seguintes parâmetros necessários para a configuração do OIDC:
--open-id-connect-auth-enabled
definido comotrue
--oidc-issuer-url
definido como o URL público base do provedor de identidades que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
--oidc-client-id
definido como um ID de cliente para o qual todos os tokens devem ser emitidos. Por exemplo,kubernetes
Por exemplo:
oci ce cluster create \
--compartment-id ocid1.compartment.oc1..aaaaaaaa______n5q \
--name sales \
--vcn-id ocid1.vcn.oc1.phx.aaaaaaaa______lhq \
--type ENHANCED_CLUSTER \
--kubernetes-version v1.25.4 \
--service-lb-subnet-ids "[\"ocid1.subnet.oc1.phx.aaaaaaaa______g7q"]" \
--endpoint-subnet-id ocid1.subnet.oc1.phx.aaaaaaaa______sna \
--endpoint-public-ip-enabled true \
--endpoint-nsg-ids "[\"ocid1.networksecuritygroup.oc1.phx.aaaaaaaa______5qq\"]" \
--cluster-pod-network-options '[{"cniType":"OCI_VCN_IP_NATIVE"}]' \
--open-id-connect-auth-enabled true
--oidc-issuer-url https://accounts.provider.example
--oidc-client-id kubernetes
Além das propriedades URL do emissor OIDC e ID do cliente OIDC do cluster, você pode definir outras propriedades para controlar a autenticação do OIDC. Para obter uma lista completa de propriedades, consulte Configurando o Servidor de API na documentação do Kubernetes.
Atualizando um Cluster e Especificando um Único Provedor de Identidades Externo do OpenID Connect (OIDC)
Para usar a CLI para atualizar um cluster aprimorado existente para usar um único provedor de identidades externo do OpenID Connect (OIDC):
- Usando seu editor JSON preferencial, crie um novo arquivo no formato JSON para atualizar a configuração do provedor de identidades OIDC externo do cluster e inclua pelo menos os seguintes parâmetros necessários para a configuração:em que:
{ "options": { "openIdConnectTokenAuthenticationConfig": { "isOpenIdConnectAuthEnabled": true, "issuerUrl": "<idp-base-url>", "clientId": "<client-id>" } } }
isOpenIdConnectAuthEnabled
é definido comotrue
"issuerUrl": "<idp-base-url>"
é o URL público base do provedor de identidades que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
"clientId": "<client-id>"
é o ID do cliente para o qual todos os tokens devem ser emitidos. Por exemplo,kubernetes
Por exemplo:
{ "options": { "openIdConnectTokenAuthenticationConfig": { "isOpenIdConnectAuthEnabled": true, "issuerUrl": "https://accounts.provider.example", "clientId": "kubernetes" } } }
Além das propriedades URL do emissor OIDC e ID do cliente OIDC do cluster, você pode definir outras propriedades para controlar a autenticação do OIDC. Por exemplo:{ "options": { "openIdConnectTokenAuthenticationConfig": { "clientId": "kubernetes", "usernameClaim": "sub", "issuerUrl": "https://token.actions.githubusercontent.com", "isOpenIdConnectAuthEnabled": true, "usernamePrefix": "actions-oidc:", "requiredClaim": [ "repository=GH_ACCOUNT/REPO", "ref=refs/heads/main" ] } } }
Para obter uma lista completa de propriedades, consulte Configurando o Servidor de API na documentação do Kubernetes.
- Salve o arquivo JSON que contém a configuração externa do provedor de identidades do OpenID Connect (OIDC), com um nome e em um local de sua escolha. Por exemplo, como
/users/jdoe/update-oidc-config
- Use o comando
oci ce cluster update
para atualizar o cluster existente:oci ce cluster update --cluster-id <cluster-ocid> --from-json file://<path-to-file>
Por exemplo:
oci ce cluster update --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd --from-json file:///users/jdoe/update-oidc-config
Criando um Cluster e Especificando Vários Provedores de Identidade Externos do OpenID Connect (OIDC)
Para usar a CLI para criar um cluster aprimorado que use vários provedores de identidade externos do OpenID Connect (OIDC) (disponíveis para clusters que executam o Kubernetes versão 1.30 e posterior):
- Crie um novo arquivo de configuração de autenticação do Kubernetes como arquivo .yaml, para conter detalhes dos provedores de identidade. Para obter mais informações sobre arquivos de configuração de autenticação, consulte Configuração de autenticação de um arquivo na documentação do Kubernetes.
- Para cada provedor de identidades:
- Defina o campo
jwt.issuer.url
como o URL público base do provedor de identidades que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
- Opcionalmente, defina outros campos para controlar a autenticação do OIDC. Observe que, ao usar um arquivo de configuração de autenticação, qualquer configuração OIDC deve ser especificada nesse arquivo. Para obter mais informações sobre os campos em um arquivo de configuração de autenticação, consulte Configuração de autenticação de um arquivo na documentação do Kubernetes.
Por exemplo:
apiVersion: apiserver.config.k8s.io/v1beta1 kind: AuthenticationConfiguration jwt: - issuer: url: https://accounts.google.com audiences: - 838763820337-6vt12pbavkteafx08f32z48u7gpll6on.apps.googleusercontent.com - 838763820337-elyce7g28ep5b7uzq4dt1uzh1h86jki9.apps.googleusercontent.com audienceMatchPolicy: MatchAny claimMappings: username: claim: "sub" prefix: "" groups: claim: "groups" prefix: "" uid: claim: "sub" - issuer: url: https://dev-dx7mdewuu7xhb4mw.us.auth0.com/ audiences: - 7w7qJsa3brl5OHV6uljAAYhfknVTsVAw audienceMatchPolicy: MatchAny claimMappings: username: claim: "sub" prefix: "" groups: claim: "groups" prefix: "" uid: claim: "sub"
- Defina o campo
- Converta o arquivo .yaml de configuração de autenticação em uma string codificada em Base64.
-
Use o comando
oci ce cluster create
e inclua os seguintes parâmetros:--open-id-connect-auth-enabled
definido comotrue
--oidc-configuration-file
definido como a string codificada Base64 que você criou com base no arquivo de configuração de autenticação.
Por exemplo:
oci ce cluster create \ --compartment-id ocid1.compartment.oc1..aaaaaaaa______n5q \ --name sales \ --vcn-id ocid1.vcn.oc1.phx.aaaaaaaa______lhq \ --type ENHANCED_CLUSTER \ --kubernetes-version v1.30.1 \ --service-lb-subnet-ids "[\"ocid1.subnet.oc1.phx.aaaaaaaa______g7q"]" \ --endpoint-subnet-id ocid1.subnet.oc1.phx.aaaaaaaa______sna \ --endpoint-public-ip-enabled true \ --endpoint-nsg-ids "[\"ocid1.networksecuritygroup.oc1.phx.aaaaaaaa______5qq\"]" \ --cluster-pod-network-options '[{"cniType":"OCI_VCN_IP_NATIVE"}]' \ --open-id-connect-auth-enabled true --oidc-configuration-file <base64-encoded-config-file>
Observe que, depois de definir o parâmetro
--oidc-configuration-file
, não use outros parâmetros do comandooci ce cluster create
para configurar a autenticação do OIDC. Só use campos no arquivo de configuração de autenticação para controlar a autenticação do OIDC.
Usando a API para Especificar um Provedor de Identidades do OIDC (OpenID Connect) Externo
Criando um Cluster e Especificando um Único Provedor de Identidades Externo do OpenID Connect (OIDC)
Para usar a API para criar um cluster que use um único provedor de identidades externo do OpenID Connect (OIDC), use a operação CreateCluster para criar um cluster e especifique valores para os atributos da propriedade openIdConnectTokenAuthenticationConfig
, incluindo pelo menos os seguintes atributos obrigatórios:
isOpenIdConnectAuthEnabled
definido comotrue
issuerUrl
definido como o URL público base do provedor de identidades que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
clientId
definido como um ID de cliente para o qual todos os tokens devem ser emitidos. Por exemplo,kubernetes
Além dos atributos issuerURL
e clientId
, você pode, opcionalmente, definir outros atributos openIdConnectTokenAuthenticationConfig
para controlar a autenticação do OIDC. Para obter uma lista completa de atributos, consulte openIdConnectTokenAuthenticationConfig Reference
Criando um Cluster e Especificando Vários Provedores de Identidade Externos do OpenID Connect (OIDC)
Para usar a API para criar um cluster que use vários provedores de identidade OIDC externos (disponíveis para clusters que executam o Kubernetes versão 1.30 e posterior):
- Crie um novo arquivo de configuração de autenticação do Kubernetes como arquivo .yaml, para conter detalhes dos provedores de identidade. Para obter mais informações sobre arquivos de configuração de autenticação, consulte Configuração de autenticação de um arquivo na documentação do Kubernetes.
- Para cada provedor de identidades:
- Defina o campo
jwt.issuer.url
como o URL público base do provedor de identidades que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
- Opcionalmente, defina outros campos para controlar a autenticação do OIDC. Observe que, ao usar um arquivo de configuração de autenticação, qualquer configuração OIDC deve ser especificada nesse arquivo. Para obter mais informações sobre os campos em um arquivo de configuração de autenticação, consulte Configuração de autenticação de um arquivo na documentação do Kubernetes.
Por exemplo:
apiVersion: apiserver.config.k8s.io/v1beta1 kind: AuthenticationConfiguration jwt: - issuer: url: https://accounts.google.com audiences: - 838763820337-6vt12pbavkteafx08f32z48u7gpll6on.apps.googleusercontent.com - 838763820337-elyce7g28ep5b7uzq4dt1uzh1h86jki9.apps.googleusercontent.com audienceMatchPolicy: MatchAny claimMappings: username: claim: "sub" prefix: "" groups: claim: "groups" prefix: "" uid: claim: "sub" - issuer: url: https://dev-dx7mdewuu7xhb4mw.us.auth0.com/ audiences: - 7w7qJsa3brl5OHV6uljAAYhfknVTsVAw audienceMatchPolicy: MatchAny claimMappings: username: claim: "sub" prefix: "" groups: claim: "groups" prefix: "" uid: claim: "sub"
- Defina o campo
- Converta o arquivo .yaml de configuração de autenticação em uma string codificada em Base64.
-
Use a operação CreateCluster para criar o cluster e especifique valores para os seguintes atributos da propriedade
openIdConnectTokenAuthenticationConfig
:isOpenIdConnectAuthEnabled
definido comotrue
configurationFile
definido como a string codificada Base64 que você criou com base no arquivo de configuração de autenticação.
Observe que, depois de definir o atributo
configurationFile
, não defina outros atributos da propriedadeopenIdConnectTokenAuthenticationConfig
para configurar a autenticação do OIDC. Só use campos no arquivo de configuração de autenticação para controlar a autenticação do OIDC.
Acessando um Cluster Ativado para OIDC
Uma maneira de acessar um cluster que autentica usuários com um provedor de identidades OIDC externo é usar o Autenticador do OIDC. Para usar o Autenticador do OIDC para acessar um cluster ativado para OIDC, informe os detalhes do usuário, do provedor de identidades do OIDC e do token do OIDC no arquivo kubeconfig, conforme descrito nesta seção. Como alternativa, você pode acessar um cluster ativado para OIDC incluindo um token diretamente nos comandos kubectl, usando a opção --token
. Para obter mais informações sobre como usar o Autenticador do OIDC ou o kubectl na opção --token
, consulte Tokens do OpenID Connect na documentação do Kubernetes.
Observe que há outras maneiras de acessar clusters habilitados para OIDC. Por exemplo, usando um plug-in kubectl como o kubelogin (para obter mais informações, consulte a documentação do kubelogin em GitHub).
Para usar o Autenticador do OIDC para acessar um cluster ativado para OIDC:
- Faça log-in no provedor de identidades OIDC externo.
- Anote o
id_token
e orefresh_token
que o provedor de identidades do OIDC fornece. - Configure um arquivo kubeconfig para acessar o cluster ativado para OIDC seguindo as instruções em Configurando o Acesso do Cloud Shell a Clusters ou Configurando o Acesso Local a Clusters conforme apropriado, dependendo de como você deseja acessar o cluster.
- Defina um usuário no arquivo kubeconfig que será autenticado com o provedor de identidades OIDC externo executando o seguinte comando:
kubectl config set-credentials <username> \ --auth-provider=oidc \ --auth-provider-arg=idp-issuer-url=<base-url> \ --auth-provider-arg=client-id=<client-name> \ --auth-provider-arg=client-secret=<client-secret> \ --auth-provider-arg=refresh-token=<refresh-token> \ --auth-provider-arg=id-token=<id-token> \ --auth-provider-arg=extra-scopes=groups
em que:
<username>
do usuário a ser autenticado com o provedor de identidades OIDC externo. Por exemplo,oidc-admin-user
idp-issuer-url=<base-url>
é o URL público base do provedor de identidades OIDC externo que permite que o servidor de API do Kubernetes descubra chaves de assinatura públicas. Geralmente, esse é o URL de descoberta do OIDC do provedor de identidades, alterado para ter um caminho vazio. Por exemplo, se o URL de descoberta do OIDC do emissor forhttps://accounts.provider.example/.well-known/openid-configuration
, especifiquehttps://accounts.provider.example
client-id=<client-name>
é um identificador de string associado ao seu cliente OIDC que faz parte das credenciais do cliente. Por exemplo,client-id=kubernetes
client-secret=<CLIENT_SECRET>
é uma string secreta, efetivamente a senha das credenciais do cliente.refresh-token=<refresh-token>
é o token de atualização OAuth 2.0 fornecido pelo provedor de identidades OIDC externo após a autenticação.id-token=<id-token>
é o OAuth 2.0 id_token fornecido pelo provedor de identidades OIDC externo após a autenticação. O id_token representa o usuário IdP ao qual você deseja permitir acesso ao cluster por meio da autenticação do OIDC.extra-scopes=groups
é uma lista de escopos OAuth 2.0 adicionais a serem solicitados do provedor de identidades OIDC externo quando os tokens forem atualizados.
Por exemplo:
kubectl config set-credentials oidc-admin-user \ --auth-provider=oidc \ --auth-provider-arg=idp-issuer-url=https://accounts.provider.example \ --auth-provider-arg=client-id=kubernetes \ --auth-provider-arg=client-secret=1db158______c5 \ --auth-provider-arg=refresh-token=q1b______KtQA= \ --auth-provider-arg=id-token=eyJr______4knw \ --auth-provider-arg=extra-scopes=groups
- Defina um contexto no arquivo kubeconfig para o novo usuário que será autenticado usando o provedor de identidades OIDC externo, executando o seguinte comando:
kubectl config set-context <context-name> --cluster=<cluster-name> --user=<oidc-username>
em que:
<context-name>
é o nome de sua escolha para o contexto. Por exemplo,OIDC-auth
--cluster=<cluster-name>
é o nome do cluster ativado para OIDC. Por exemplo,OIDC-development
--user=<oidc-username>
é o nome do usuário a ser autenticado com o provedor de identidades OIDC externo. Por exemplo,oidc-admin-user
Por exemplo:
kubectl config set-context OIDC-auth --cluster=OIDC-development --user=oidc-admin-user