Configurar clusters membros da frota para autenticação LDAP

Este documento descreve como administradores de cluster ou operadores de aplicativos podem configurar clusters do Kubernetes para oferecer suporte à autenticação de um provedor Lightweight Directory Access Protocol (LDAP) de terceiros, como o Microsoft Entra ID ou o Google LDAP. Para mais informações, consulte Sobre a autenticação usando identidades de terceiros.

Limitações

Use um tipo de cluster compatível com LDAP.

Antes de começar

  1. Install the Google Cloud CLI.

  2. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  3. Para inicializar a gcloud CLI, execute o seguinte comando:

    gcloud init
  4. Depois que a gcloud CLI é inicializada, ela precisa ser atualizada e os componentes necessários instalados:

    gcloud components update
    gcloud components install kubectl
  5. Verifique se o administrador da plataforma forneceu todas as informações necessárias do provedor. Para mais informações, consulte Configurar provedores LDAP para autenticar em clusters.

Durante essa configuração, talvez seja necessário consultar a documentação do seu servidor LDAP. Os guias do administrador a seguir explicam a configuração de alguns provedores LDAP conhecidos, inclusive onde encontrar as informações necessárias para fazer login no servidor LDAP e configurar os clusters:

Preencher o secret da conta de serviço LDAP

Seu cluster precisa de um secret da conta de serviço para se autenticar no servidor LDAP e recuperar os detalhes do usuário. A autenticação LDAP é compatível com os seguintes mecanismos:

  • Autenticação básica, em que você usa um nome de usuário e uma senha.
  • Autenticação de certificado do cliente, em que você usa uma chave privada e um certificado do cliente.

Você ou o administrador da plataforma precisam ter essas informações sobre seu provedor em Configurar provedores LDAP para autenticar em clusters. Para disponibilizar as informações de login do servidor LDAP para o cluster, crie um secret do Kubernetes com os detalhes de login do LDAP. Os exemplos a seguir mostram como configurar chaves secretas para os dois tipos de autenticação. Os exemplos mostram o secret sendo aplicado ao namespace anthos-identity-service.

Este é um exemplo de configuração de chave secreta de autenticação básica:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: "anthos-identity-service"
type: kubernetes.io/basic-auth     # Make sure the type is correct
data:
  username: USERNAME  # Use a base64-encoded username
  password: PASSWORD  # Use a base64-encoded password

em que SERVICE_ACCOUNT_SECRET_NAME é o nome que você escolheu para este secret. Substitua os valores de nome de usuário e senha pelo nome de usuário e senha que você salvou na etapa anterior. USERNAME é um nome de usuário codificado em base64 PASSWORD é uma senha codificada em base64

Este é um exemplo de configuração de um secret de certificado do cliente:

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: anthos-identity-service
type: kubernetes.io/tls            # Make sure the type is correct
data:
  # the data is abbreviated in this example
  tls.crt: |
       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
  tls.key: |
       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

Substitua SERVICE_ACCOUNT_SECRET_NAME pelo nome que você escolheu para o secret. Substitua os valores de chave e certificado TLS pelos valores de chave e certificado codificados recebidos na etapa anterior.

Os exemplos mostram o secret sendo aplicado ao namespace anthos-identity-service. Por padrão, os componentes do sistema têm permissão para ler secrets nesse namespace. Para usar outro namespace, mude os metadados no secret e adicione uma nova política de RBAC para conceder à ServiceAccount default no namespace anthos-identity-service a permissão para ler secrets nesse namespace, da seguinte maneira:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: NAMESPACE
  name: ais-secret-reader-role
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get","list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ais-secret-reader-role-binding
  namespace: NAMESPACE
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ais-secret-reader-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: anthos-identity-service
---

Configurar o cluster

Para configurar a autenticação em um cluster usando LDAP, adicione as seguintes informações a um recurso personalizado do Kubernetes chamado ClientConfig:

  • Informações sobre o provedor de identidade e os parâmetros necessários para retornar informações do usuário.
  • O nome e o namespace do secret que você criou e aplicou na etapa anterior, o que permite que o cluster se autentique no servidor LDAP.

Para configurar o cluster, edite o ClientConfig default no namespace kube-public:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default

Substitua USER_CLUSTER_KUBECONFIG pelo caminho do arquivo kubeconfig do cluster. Se houver vários contextos no kubeconfig o contexto atual será usado. Talvez seja necessário redefinir o contexto atual para o cluster correto antes de executar o comando.

Confira a seguir o formato da configuração ClientConfig:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - name: NAME
    ldap:
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      connectionType: CONNECTION_TYPE
      host: HOST_NAME
      serviceAccountSecret:
        name: SERVICE_ACCOUNT_SECRET_NAME
        namespace: NAMESPACE
        type: SECRET_FORMAT
      user:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE
        loginAttribute: LOGIN_ATTRIBUTE
      group:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE

É possível adicionar várias configurações de provedores de identidade OIDC, LDAP e SAML ao mesmo ClientConfig. O cluster tenta se autenticar com cada configuração na ordem em que elas são definidas e para após a primeira autenticação bem-sucedida. O exemplo a seguir de ClientConfig define vários provedores de identidade em uma ordem específica:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - aws:
      region: us-west-2
    name: AWS Login
  - ldap:
  # Multiple lines are omitted here.
  - saml:
  # Multiple lines are omitted here.
  - azureAD:
  # Multiple lines are omitted here.
  - oidc:
    name: Okta OIDC
  # Multiple lines are omitted here.
  - oidc:
    name: Google OIDC
  # Multiple lines are omitted here.

Campos LDAP do ClientConfig

A tabela a seguir descreve os campos do objeto ldap do ClientConfig. Os campos que você precisa adicionar dependem dos tokens do provedor de identidade e de como o administrador da plataforma configurou o provedor.

Campo Obrigatório Descrição Formato
name sim Um nome para identificar essa configuração LDAP string
host sim Nome do host ou endereço IP do servidor LDAP. A porta é opcional e o padrão será 389, se não for especificada. Por exemplo, ldap.server.example.com ou 10.10.10.10:389. string
certificateAuthorityData Obrigatório para determinados tipos de conexão LDAP Contém um certificado de autoridade de certificação no formato PEM codificado em Base64 para o servidor LDAP. Isso precisa ser fornecido apenas para conexões ldaps e startTLS. string
connectionType sim Tipo de conexão LDAP a ser usada na conexão com o servidor LDAP. O padrão é startTLS. O modo insecure só deve ser usado para desenvolvimento, já que toda a comunicação com o servidor será em texto simples. string
serviceAccountSecret
name sim O nome do secret do Kubernetes que armazena as credenciais da conta de serviço LDAP. string
namespace sim Namespace do secret do Kubernetes que armazena as credenciais da conta de serviço LDAP. string
tipo sim Define o formato do secret da conta de serviço para aceitar diferentes tipos de secret. Se você especificou basic-auth na configuração do secret, use basic, caso contrário, use tls. Se não for especificado, o padrão será basic. string
usuário
baseDN sim O local da subárvore no diretório LDAP para pesquisar entradas de usuário. string
filter não Filtro opcional a ser aplicado ao pesquisar o usuário. Isso pode ser usado para restringir ainda mais as contas de usuário que têm permissão para fazer login. Se não for especificado, (objectClass=User) assumirá como padrão. string
Atributo do identificador não Determina qual atributo usar como identidade do usuário depois de ser autenticado. Ele é diferente do campo loginAttribute para permitir que os usuários façam login com um nome de usuário, mas tenham o identificador real como um endereço de e-mail ou Nome distinto (DN) completo. Por exemplo, definir loginAttribute como sAMAccountName e identifierAttribute como userPrincipalName permitiria que um usuário fizesse login como bsmith, mas as políticas reais do RBAC para o usuário seriam gravadas como bsmith@example.com. É recomendável usar userPrincipalName, pois ele será exclusivo para cada usuário. Se não for especificado, o padrão será userPrincipalName. string
loginAttribute não O nome do atributo que corresponde ao nome de usuário de entrada. Isso é usado para encontrar o usuário no banco de dados LDAP, por exemplo, (<LoginAttribute>=<username>) e é combinado com o campo de filtro opcional. O padrão é userPrincipalName. string
grupo (campo opcional)
baseDN sim O local da subárvore no diretório LDAP para pesquisar as entradas do grupo. string
filter não Filtro opcional a ser usado ao pesquisar grupos a que um usuário pertence. Isso pode ser usado para corresponder explicitamente apenas a determinados grupos de modo a reduzir a quantidade de grupos retornados para cada usuário. O padrão é (objectClass=Group). string
Atributo do identificador não O nome de identificação de cada grupo a que um usuário pertence. Por exemplo, se isso for definido como distinguishedName, os RBACs e outras expectativas do grupo serão gravados como DNs completos. Se não for especificado, o padrão será distinguishedName. string

A seguir

Depois que a configuração for aplicada, defina o acesso do usuário de provedores externos a clusters.