Configure clusters de membros da frota para autenticação LDAP

Este documento descreve como os administradores de clusters ou os operadores de aplicações podem configurar clusters do Kubernetes para suportar a autenticação de um fornecedor de protocolo LDAP (Lightweight Directory Access Protocol) de terceiros, como o Microsoft Entra ID ou o Google LDAP. Para mais informações, consulte o artigo Acerca da autenticação através de identidades de terceiros.

Limitações

Tem de usar um tipo de cluster que suporte LDAP.

Antes de começar

  1. Install the Google Cloud CLI.

  2. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  4. Depois de inicializar a CLI gcloud, atualize-a e instale os componentes necessários:

    gcloud components update
    gcloud components install kubectl
  5. Certifique-se de que o administrador da plataforma lhe deu todas as informações de fornecedor de que precisa. Para mais informações, consulte o artigo Configure fornecedores LDAP para autenticação em clusters.

Ao longo desta configuração, pode ter de consultar a documentação do seu servidor LDAP. Os seguintes guias do administrador explicam a configuração de alguns fornecedores LDAP populares, incluindo onde encontrar as informações necessárias para iniciar sessão no servidor LDAP e configurar os seus clusters:

Preencha o segredo da conta de serviço LDAP

O cluster precisa de um segredo da conta de serviço para autenticar no servidor LDAP e obter detalhes do utilizador. A autenticação LDAP suporta os seguintes mecanismos:

  • Autenticação básica, em que usa um nome de utilizador e uma palavra-passe.
  • Autenticação de certificado de cliente, em que usa uma chave privada de cliente e um certificado de cliente.

O administrador da plataforma ou o utilizador deve ter estas informações acerca do fornecedor seguindo os passos descritos no artigo Configure fornecedores LDAP para autenticação em clusters. Para disponibilizar as informações de início de sessão do servidor LDAP ao cluster, tem de criar um segredo do Kubernetes com os detalhes de início de sessão do LDAP. Os exemplos seguintes mostram como configurar segredos para ambos os tipos de autenticação. Os exemplos mostram o Secret a ser aplicado ao espaço de nomes anthos-identity-service.

Este é um exemplo de uma configuração de segredo 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

onde, SERVICE_ACCOUNT_SECRET_NAME é o nome que escolheu para este Secret. Substitua os valores do nome de utilizador e da palavra-passe pelo nome de utilizador e pela palavra-passe que obteve no passo anterior. USERNAME é um nome de utilizador codificado em base64 PASSWORD é uma palavra-passe codificada em base64

Segue-se um exemplo de uma configuração de segredo do certificado de 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 escolheu para este segredo. Substitua os valores da chave e do certificado TLS pelos valores da chave e do certificado codificados que obteve no passo anterior.

Os exemplos mostram o segredo a ser aplicado ao espaço de nomes anthos-identity-service. Por predefinição, os componentes do sistema têm autorização para ler segredos neste espaço de nomes. Para usar outro espaço de nomes, altere os metadados no segredo e, em seguida, adicione uma nova política de RBAC para conceder a autorização para ler segredos nesse espaço de nomes à default ServiceAccount no espaço de nomes anthos-identity-service, da seguinte forma:

---
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
---

Configure o cluster

Para configurar a autenticação num cluster através do LDAP, adicione as seguintes informações a um recurso personalizado do Kubernetes denominado ClientConfig:

  • Informações acerca do fornecedor de identidade e dos parâmetros de que necessita para devolver informações do utilizador.
  • O nome e o espaço de nomes do Secret que criou e aplicou no passo anterior, o que permite ao cluster autenticar-se no servidor LDAP.

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

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

Substitua USER_CLUSTER_KUBECONFIG pelo caminho para o ficheiro kubeconfig do cluster. Se existirem vários contextos no kubeconfig, é usado o contexto atual. Pode ter de repor o contexto atual para o cluster correto antes de executar o comando.

O exemplo seguinte mostra 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

Pode adicionar várias configurações de fornecedores de identidade OIDC, LDAP e SAML à mesma ClientConfig. O cluster tenta autenticar-se com cada configuração pela ordem em que são definidas e para após a primeira autenticação bem-sucedida. O exemplo ClientConfig seguinte define vários fornecedores de identidade numa 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 ClientConfig

A tabela seguinte descreve os campos do objeto ClientConfig ldap. Os campos que tem de adicionar dependem dos tokens do seu fornecedor de identidade e da forma como o administrador da plataforma configurou o fornecedor.

Campo Obrigatória Descrição Formato
nome sim Um nome para identificar esta configuração LDAP de string
anfitrião sim Nome do anfitrião ou endereço IP do servidor LDAP. A porta é opcional e a predefinição é 389, se não for especificada. Por exemplo, ldap.server.example.com ou 10.10.10.10:389. de string
certificateAuthorityData Obrigatório para determinados tipos de ligação LDAP Contém um certificado da autoridade de certificação em formato PEM codificado em Base64 para o servidor LDAP. Tem de ser fornecido apenas para ligações ldaps e startTLS. de string
connectionType sim Tipo de ligação LDAP a usar quando se liga ao servidor LDAP. A predefinição é startTLS. O modo insecure só deve ser usado para desenvolvimento, uma vez que toda a comunicação com o servidor é feita em texto simples. de string
serviceAccountSecret
nome sim Nome do segredo do Kubernetes que armazena as credenciais da conta de serviço LDAP. de string
espaço de nome sim Espaço de nomes do segredo do Kubernetes que armazena as credenciais da conta de serviço LDAP. de string
escrever sim Define o formato do segredo da conta de serviço para suportar diferentes tipos de segredos. Se especificou basic-auth na configuração do segredo, deve ser basic. Caso contrário, deve ser tls. Se não for especificado, o fuso horário predefinido é basic. de string
utilizador
baseDN sim A localização da subárvore no diretório LDAP para pesquisar entradas de utilizadores. de string
filtrar não Filtro opcional a aplicar quando pesquisa o utilizador. Isto pode ser usado para restringir ainda mais as contas de utilizador com autorização para iniciar sessão. Se não for especificado, o fuso horário predefinido é (objectClass=User). de string
identifierAttribute não Determina que atributo usar como identidade do utilizador após a autenticação. Isto é diferente do campo loginAttribute para permitir que os utilizadores iniciem sessão com um nome de utilizador, mas que o respetivo identificador real seja um endereço de email ou um nome distinto (DN) completo. Por exemplo, se definir loginAttribute como sAMAccountName e identifierAttribute como userPrincipalName , um utilizador pode iniciar sessão como bsmith, mas as políticas de RBAC reais para o utilizador seriam escritas como bsmith@example.com. Recomendamos a utilização de userPrincipalName, uma vez que este valor é exclusivo para cada utilizador. Se não for especificado, a predefinição é userPrincipalName. de string
loginAttribute não O nome do atributo que corresponde ao nome de utilizador introduzido. É usado para encontrar o utilizador na base de dados LDAP, por exemplo, (<LoginAttribute>=<username>), e é combinado com o campo de filtro opcional. A predefinição é userPrincipalName. de string
group (campo opcional)
baseDN sim A localização da subárvore no diretório LDAP para pesquisar entradas de grupos. de string
filtrar não Filtro opcional a usar quando pesquisar grupos aos quais um utilizador pertence. Isto pode ser usado para fazer corresponder explicitamente apenas determinados grupos, de modo a reduzir a quantidade de grupos devolvidos para cada utilizador. A predefinição é (objectClass=Group). de string
identifierAttribute não O nome de identificação de cada grupo ao qual um utilizador pertence. Por exemplo, se esta opção estiver definida como distinguishedName, os RBACs e outras expetativas de grupos devem ser escritos como DNs completos. Se não for especificado, a predefinição é distinguishedName. de string

O que se segue?

Depois de aplicar a configuração, continue a configurar o acesso dos utilizadores de fornecedores externos aos clusters.