Armazenamento criptografado secreto no Kubernetes

Prefácio

Ao usar o Kubernetes, frequentemente configuramos algumas variáveis ​​de ambiente por meio de recursos nativos, como configmap e secret, para que possam ser usadas para gerenciamento de versão git junto com o código. Tudo bem se for usado para armazenar informações gerais, mas às vezes podemos precisar usar esses recursos para configurar algumas informações confidenciais, como senhas de contas.Embora os segredos tenham propriedades de criptografia, porque seu próprio método de criptografia é baseado em base64, não é adequado por um pouquinho. Para pessoas com algum conhecimento relevante, é equivalente a texto simples.

Na gestão dos departamentos de P&D de muitas empresas, muitas senhas de contas no ambiente de produção não podem ser conhecidas por outras pessoas além dos administradores (como senhas de banco de dados).Se as informações relevantes não forem criptografadas e armazenadas, o gerenciamento de versões pode ser realizado diretamente no git. Para os envolvidos, é o mesmo que correr nu. Então aqui apresentamos um tipo de recurso de código aberto do K8Ssealed-secrets

O que são segredos selados?

官方地址: bitnami-labs/sealed-secrets: um controlador e ferramenta Kubernetes para segredos criptografados unidirecionais (github.com)

Problema: “Posso gerenciar todas as configurações do meu K8s no git, exceto Secrets.”

Solução: criptografe seu segredo em um SealedSecret, que pode ser armazenado com segurança - mesmo dentro de um repositório público. O SealedSecret pode ser descriptografado apenas pelo controlador em execução no cluster de destino e ninguém mais (nem mesmo o autor original) é capaz de obter o segredo original do SealedSecret.

Esta pergunta e resposta no documento oficial expressa claramente o papel dos segredos selados: permitir-nos compartilhar, armazenar e usar segredos com segurança e evitar que a criptografia de informações seja quebrada.

Instalação e implantação

Segredos Selados consiste em duas partes:

  • Controlador do lado do servidor
  • Ferramenta cliente: kubeseal

kubeseal usa criptografia assimétrica para criptografar dados. Somente o controlador do lado do servidor pode descriptografar os dados. Os dados criptografados são codificados em recursos SealedSecret.

Instale o kubeseal

1. Faça login em Releases · bitnami-labs/sealed-secrets (github.com) , encontre a versão mais recente, selecione a versão adequada para o seu sistema para baixar
Insira a descrição da imagem aqui
2. Descompacte o pacote compactado e coloque a ferramenta em /usr/local diretório /bin/

tar -zxvf kubeseal-0.19.3-linux-amd64.tar.gz
install -m 755 kubeseal /usr/local/bin/kubeseal
##验证一下
[root@master sealed-secrets]# kubeseal --version
kubeseal version: 0.19.3

Instale o controlador

1.Baixar

Faça login no github e baixe o arquivo de recurso correspondente. Releases · bitnami-labs/sealed-secrets (github.com)
Insira a descrição da imagem aqui
2. Implantação

kubectl apply -f controller.yaml

3. Visualizar pod

[root@master sealed-secrets]# kubectl get pods -n kube-system -l name=sealed-secrets-controller
NAME                                         READY   STATUS    RESTARTS   AGE
sealed-secrets-controller-8645675c65-jtrc2   1/1     Running   0          10d
[root@master sealed-secrets]# kubectl logs sealed-secrets-controller-8645675c65-jtrc2 -n kube-system 
controller version: 0.19.3
2022/12/23 09:15:22 Starting sealed-secrets controller version: 0.19.3
2022/12/23 09:15:22 Searching for existing private keys
2022/12/23 09:15:24 New key written to kube-system/sealed-secrets-keymrkx6
2022/12/23 09:15:24 Certificate is 
-----BEGIN CERTIFICATE-----
MIIEzTCCArWgAwIBAgIRAONV9p03jyrJuRrGUwyJJ2AwDQYJKoZIhvcNAQELBQAw
ADAeFw0yMjEyMjMwOTE1MjRaFw0zMjEyMjAwOTE1MjRaMAAwggIiMA0GCSqGSIb3
DQEBAQUAA4ICDwAwggIKAoICAQDMkPndKm9g0XpgdNMuHvZ2qWsSGlET3pGyiSSs
APWDPT8FJEOcO1d4SrevrBCfWLxsd+CMyl4SE6Os1zqGXNMPAWJuag0JJBqcONgi
k3yWpma3h3g0fY21T7MUoAO16a+uMBJEPZAfzjfb3Oz8q26mWi8Ct96DKsvZkdZs
Xt1PL6nCKvj8DuAqH9+VzDiW/z66TeOCd8RsvJkMjGpyBZR+puIiDdDZ0dY/bS5l
0p3Ri72cTKnTBToLr3tM91einiJ0vhaMMVEdCED84rautJtbyBk/Km15g+D9ojW+
LcL5z8qKtDn13Hxo/2RRuUt4gsucuqrBWYUwKj8qoQZ/+iHAs6Ym+Y3A94qNFxNQ
udAbu/7HVIEOIU5G64HY5dqiQN5LJRqM7zlUjip65Rrr/Ysk/t0kNULKDX1060/k
EaVC8pPYa5hQLcWmyRBWstQTSNYGHO2ANevBIOT+O4wjrmEyC9dMuVRomdkqSkBi
NJsIYc3JATiGWcDax6H1G2V+QYmjg0PlH008e/n2wbJmAfHIxxBgMHGL0FPUFthX
rNhMHAirDrB7I1yW/OaoIm/YRJM+PMmJOk4IkJ66a6pVHDuRfY8lwDiH8vJaYk6y
oDS6T9qJ1bKTFDZtPg4rna+C36/px57BW/bTADHNckefuPFtAGbflEabeGr0TcoC
sU/ATQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAAEwDwYDVR0TAQH/BAUwAwEB/zAd
BgNVHQ4EFgQULw16NueVc/9IABCb1k6GGESJVJkwDQYJKoZIhvcNAQELBQADggIB
ACXaJ318/8KLv8MOzqtA0dhzQsqZkdrC+jm+Sf+nAmGFP1K/MsSQa8Ggyw/o8t/E
c+q2UYBF8CeP5hDRWlTavvkJISjQTyGJlhuhwA9EefFgcX4hIJhXrLqOGL7tJplr
oVyCoqDbeWuR4M3Nr2z44AQqbo0L9QFkEW4fHHOtIjjt9535yGgB5ApuryM/Crad
7Y3dC1Uohn7oW/4xO0EIjn1blOh9XFc4a862frTiQP54gZ3yU9/JhieSLlNFkReT
ZHcIIGKvNp52mw1hVJATClWKF3JljK4YLG+lHd1NGiuBLDvI6s/9x/3Fih8S37Tv
V3AFz1F0yb5xbFALmhzhgi744vK2lXt2/Gp6SzLq4cIQFi10wYNrW7I2dlpJczs3
p0PmCEJa1r2WEBLvlS+85FkJy7CXrCc9te4vHGIqY2kBG5u2VUUm/gl21HHrTYDt
P5HalOefSq+ve02Tiyyye8STz1sr0bN0db47DOhylnkzJPgHWMCuOq0KNZBry2N9
euPDbGlhga3USPWOyKV6eingIFFT7ug9Fc5vLBh+mD8FQjDOAJ4Cl0MbkIDuQy+x
wYf9W21fxfKQnBgjYvjcNb5no7wKp2KsWshXWDkoih/05icJMfTSkwQ/Qzu4dbDw
6IifuAQn4SzIUd6y+0sVNjZK9XQ3ve+NYYBvM01OhfUA
-----END CERTIFICATE-----

4. Visualize informações de chave pública/privada

kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml

teste

1. Crie um arquivo secreto

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456 --dry-run -o yaml > mysecret.yaml

# 查看生成的文件
[root@master sealed-secrets]# cat mysecret.yaml 
apiVersion: v1
data:
  password: MTIzNDU2
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: null
  name: mysecret

2. Use kubeseal para criptografar e converter mysercret.yaml

kubeseal --format=yaml < mysecret.yaml > mysecret-sealed.yaml
### kubeseal输出的默认格式是json,此处使用--format将格式转为yaml,这一步是kubeseal从Kubernetes集群获取公钥并使用该公钥加密数据

##查看转换后的SealedSecret
[root@master sealed-secrets]# cat mysecret-sealed.yaml 
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: mysecret
  namespace: default
spec:
  encryptedData:
    password: AgBPYXyfWoN6YH/Dls8+L8uIQbHEfVmd6T4bOe3Y0W7d4wL9YPCLDS4fNpjJMPGx7nnR2nJkL2nWcr8xqepkLuIgn5cIZxQ5+EV624nzDIrm/PWE/3GNgb6oCQmpbcW2fIYVbicG6xpz3KHsPKHgxXQCGUJD9wB6bb1wWw5UZOGmihjHanzqbWZhdicDyfKdkyGHPiVi83xgdRmCaScgz9f1EQOfNsD5IkjD3gyLp3ZoMJUBprx0vvKDfZcoIL7vBJLHke9SrvDFtPdfmIneL2yJ7Gew4DJazlUct/U9FnMczl7Wr1Y6YAOFNNV9ysCRVC+C1bmrwr5r21G17KeES+GWLyXIy/epKoCpmtWcHJ22YNhSEtR0RGHWHCwSPeXbr2SdQegZ0Pk64X9QAYrEBO7IhF2gA1JA045DwFMXJjrKzDW+4ogslDXT2a5cIcVKVdrCGk8ajSsXQeOFq5GIcWLPeXs/LRu5SYyj7nr+xjyrPUtV7vxbNUmBCoFJ5TvWnO5yKE6wGQuTUxCOiIRf44KZqy03XZD2nsxe5UW/tyLJHXp1VL8hYHcoSfVSMHsTVPCNpDDUxCnZRnncfRHAXUyPnI2Cpx7uKsg8zu7M6TKklm8g1Ow+P8XBjzTY5vAr441oTad86REHQ6FVdBw8IKtZHYy2kxaTrThnWB3L+3ckk7ZhM3kbIDUdbXkFTkEx82A76ucXSLc=
    username: AgCwYrUhSKTgBZ5rf8DTToyB6yztH1+4P5tCv3mSCXt0dJ4L5sCso38JwBQJW6IRgw9nHqXdNwdZKpZW7Yjjr/LpsKUrs/9XkO+rgyf68uXi5tqNSHpsCza3e9Jx9qUI7k3WjHFHtRt5IsaO4OH7tUEmVlnCeuegXZ51HJfnmsZIgzGqDhnHWt6Z9FUOMvyd8jpro58p8tjjZIEBgrIRlMJdGSuUuSP0o3x30/4oPO7+yqbeV9B7OOp7i+sk4LBNfclmjLgySbCww6bc6wHr45NIt/bhIYkiKwk/IWh5e5LBqmZh+klkWA+GcltDTXi7+wv2UMAJXBmPhg4x41/unZUDhsljMvkPC92xWjivp4SMcMrRnjzKYI5UiTi5czS3uqRjH23q6U5/QM0o9IqVRojbSsnF9RmAAsfvZSoToHMgxOyS5ApF+4K/p9LI5t+vz3h7SQ+QhwYyyCcA3JRoK8a0ZFa3fz6bSMFMR+ANC7JtNez7Kiem9WjFhP+FB99UJCGdPmVHWL44uThtRZf/B3hO2hb/oXNHfZiUdjvXdB6Ee56yCUZrurkfjGd0ElnTy7a2CpEHjk2KIETv47qXnL4R6hRbd7nwdprjEg/0hawa0xhwat2PA4Vt+ZG2VbWYIgqc8TgDHJObb6IPn0HEoPvaZCGK1GzXspsbslNMdWrHu5bmbimVDrl7VUAKMWQe7uOy1PHy9A==
  template:
    metadata:
      creationTimestamp: null
      name: mysecret
      namespace: default

3. Implante mysecret-sealed.yaml

kubectl apply -f mysecret-sealed.yaml
##查看部署后的文件
[root@master sealed-secrets]# kubectl get secrets mysecret -o yaml
apiVersion: v1
data:
  password: MTIzNDU2
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: "2022-12-23T09:24:38Z"
  name: mysecret
  namespace: default
  ownerReferences:
  - apiVersion: bitnami.com/v1alpha1
    controller: true
    kind: SealedSecret
    name: mysecret
    uid: af66d9ea-3ce3-4894-a1b5-0c3396ffb8d3
  resourceVersion: "2935007"
  uid: ed797abd-4390-4fc3-bda0-56c36c531d37
type: Opaque

Como você pode ver, mysecret-sealed.yaml é restaurado para segredo e implantado

Podemos ver o processo de conversão através do log: o controlador intercepta a solicitação, descriptografa os dados criptografados do SealedSecret e então cria o objeto Secret

kubectl logs sealed-secrets-controller-8645675c65-jtrc2 -n kube-system
....
2022/12/23 09:24:38 WARNING: Empty API version & kind, filling it...
2022/12/23 09:24:38 Updating default/mysecret
2022/12/23 09:24:38 Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"default", Name:"mysecret", UID:"af66d9ea-3ce3-4894-a1b5-0c3396ffb8d3", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"2935006", FieldPath:""}): type: 'Normal' reason: 'Unsealed' SealedSecret unsealed successfully
....

Instale a interface do usuário da web

Em muitos casos (como devops de processo completo), os administradores de cluster e as operações e manutenção de negócios não têm as mesmas permissões. Portanto, este método de operação de linha de comando não pode ser aplicado a todas as situações. Nesse caso, uma interface WEB-UI é necessário para concluir isso Para o processo de criptografia, felizmente o Github abriu o código-fonte da interface da web correspondente ao selado em segredo.

endereço do site oficial web-ui

bakito/sealed-secrets-web: Uma interface web para Sealed Secrets da Bitnami. (github. com)

Instale diretamente usando o helm
helm repo add bakito https://charts.bakito.net
helm repo update

helm upgrade --install sealed-secrets-web bakito/sealed-secrets-web

Claro, podemos precisar de alguma configuração personalizada

helm upgrade --install sealed-secrets-web bakito/sealed-secrets-web \
  --set sealedSecrets.namespace=sealed-secrets-web \
  --set sealedSecrets.serviceName=sealed-secrets

Para outros métodos de uso, consulte a documentação oficial.

Ver implantação

[root@master sealed-secrets]# kubectl get all -n sealed-secrets-web 
NAME                                      READY   STATUS    RESTARTS   AGE
pod/sealed-secrets-web-6874bbdfb5-9p5wq   1/1     Running   0          8d

NAME                         TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service/sealed-secrets-web   ClusterIP   10.1.3.215   <none>        80:/TCP   8d

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/sealed-secrets-web   1/1     1            1           8d

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/sealed-secrets-web-6874bbdfb5   1         1         1       8d

Expomos a porta service/sealed-secrets-web no modo nodeport (é claro que você também pode usar o ingressgateway):

kubectl edit svc sealed-secrets-web -n sealed-secrets-web ##编辑svc
...
  spec:
    clusterIP: 10.1.3.215
    clusterIPs:
    - 10.1.3.215
    externalTrafficPolicy: Cluster
    internalTrafficPolicy: Cluster
    ipFamilies:
    - IPv4
    ipFamilyPolicy: SingleStack
    ports:
    - name: http
      nodePort: 30088  #------------------新增
      port: 80
      protocol: TCP
      targetPort: http
    selector:
      app.kubernetes.io/instance: sealed-secrets-web
      app.kubernetes.io/name: sealed-secrets-web
    sessionAffinity: None
    type: NodePort   #--------------将ClusterIP修改为NodePort
  status:
    loadBalancer: {
    
    }

...
[root@master sealed-secrets]# kubectl get svc -n sealed-secrets-web 
NAME                 TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
sealed-secrets-web   NodePort   10.1.3.215   <none>        80:30088/TCP   8d

acesso à web
Insira a descrição da imagem aqui

  • Codificar : Base64 codifica secretamente cada chave no campo stringData.

  • Decodificar : Base64 decodifica secretamente cada chave no campo de dados.

  • Secrets : Retorna uma lista de todos os Segredos Selados em todos os namespaces. Clique em Sealed Secret para carregar o segredo descriptografado do Kubernetes.

  • Seal : Criptografe segredos do Kubernetes e crie segredos selados.

deficiência

A web não possui um sistema de autenticação de login, então você precisa encontrar uma maneira de resolver o problema de permissão sozinho, como integrá-lo a outro gerenciamento de permissões da Web. A API oficial fornece uma referência para transformação.

Acho que você gosta

Origin blog.csdn.net/Mrheiiow/article/details/128530761
Recomendado
Clasificación