Configurar armazenamento secreto
Nesta página
Você pode escolher onde armazenar informações confidenciais para os componentes que o Atlas Kubernetes Operator gerencia, mas o Atlas Kubernetes Operator precisa encontrar os segredos do Kubernetes { o que espera. Você pode armazenar segredos para o Atlas Kubernetes Operator de várias maneiras, incluindo os seguintes métodos:
Coloca 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 Segredos Selados, 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 soluções de gerenciamento de segredos nativos da Hyperscalers. Uma ferramenta intermediária de provisionamento de segredos obtém informações confidenciais da ferramenta de armazenamento externo de segredos 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 de segredos usa um ou mais mecanismos de autenticação para recuperar as credenciais do serviço de gerenciamento de segredos e criar segredos que o Atlas Kubernetes Operator pode usar. 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 operador de segredos externos , este tutorial usa autenticação de tokenda web OIDC JSON . Para saber mais,consulte Autenticação JSON web token/OIDC.
Para o driver CSI do Secrets Store, este tutorial utiliza 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 secreto, em execução 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:
HashiCorp Vault ou serviço 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 secreta:
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 seguinte comando para instalar o CSI HashiCorp Vault do Secrets Store plugin -in com Helm Charts. Você não precisa instalar o HashiCorp Vault servidor ou 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 Garantir o HashiCorp Vault O fornecedor de CSI é 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 para 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-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 um HashiCorp Vault role e vincule uma conta de serviço do Kubernetes à role, que restringe o acesso da conta de serviço ao HashiCorp Vault.
O comando a seguir cria a função
jwt-kube01-system
do tipo JSON web token (OIDC) para o públicovault
. O comando especifica a declaração de usuáriosub
e a conta de serviçodefault
do Kubernetes no namespacemongodb-atlas-system
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 função
jwt-kube01-default
do tipo JSON web token (OIDC) para o públicovault
. Este comando especifica a declaração de usuáriosub
e a conta de serviçodefault
do Kubernetes no namespacedefault
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. Ele usavault
, um segredo do Kubernetes vinculado ao HashiCorp Vault conta de serviço 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 um HashiCorp Vault role e vincule uma conta de serviço do Kubernetes à role, que restringe o acesso da conta de serviço ao HashiCorp Vault.
O comando a seguir cria a função
k8s-kube01
noauth/k8s-kube01
vinculado à conta de serviço do Kubernetes nos namespacesdefault
oumongodb-atlas-system
. 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 comando a seguir, certifique-se de que HashiCorp Vault tem o segredo preenchido no2 caminho
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, certifique-se de que HashiCorp Vault tem o segredo preenchido no2 caminho
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 comando a seguir, certifique-se de que HashiCorp Vault tem o segredo preenchido no2 caminho
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, certifique-se de que HashiCorp Vault tem o segredo preenchido no2 caminho
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 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.