Você pode escolher onde armazenar informações confidenciais para os componentes que o Atlas Kubernetes Operator gerencia, mas o Atlas Kubernetes Operator deve encontrar os segredos do Kubernetes que espera. Você pode armazenar segredos para o Atlas Kubernetes Operator de várias maneiras, incluindo os seguintes métodos:
Coloque informações confidenciais em um repositório do Github seguindo um fluxo do GitOps. Para armazenar dados confidenciais no git com segurança, você pode usar o FERRAMENTAS, como o Cloud Segredos, que criptografa segredos para o cluster de destino pretendido.
Coloque informações confidenciais em uma ferramenta externa de armazenamento de segredos, como o HashiCorp Vault ou as soluções de gerenciamento de segredos nativos do Hyperscalers. Uma ferramenta intermediária de provisionamento de segredos obtém informações confidenciais da ferramenta de armazenamento secreto externo e cria segredos Kubernetes a partir das informações confidenciais. Para saber mais sobre a ferramenta secreta de provisionamento, consulte Considerações.
Este tutorial configura uma ferramenta externa de armazenamento de segredos para utilizar com o Atlas Kubernetes Operator. Este tutorial se concentra em configurações "sem segredos" que não exigem que o Atlas Kubernetes Operator crie e armazene um segredo para provisionar segredos para seu cluster do Kubernetes.
Considerações
O tutorial a seguir instala ou configura as seguintes ferramentas e opções:
Uma ferramenta secreta de provisionamento. A ferramenta de provisionamento secreto utiliza um ou mais mecanismos de autenticação para recuperar as credenciais do serviço de gerenciamento secreto e criar segredos que o Atlas Kubernetes Operator pode utilizar. Este tutorial instala um dos seguintes FERRAMENTAS de provisionamento secreto de código aberto:
Autenticação para acessar segredos. Você pode usar métodos diferentes para autenticar as contas de serviço e namespaces que podem acessar segredos no HashiCorp Vault:
Para o Operador de segredos externos, este tutorial usa a autenticação de token da web OIDC JSON. Para saber mais, consulte Autenticação JSON web token/OIDC.
Para o Driver CSI do Secrets Store, este tutorial usa a autenticação do Kubernetes.
Como alternativa, o KMS do seu fornecedor de cloud pode usar sistemas IAM nativos para fornecer essa autenticação, que não é abordada neste tutorial. Para saber como configurar o KMS do seu cloud provider para autenticação, consulte os seguintes recursos na documentação do Operador de segredos externos:
Pré-requisitos
Antes de concluir este tutorial, você precisa das seguintes ferramentas e configurações:
Executando contas de serviço para Kubernetes, Atlas Kubernetes Operator e Atlas e privilégios suficientes para configurá-las.
Você precisa de um cluster Kubernetes em execução com nós que executam processadores com a arquitetura x86-64, AMD64 ou ARM64. Para este tutorial, o cluster do Kubernetes está
https://kube01.internal.ioescutando na porta padrão (443).Você pode acessar o projeto Atlas Kubernetes Operator no GitHub:
Para instalar o Atlas Kubernetes Operator utilizando o Atlas CLI, execute o seguinte comando:
atlas kubernetes operator install [options] Para saber mais sobre a sintaxe e os parâmetros do comando, consulte a documentação da Atlas CLI do Atlas para a instalação do Atlas Kubernetes Operator .
Para implantar o Atlas Kubernetes Operator, execute o seguinte comando. Substitua
<version>pelo número da versão mais recente.kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-atlas-kubernetes/<version>/deploy/all-in-one.yaml Para registrar uma conta Atlas, consulte Criar uma Conta Atlas.
Chaves de API. Você deve criar uma chave de API e configurar o API Access List.
Você precisa das seguintes informações da chave de API pública, chave de API privada e ID da organização para configurar o acesso do Atlas Kubernetes Operator ao Atlas.
Se você quiser que o Atlas Kubernetes Operator crie um novo projeto do Atlas , concedaacesso programático a uma organização. Se sua organização exigir uma lista de acesso IP para a API Atlas Administration, você também deverá configurar a lista de acesso da API.
Importante
Você deve atribuir a chave API ao role da organização Organization Project Creator ou superior.
Se você quiser trabalhar com um projeto Atlas existente, adicione acesso a um projeto. Se sua organização exigir uma lista de acesso IP para a API Atlas Administration, você também deverá configurar a lista de acesso da API.
Importante
Você deve atribuir à chave de API ao role de projeto Project Owner .
Um cofre de armazenamento secreto. Este tutorial usa HashiCorp Vault, que é um serviço de terceiros para armazenamento de segredos, executado em
https://vault.internal.io.Você pode usar outros cofres de armazenamento secretos com o Atlas Kubernetes Operator, conforme necessário, incluindo o cloud KMS da Amazon Web Services, Azure e Google.
Somente acesso interno. Para evitar a exposição de informações confidenciais pela Internet pública, os seguintes componentes da solução de armazenamento secreto permitem apenas o acesso interno:
O serviço HashiCorp Vault ou KMS.
O serviço de API de cluster do Kubernetes.
A rede interna. Este tutorial utiliza
internal.io.
Embora os componentes anteriores permitam apenas o acesso interno, eles permitem o acesso uns aos outros e permitem o acesso a qualquer pessoa dentro de sua equipe ou organização. Esta é uma prática recomendada para segurança.
Autoridades de Certificação Pública (CAs). Você pode usar CAs públicas para evitar o gerenciamento e a distribuição de certificados raiz CA personalizados.
Você pode automatizar o gerenciamento e a renovação de certificados CA usando qualquer uma das seguintes ferramentas:
Neste tutorial:
Todos os serviços HTTPs
internal.iosão endereços internos, mas seus sites HTTPS possuem certificados atualizados automaticamente assinados por uma CA pública.Não é necessário nenhum TLS mútuo (mTLS) para essa integração porque ele executa somente a validação HTTPS no lado do servidor.
Os clientes podem confiar nesses certificados de serviço sem provisionamento adicional de certificados.
Procedimento
Siga estas etapas para configurar o armazenamento secreto para o Atlas Kubernetes Operator.
Instale a ferramenta de provisionamento secreto no cluster de destino.
Selecione uma ferramenta de provisionamento secreta para instalá-la.
Para usar o Operador de segredos externos como ferramenta de provisionamento secreto:
Execute os seguintes comandos para instalar o External Secrets Operator com Helm Charts e iniciar o serviço:
helm repo add external-secrets https://charts.external-secrets.io helm upgrade -i --atomic \ -n external-secrets --create-namespace --set extraArgs.loglevel=debug \ external-secrets external-secrets/external-secrets` Certifique-se de que os segredos externos sejam executados com sucesso:
kubectl get pod -n external-secrets -l app.kubernetes.io/name=external-secrets NAME READY STATUS RESTARTS AGE external-secrets-5779d5d6f6-2lhgd 1/1 Running 0 70s
Para usar o Driver CSI do Secrets Store como a ferramenta de provisionamento secreto, siga estas etapas:
Execute o seguinte comando para instalar o Driver CSI do Secrets Store com Helm Charts e iniciar o serviço:
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm upgrade -i --atomic --set syncSecret.enabled=true \ -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver Execute o comando a seguir para instalar o plugin-in Secrets Store CSI HashiCorp Vault com Helm Charts. Você não precisa instalar o servidor HashiCorp Vault ou o injetor de segredos.
helm install vault hashicorp/vault \ --set "server.enabled=false" --set "injector.enabled=false" \ --set "csi.enabled=true" Certifique-se de que o CSI do Secrets Store seja executado com sucesso:
kubectl get pod -n kube-system -l app.kubernetes.io/name=secrets-store-csi-driver NAME READY STATUS RESTARTS AGE csi-secrets-store-secrets-store-csi-driver-6dcm8 3/3 Running 0 2m2s Certifique-se de que o fornecedor de CSI do HashiCorp Vault seja executado com sucesso:
kubectl get pods -l app.kubernetes.io/name=vault-csi-provider NAME READY STATUS RESTARTS AGE vault-csi-provider-j7xbr 2/2 Running 0 5m39s
Configure a autenticação para acessar segredos.
Para configurar a autenticação OIDC JSON web token e Kubernetes:
Execute o seguinte comando para habilitar a autenticação OIDC JSON web token para o caminho de montagem. Se você configurar vários clusters do Kubernetes, deverá habilitar a autenticação OIDC JSON web token para o caminho de montagem de cada cluster.
vault auth enable -path=jwt-kube01 jwt Execute o seguinte comando para permitir o acesso não autenticado às URLs de descoberta OIDC no cluster
kube01.internal.io:$ kubectl create clusterrolebinding oidc-reviewer \ --clusterrole=system:service-account-issuer-discovery \ --group=system:unauthenticated Execute o seguinte comando para direcionar HashiCorp Vault a confiar no cluster. O emissor do cluster em
https://kube01.internal.io/deve corresponder à URL no documento de descoberta do OIDC em.well-known/openid-configuration.curl https://kube01.internal.io/.well-known/openid-configuration | jq .issuer https://kube01.internal.io/ vault write auth/jwt-kube01/config jwks_url="https://kube01.internal.io/openid/v1/jwks" Crie as políticas que permitem acesso aos segredos que você deseja expor ao cluster.
O exemplo a seguir cria a política
external-secretsque você especifica nas etapas posteriores.echo external-secrets-policy.hcl path "secret/data/kube01/external-secrets/*" { capabilities = ["read"] } Execute o comando para criar uma função do HashiCorp Vault e vincular uma conta de serviço do Kubernetes à função, que restringe o acesso da conta de serviço dentro do HashiCorp Vault.
O comando a seguir cria a função
jwt-kube01-systemdo tipo JSON web token (OIDC) para o públicovault. O comando especifica a declaração de usuáriosube a conta de serviçodefaultdo Kubernetes no namespacemongodb-atlas-systemcomo o assunto vinculado. Este comando vincula a função ao conjunto de permissões da políticaexternal-secretsno HashiCorp Vault.vault write auth/jwt-kube01/role/jwt-kube01-system role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:mongodb-atlas-system:default" \ policies="external-secrets" Execute o comando
defaultpara criar outro role para o External Secrets Operator acessar o namespace .O comando a seguir cria a função
jwt-kube01-defaultdo tipo JSON web token (OIDC) para o públicovault. Este comando especifica a declaração de usuáriosube a conta de serviçodefaultdo Kubernetes no namespacedefaultcomo o assunto vinculado. Este comando vincula a função ao conjunto de permissões da políticaexternal-secretsno HashiCorp Vault.vault write auth/jwt-kube01/role/jwt-kube01-default role_type="jwt" bound_audiences=vault \ user_claim="sub" bound_subject="system:serviceaccount:default:default" \ policies="external-secrets" Certifique-se de que a autenticação OIDC seja executada com sucesso para a conta de serviço do sistema:
export TEST_JWT_TOKEN=$(kubectl -n mongodb-atlas-system create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-system jwt=$(TEST_JWT_TOKEN) O Atlas Kubernetes Operator retorna suas credenciais OIDC JSON web token para a conta de serviço do sistema.
Certifique-se de que a autenticação OIDC seja executada com sucesso para a conta de serviço padrão:
export TEST_JWT_TOKEN=$(kubectl -n default create token default --audience "vault") vault write auth/jwt-kube01/login role=jwt-kube01-default jwt=$(TEST_JWT_TOKEN) O Atlas Kubernetes Operator retorna suas credenciais OIDC JSON web token para a conta de serviço padrão.
Para configurar a autenticação do Kubernetes:
Execute o comando a seguir para habilitar a autenticação do Kubernetes para o caminho de montagem. Se você configurar vários clusters Kubernetes, deverá habilitar a autenticação do Kubernetes para o caminho de montagem de cada cluster.
vault auth enable -path=jwt-kube01 kubernetes Quando você instala com o Helm, ele configura automaticamente a vinculação de função do cluster.
Crie políticas que permitam acesso aos segredos que você deseja expor no cluster.
O exemplo a seguir cria a política
vault-secretusada nas etapas posteriores. Ele usavault, um segredo do Kubernetes vinculado à conta de serviço HashiCorp Vault que o fornecedor Helm Chart CSI configura.echo vault-secret.yaml apiVersion: v1 kind: Secret metadata: name: vault annotations: kubernetes.io/service-account.name: vault type: kubernetes.io/service-account-token $ kubectl apply -f vault-secret.yaml Execute os comandos para confiar no cluster Kubernetes e usar a autenticação Kubernetes:
export VAULT_JWT ?= $(shell kubectl get secret/vault -o jsonpath='{.data.token}' |base64 -d) vault write auth/k8s-kube01/config kubernetes_host="kube01.internal.io" token_reviewer_jwt=$(VAULT_JWT) Execute o comando para criar uma função do HashiCorp Vault e vincular uma conta de serviço do Kubernetes à função, que restringe o acesso da conta de serviço dentro do HashiCorp Vault.
O comando a seguir cria a função
k8s-kube01noauth/k8s-kube01vinculado à conta de serviço do Kubernetes nos namespacesdefaultoumongodb-atlas-system. Esta função está vinculada à política de permissões dosecrets-storedentro HashiCorp Vault.vault write auth/k8s-kube01/role/k8s-kube01-role \ bound_service_account_names=default,mongodb-atlas-operator \ bound_service_account_namespaces=default,mongodb-atlas-system \ policies=secrets-store As políticas devem existir e permitir acesso aos segredos. A política de exemplo a seguir permite acesso aos segredos KV v2 no caminho
kube01/secrets-store:path "secret/data/kube01/secrets-store/*" { capabilities = ["read"] } Verifique se a autenticação do Kubernetes é executada com sucesso para a conta de serviço do sistema:
export TEST_JWT_TOKEN=$( kubectl create -n mongodb-atlas-system token mongodb-atlas-operator) vault write auth/jwt-kube01/login role=jwt-kube01-system jwt=$(TEST_JWT_TOKEN) Certifique-se de que a autenticação do Kubernetes seja executada com sucesso para a conta padrão:
export TEST_JWT_TOKEN=$(kubectl -n default create token default) vault write auth/jwt-kube01/login role=jwt-kube01-default jwt=$(TEST_JWT_TOKEN)
Configure o provisionamento automático de segredos.
Para provisionar segredos com o Operador de segredos externo:
Implemente o recurso personalizado
SecretStorepara a conta de serviçodefaultno namespacemongodb-atlas-system:$ cat external-secrets/vault-system.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: mongodb-atlas-system spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-kube01-system" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-system.yaml Implemente o recurso personalizado
SecretStorepara a conta de serviçodefaultno namespacedefault:$ cat external-secrets/vault-default.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-store namespace: default spec: provider: vault: server: "https://vault.internal.io" path: "secret" version: "v2" auth: jwt: path: "jwt-kube01" role: "jwt-role" kubernetesServiceAccountToken: expirationSeconds: 600 serviceAccountRef: name: "default" audiences: - vault $ kubectl apply -f external-secrets/vault-default.yaml Implemente o recurso personalizado do
ExternalSecretque referencia o segredo que contém a chave API. Você deve definirspec.target.template.metadata.labelscomoatlas.mongodb.com/typecom o valorcredentialspara o Atlas Kubernetes Operator encontrar o segredo que o External Secrets Operator cria.Antes de executar o seguinte comando, certifique-se de que o HashiCorp Vault tenha o segredo preenchido no caminho Kv V2
secret/data/kube01/external-secrets/atlas-accountcom as seguintes propriedades:orgIdpublicApiKeyprivateApiKey
$ cat external-secrets/atlas.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: atlas namespace: mongodb-atlas-system spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: mongodb-atlas-operator-api-key template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: orgId remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: orgId - secretKey: publicApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: publicApiKey - secretKey: privateApiKey remoteRef: key: secret/data/kube01/external-secrets/atlas-account property: privateApiKey $ kubectl apply -f external-secrets/atlas.yaml Este comando cria o segredo do Kubernetes
mongodb-atlas-operator-api-keyno namespacemongodb-atlas-system.Deploy the
ExternalSecretcustom resource that references the secret that contains database user credentials. Você deve definirspec.target.template.metadata.labelscomoatlas.mongodb.com/typecom o valorcredentialspara o Atlas Kubernetes Operator encontrar o segredo que o External Secrets Operator cria.Antes de executar o comando a seguir, verifique se o HashiCorp Vault tem o segredo preenchido no caminho Kv V2
secret/data/kube01/external-secrets/db-usercom a propriedadepassword.$ cat external-secrets/dbuser.yaml apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: dbuser namespace: default spec: refreshInterval: "15s" secretStoreRef: name: vault-store kind: SecretStore target: name: dbuser-password template: metadata: labels: atlas.mongodb.com/type: credentials data: - secretKey: password remoteRef: key: secret/data/kube01/external-secrets/db-user property: password $ kubectl apply -f external-secrets/atlas.yaml Certifique-se de que os segredos retornam conforme o esperado ao executar os seguintes comandos:
$ kubectl get -n mongodb-atlas-system secrets/mongodb-atlas-operator-api-key $ kubectl get -n default secrets/dbuser-password
Para provisionar segredos com o CSI do Secrets Store:
Implemente o recurso personalizado do
SecretProviderClassno namespace domongodb-atlas-system. Você deve definirspec.secretObjects.labelscomoatlas.mongodb.com/typecom o valorcredentialspara o Atlas Kubernetes Operator encontrar o segredo criado pelo CSI do Secrets Store.Antes de executar o seguinte comando, certifique-se de que o HashiCorp Vault tenha o segredo preenchido no caminho Kv V2
secret/data/kube01/external-secrets/atlas-accountcom as seguintes propriedades:orgIdpublicApiKeyprivateApiKey
$ cat secrets-store/atlas.yaml apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: atlas namespace: mongodb-atlas-system spec: provider: vault secretObjects: - data: - key: orgId objectName: atlas-org - key: publicApiKey objectName: atlas-pub-key - key: privateApiKey objectName: atlas-secret-key secretName: mongodb-atlas-operator-api-key type: Opaque labels: atlas.mongodb.com/type: credentials parameters: vaultAddress: https://vault.internal.io vaultKubernetesMountPath: k8s-kube01 roleName: k8s-kube01-role objects: | - objectName: atlas-org secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: orgId - objectName: atlas-pub-key secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: publicApiKey - objectName: atlas-secret-key secretPath: secret/data/kube01/secrets-store/atlas-account secretKey: privateApiKey $ kubectl apply -f secrets-store/atlas.yaml Este comando cria o segredo do Kubernetes
mongodb-atlas-operator-api-keyno namespacemongodb-atlas-system.Execute o seguinte comando para adicionar um pod que monta os segredos necessários:
$ cat secrets-store/ako-patch.yaml template: spec: containers: - name: system-secret-placeholder image: mongodb/atlas command: ["sleep", "infinity"] volumeMounts: - name: secrets-store-mount mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-mount csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: atlas $ kubectl apply -f secrets-store/ako-patch.yaml Implemente o
SecretProviderClassrecurso personalizado que referencia o segredo que contém credenciais de usuário de banco de dados . Você deve definirspec.target.template.metadata.labelscomoatlas.mongodb.com/typecom o valorcredentialspara o Atlas Kubernetes Operator para encontrar o segredo criado pelo CSI do Secrets Store.Antes de executar o comando a seguir, verifique se o HashiCorp Vault tem o segredo preenchido no caminho Kv V2
secret/data/kube01/external-secrets/db-usercom a propriedadepassword.$ cat external-secrets/dbuser.yaml apiVersion: external-secrets.io/v1beta1 kind: SecretProviderClass metadata: name: dbuser namespace: default spec: provider: vault secretObjects: - data: - key: password objectName: dbuser secretName: dbuser-password type: Opaque labels: atlas.mongodb.com/type: credentials parameters: vaultAddress: https://vault.internal.io vaultKubernetesMountPath: k8s-kube01 roleName: k8s-kube01-role objects: | - objectName: "dbuser" secretPath: "secret/data/kube01/secrets-store/db-user" secretKey: "password" $ kubectl apply -f secrets-store/dbuser.yaml Execute o seguinte comando para criar o pod sentido horário do
secret-placeholder, que garante que o driver CSI do Secrets Store busque as credenciais dodbusere sincronize-as com o Kubernetes:$ cat secrets-store/placeholder.yaml kind: Pod apiVersion: v1 metadata: name: secret-placeholder spec: containers: - image: mongodb/atlas command: ["sleep", "infinity"] name: secret-placeholder volumeMounts: - name: secrets-store-mount mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-mount csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: dbuser $ kubectl apply -f secrets-store/placeholder.yaml Certifique-se de que os segredos retornam conforme o esperado ao executar os seguintes comandos:
$ kubectl get -n mongodb-atlas-system secrets/mongodb-atlas-operator-api-key $ kubectl get -n default secrets/dbuser-password
Implemente recursos personalizados do Atlas Kubernetes Operator.
Agora você pode implantar recursos personalizados do Atlas Kubernetes Operator . O Atlas Kubernetes Operator autentica com os segredos do Kubernetes que fazem referência ao seu HashiCorp Vault. Ajuste os valores do timeout conforme necessário para seus sistemas.
kubectl apply -f ako/project.yaml kubectl apply -f ako/deployment.yaml kubectl apply -f ako/user.yaml kubectl wait --for=condition=ready atlasdeployment/serverless-deployment --timeout=10m kubectl wait --for=condition=ready atlasdatabaseuser/user --timeout=10m
Para saber mais sobre esses recursos personalizados, consulte Recursos personalizados.
Teste o sistema do Atlas Kubernetes Operator.
Para testar seu sistema do Atlas Kubernetes Operator, execute o seguinte comando:
export ATLAS_DEPLOYMENT_CONN_STR=$(kubectl get secrets/test-atlas-operator-project-test-serverless-deployment-dbuser -o jsonpath='{.data.connectionStringStandardSrv}' |base64 -d) mongosh $(ATLAS_DEPLOYMENT_CONN_STR) --apiVersion 1 --eval "show dbs"
O Atlas Kubernetes Operator retorna uma lista dos seus comandos de reconhecimento de data center.