Índice
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?
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
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)
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
-
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.