Gerenciando segredos no Kubernetes

Os segredos do Kubernetes permitem que você armazene informações confidenciais com segurança. Usar um segredo elimina a necessidade de preparar dados confidenciais em definições de manifesto ou imagens de contêiner simples.
Os segredos são um tipo de recurso de primeira classe que existe independentemente de qualquer pod. Você fornece pods com referências aos seus segredos. A arquitetura permite que você limite o acesso aos segredos apenas aos pods que realmente precisam dos dados.
Você geralmente usa segredos para quaisquer constantes confidenciais que seus pods possam precisar. Eles são ideais para armazenar chaves de autenticação, credenciais de banco de dados e tokens de API.
Criando um segredo
Os segredos são criados da mesma maneira que qualquer outro recurso da API do Kubernetes. Você pode usar comandos Kubectl ou um manifesto YAML que, em seguida, aplica ao seu cluster. Forneceremos exemplos de arquivos YAML neste tutorial.
Veja aqui como definir um segredo criado pelo usuário:
apiVersion: v1 kind: Secret type: Opaque metadata: name: demo-secret data: SECRET_USERNAME: dXNlcm5hbWUK SECRET_PASSWORD: cGFzc3dvcmQK
Os segredos consistem em um tipo e um simples objeto de dados. O segredo de exemplo define dois campos de dados separados, SECRET_USERNAME e SECRET_PASSWORD. Os valores devem ser codificados em Base64 – os valores mostrados acima eram originalmente nome de usuário e senha.
Se você estiver trabalhando com um modelo Helm, poderá definir seus valores secretos em um arquivo values. yaml. Passe-os por b64enc em seu manifesto para que o Helm os codifique como Base64.
apiVersion: v1 kind: Secret type: Metadados opacos: name: demo-secret data: SECRET_PASSWORD: {{. Values. SecretPassword | b64enc}}
Se você preferir não codificar seus valores em Base64, poderá usar o campo stringData. Como os dados, stringData é um mapa de pares de valores-chave, mas os valores serão processados literalmente, sem nenhuma codificação.
Tipos secretos
O tipo secreto opaco deve ser usado para dados arbitrários que você mesmo define. O Kubernetes define alguns outros tipos de segredo integrado destinados a cenários de uso específicos.
Os tipos disponíveis incluem token de conta de serviço (um token de serviço Kubernetes), dockerconfigjson (um arquivo Docker config. json serializado, para fornecer credenciais Docker) e ssh-auth (fornecer SSH credenciais). Além desses tipos, existem soluções para autenticação básica HTTP e dados de certificado TLS.
Cada tipo de segredo é capaz de definir seus próprios campos extras e restrições de validação. Normalmente, você precisará definir anotações adicionais em seu segredo para fornecer os dados necessários para o tipo de segredo.
Você pode criar seus próprios identificadores de tipo secreto fornecendo sua própria string ao campo de tipo. O segredo resultante será funcionalmente equivalente ao tipo Opaco.
Fornecendo segredos para pods
Depois de criar um segredo, você precisa disponibilizá-lo para seus pods. Você pode injetar dados secretos como variáveis de ambiente ou como um arquivo montado em um volume.
Aqui está um manifesto do Pod que extrai dados secretos das variáveis de ambiente:
apiVersion: v1 kind: Pod metadata: name: pod-with-secret spec: containers: - name: demo-container image: my-image: último envFrom: - secretRef: nome: demo-secret
Ao usar envFrom, todos os pares de valores-chave definidos nos dados do secret serão convertidos em variáveis de ambiente do contêiner. Com o segredo de exemplo anterior, seu contêiner teria as variáveis de ambiente SECRET_USERNAME e SECRET_PASSWORD injetadas. Os valores serão decodificados automaticamente em Base64.
Às vezes, você desejará trabalhar com arquivos em vez de variáveis de ambiente. Veja como montar um segredo em um volume do Kubernetes.
apiVersion: v1 kind: Pod metadata: name: pod-with-secret spec: containers: - name: demo-container image: my-image: últimos volumesMounts: - name: secret-volume mountPath: / secrets volumes: - name: secret-volume secret: secretName: demo-secret
Acesse o diretório / secrets dentro do contêiner para visualizar os dados secretos. Cada chave de dados terá seu próprio arquivo. O conteúdo do arquivo será o valor decodificado em Base64 dessa chave. Nosso segredo de exemplo escreveria os arquivos / secrets / SECRET_USERNAME e / secrets / SECRET_PASSWORD.
A abordagem funciona criando um volume Kubernetes usando a fonte secreta. Esta fonte preenche o volume com os dados de um segredo nomeado. O volume é então montado no contêiner no caminho definido em volumeMounts.
Considerações de segurança
Colocar dados em um segredo não o torna seguro automaticamente. A codificação Base64 fornece obscuridade superficial, mas não se engane: isso é codificação e não criptografia. Qualquer coisa com acesso ao seu cluster, seja um usuário humano ou um aplicativo com permissão adequada, pode recuperar valores secretos de texto simples.
O segredo é reduzir o risco de exposição acidental de dados ao criar e visualizar pods. Os segredos são fornecidos apenas para pods – e para nós – que realmente os requerem. O Node destruirá suas cópias locais de segredos quando o pod que os usou terminar.
O plano de controle do Kubernetes armazena valores secretos em sua instância etcd. Este é um armazenamento de valor-chave que faz o backup dos dados do cluster do Kubernetes. Se quiser maximizar a segurança, você deve configurar a criptografia em repouso para seu armazenamento etcd. Isso criptografará seus segredos no etcd.
Você também deve avaliar como sua camada de aplicativo lida com segredos. Mesmo com a criptografia em repouso ativada, seus contêineres podem vazar segredos inadvertidamente, emitindo-os para logs de trabalho ou enviando-os para serviços externos. Usar as chaves secretas do Kubernetes não elimina a necessidade de lidar com dados confidenciais com cuidado em seu contêiner.
Resumo
Os segredos do Kubernetes permitem que você armazene e acesse dados confidenciais em seu cluster do Kubernetes. Usar segredos dá a você mais controle sobre a exposição de informações. Também torna explícito que você está lidando com valores potencialmente confidenciais. Isso pode funcionar como um aviso para os usuários e administradores do cluster.
Os pods consomem segredos como variáveis de ambiente ou arquivos montados em volume. O Kubernetes lida com a injeção de segredos em contêineres. Suas cargas de trabalho podem acessar os dados usando seus mecanismos de configuração existentes. Os segredos não são totalmente seguros por padrão, mas você pode aumentar sua proteção ativando a criptografia em nível de cluster.
Nenhum comentário