Você pode escolher onde armazenar informações confidenciais dos componentes que o Atlas Kubernetes Operator gerencia, mas o Atlas Kubernetes Operator precisa 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 diretamente nos segredos do Kubernetes . Todos os tutoriais na documentação do Atlas Kubernetes Operator utilizam segredos do Kubernetes por padrão. Para usar segredos do Kubernetes, siga as etapas nos tutoriais.
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 ferramentas, como o Secure 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 uma das seguintes ferramentas de provisionamento secretas 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 OIDC JWT. Para saber mais, consulte Autenticação JWT/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 fornecedor de nuvem 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.io
escutando 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 implementar o Atlas Kubernetes Operator, execute o seguinte comando. Substitua
<version>
pelo número de 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 o HashiCorp Vault, que é um serviço de terceiros para armazenamento de segredos, executado
https://vault.internal.io
em.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.io
sã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 o token web OIDC JSON web token e a autenticação Kubernetes :
Execute o comando a seguir para habilitar a autenticação de token da web OIDC JSON para o caminho de montagem. Se você configurar vários clusters do Kubernetes , deverá ativar a autenticação de token da web OIDC JSON 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 aos URLs de descoberta do 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 o HashiCorp Vault a confiar no cluster. O emissor do cluster em
https://kube01.internal.io/
deve corresponder à URL no documento de descoberta do OIDC.well-known/openid-configuration
em.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-secrets
que 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
jwt-kube01-system
função do tipo JWT (OIDC) para ovault
público. O comando especifica asub
declaração de usuário e adefault
conta de serviço do Kubernetes nomongodb-atlas-system
namespace como o assunto vinculado. Este comando vincula a função aoexternal-secrets
conjunto de permissões da política no 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
default
para criar outro role para o External Secrets Operator acessar o namespace .O comando a seguir cria a
jwt-kube01-default
função do tipo JWT (OIDC) para ovault
público. Este comando especifica asub
declaração de usuário e adefault
conta de serviço do Kubernetes nodefault
namespace como o assunto vinculado. Este comando vincula a função aoexternal-secrets
conjunto de permissões da política no 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" Garanta 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) Atlas Kubernetes Operator retorna suas credenciais de token da web OIDC JSON web token para a conta de serviço do sistema.
Garanta 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) Atlas Kubernetes Operator retorna suas credenciais de token da web 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-secret
usada nas etapas posteriores. Elevault
usa, 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
k8s-kube01
funçãoauth/k8s-kube01
no vinculado à conta de serviço do Kubernetes nosdefault
mongodb-atlas-system
namespaces ou. Esta função está vinculada àsecrets-store
política de permissões do dentro 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
SecretStore
para a conta de serviçodefault
no 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
SecretStore
para a conta de serviçodefault
no 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
ExternalSecret
que referencia o segredo que contém a chave API. Você deve definirspec.target.template.metadata.labels
comoatlas.mongodb.com/type
com o valorcredentials
para 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 no2 caminho Kv V
secret/data/kube01/external-secrets/atlas-account
com as seguintes propriedades:orgId
publicApiKey
privateApiKey
$ 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-key
nomongodb-atlas-system
namespace.Deploy the
ExternalSecret
custom resource that references the secret that contains database user credentials. Você deve definirspec.target.template.metadata.labels
comoatlas.mongodb.com/type
com o valorcredentials
para 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 no2 caminho Kv V
secret/data/kube01/external-secrets/db-user
com apassword
propriedade.$ 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
SecretProviderClass
no namespace domongodb-atlas-system
. Você deve definirspec.secretObjects.labels
comoatlas.mongodb.com/type
com o valorcredentials
para 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 no2 caminho Kv V
secret/data/kube01/external-secrets/atlas-account
com as seguintes propriedades:orgId
publicApiKey
privateApiKey
$ 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-key
nomongodb-atlas-system
namespace.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
SecretProviderClass
recurso personalizado que referencia o segredo que contém credenciais de usuário de banco de dados . Você deve definirspec.target.template.metadata.labels
comoatlas.mongodb.com/type
com o valorcredentials
para 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 no2 caminho Kv V
secret/data/kube01/external-secrets/db-user
com apassword
propriedade.$ 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 dodbuser
e 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 timeout
valores do 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.