[Cloud native | Aprendendo Kubernetes do zero] 27. Central de gerenciamento de configuração Secret e autorização rbac

Este artigo foi incluído na coluna " Aprenda k8s do zero "
Artigo anterior: Compreensão aprofundada do kubectl Clique pular

insira a descrição da imagem aqui

Segredo do Centro de Gerenciamento de Configuração

O que é um Segredo?

O Configmap que aprendemos acima geralmente é usado para armazenar dados de texto simples, como arquivos de configuração. Para alguns dados confidenciais, como senhas, chaves privadas e outros dados, o tipo secreto é usado.

Secret resolve o problema de configuração de dados confidenciais, como senhas, tokens e chaves secretas sem expor esses dados confidenciais a imagens ou especificações de pod. Secret pode ser usado como Volume ou variável de ambiente.

Para usar um segredo, o pod precisa fazer referência ao segredo. Os pods podem usar segredos de duas maneiras: como arquivos em um volume que são montados em um ou mais contêineres no pod ou quando o kubelet extrai imagens para o pod. (Por exemplo, harbour pull, que armazena a senha do usuário do porto, etc.)

Existem três parâmetros opcionais para o segredo:

genérico: Um tipo genérico, normalmente usado para armazenar dados de senha.

tls: Este tipo é usado apenas para armazenar chaves privadas e certificados.

docker-registry: Se você deseja salvar as informações de autenticação do repositório docker, deve usar esse tipo para criar.

Tipo de segredo:

Conta de serviço: costumava ser referenciada por conta de serviço. Quando o serviceaccout for criado, o Kubernetes criará o segredo correspondente por padrão. Se o pod usar serviceaccount, o segredo correspondente será montado automaticamente no diretório /run/secrets/kubernetes.io/serviceaccount do pod.

Opaco: Segredo no formato de codificação base64, usado para armazenar senhas, chaves secretas, etc. Os dados originais podem ser obtidos através da decodificação base64-decode, então a segurança é fraca

kubernetes.io/dockerconfigjson: usado para armazenar informações de autenticação para registro privado do docker.

Usar segredo

1. Introduzir o segredo através de variáveis ​​de ambiente para
criar a senha do usuário root do mysql como segredo

[root@k8smaster ~]# kubectl create secret generic mysql-password --from-literal=password=paopaopodshuaige66 
secret/mysql-password created

[root@k8smaster secret]# kubectl get secrets
NAME                          TYPE                                  DATA   AGE
mysql-password                Opaque                                1      60s

[root@k8smaster secret]# kubectl describe secret mysql-password 
Name:         mysql-password
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  18 bytes

O valor da senha é criptografado, mas a criptografia do segredo é uma pseudo-criptografia, apenas codifica os dados em base 64. Segue-se a descriptografia para encontrar a senha criptografada em mysqlpassword.

[root@k8smaster secret]# kubectl get secret -o yaml 
- apiVersion: v1
  data:
    password: eGlhbmNoYW9wb2QqKmx1Y2t5NjY=
[root@k8smaster secret]# echo 'eGlhbmNoYW9wb2QqKmx1Y2t5NjY=' | base64 --decode
paopaopodshuaige66
 
#创建 pod,引用 secret 
[root@k8smaster secret]# vim pod-secret.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    env:
     - name: MYSQL_ROOT_PASSWORD #它是 Pod 启动成功后,Pod 中容器的环境变量名. 
       valueFrom:
          secretKeyRef: 
            name: mysql-password #这是 secret的对象名 把这个secret中的password这个key和对应的value值赋值给上面的变量
            key: password #它是 secret 中的 key 名
[root@k8smaster secret]# kubectl apply -f pod-secret.yaml 
pod/pod-secret created
[root@k8smaster secret]# kubectl exec -it pod-secret -- /bin/sh 
/ # printenv 
MYSQL_ROOT_PASSWORD=paopaopodshuaige66

Monte Segredo via volume

Criar segredo, criptografar manualmente, com base na criptografia base64

[root@k8smaster secret]# echo -n 'admin' | base64 
YWRtaW4=
[root@k8smaster secret]# echo -n 'paopaoshuaige' | base64 
cGFvcGFvc2h1YWlnZQ==
 
解码
[root@k8smaster secret]# echo cGFvcGFvc2h1YWlnZQ== | base64 -d 
paopaoshuaige

Criar arquivo yaml

[root@k8smaster secret]# vim secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: cGFvcGFvc2h1YWlnZQ==

[root@k8smaster secret]# kubectl apply -f secret.yaml 
secret/mysecret created

[root@k8smaster secret]# kubectl describe secret mysecret 
Name:         mysecret
Namespace:    default
Labels:       <none>
Annotations:  
Type:         Opaque

Data
====
password:  13 bytes
username:  5 bytes

Monte o Segredo no Volume

[root@xianchaomaster1 ~]# vim pod_secret_volume.yaml 
apiVersion: v1
kind: Pod 
metadata: 
  name: pod-secret-volume
spec: 
  containers:
  - name: myapp
    image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume				#把secret做成卷挂载到/etc/secret 只读权限
    secret:
      secretName: mysecret
 
[root@k8smaster secret]# kubectl apply -f pod_secret_volume.yaml 
pod/pod-secret-volume created
[root@k8smaster secret]# kubectl exec -it pod-secret-volume -- /bin/sh 
/ # ls /etc/secret 
password  username
/ # cat /etc/secret/username 
admin
/ # cat /etc/secret/password 
paopaoshuaige/ # 

Pode-se ver acima que as informações secretas montadas no pod foram realmente descriptografadas.

Autorização RBAC do mecanismo de segurança k8s

gerenciamento de segurança k8s: uma visão geral da autenticação, autorização e controle de admissão

O k8s fez configurações precisas para autenticação, autorização e controle de acesso de todo o nosso sistema; para o cluster k8s, o apiserver é a única entrada para o controle de acesso de todo o cluster. Quando implantamos aplicativos no cluster k8s, também podemos pass the sink A porta exposta pelo NodePort do host acessa o programa dentro, e o usuário precisa passar pelo seguinte processo de autenticação para acessar o cluster kubernetes: authentication -> autorização -> controle de admissão (adminationcontroller)

1. Autenticação é a autenticação do cliente, e o ponto popular é a autenticação de nome de usuário e senha

2. Autorização é a autorização de recursos. Os recursos no k8s nada mais são do que contêineres. No final, são na verdade os recursos de computação, rede e armazenamento do contêiner. Quando uma solicitação é autenticada, ela precisa acessar um determinado resource (como criar um pod) , a verificação de autorização determinará se o recurso (como um pod em um namespace) está acessível ao cliente de acordo com as regras de autorização.

3. Mecanismo de Controle de Admissão: O Controlador de Admissão está localizado no Servidor API. Antes que o objeto seja persistido, o Controlador de Admissão intercepta a solicitação ao Servidor API, que geralmente é usado para autenticação e autorização. Ele contém dois controladores especiais:

MutatingAdmissionWebhook e ValidatingAdmissionWebhook. Como mutação de configuração e webhook de controle de admissão de validação, respectivamente.

Mutação do controle de admissão: modifique o objeto solicitado

Validando o controle de admissão: validando o objeto solicitado

O controlador de admissão é configurado nos parâmetros de inicialização do API Server. Um controlador de admissão pode pertencer a um ou a ambos os itens acima. Quando a solicitação chega ao API Server, o controle de admissão de alteração é executado primeiro e, em seguida, o controle de admissão de verificação é executado.

Ao implantar um cluster do Kubernetes, habilitaremos uma série de controladores de admissão por padrão. Se esses controladores de admissão não estiverem definidos, pode-se dizer que seu cluster do Kubernetes está executando nu. Somente o administrador do cluster pode modificar o controlador de admissão do cluster.

Por exemplo, eu habilitaria o seguinte controlador de admissão por padrão.
--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

A arquitetura geral do k8s também é uma arquitetura de microsserviços. Todas as requisições são feitas através de um GateWay, ou seja, o componente kube-apiserver (que fornece serviços REST para o mundo externo). Existem dois tipos de clientes no k8s, um é para usuários comuns, e o outro é para usuários comuns. É um Pod no cluster. Os mecanismos de autenticação desses dois clientes são um pouco diferentes, mas não importa qual seja, eles precisam passar pelos três mecanismos de autenticação, autorização, e acesso por sua vez.

Certificação

1. A autenticação suporta uma variedade de plug-ins

(1) Autenticação de token:

Ambas as partes têm uma chave compartilhada e uma senha é criada primeiro no servidor, e o cliente pode efetuar login com essa senha ao efetuar login. Este é o método de autenticação de chave simétrica. O k8s fornece uma interface tranquila e todos os seus serviços são fornecidos por meio do protocolo http, portanto, as informações de autenticação só podem ser passadas pelo cabeçalho de autenticação do protocolo http, que geralmente é chamado de token.

(2) autenticação SSL:

Para acesso k8s, a autenticação SSL permite que o cliente confirme a identidade de autenticação do servidor. Quando nos comunicamos com o servidor, precisamos que o servidor envie um certificado. Precisamos confirmar se o certificado é assinado por ca. Se for um ca reconhecemos Assinado, as informações de assunto nele são consistentes com as informações do host de destino que visitamos, não há problema, então pensamos que a identidade do servidor foi autenticada. O mais importante no k8s é que o servidor também precisa autenticar as informações do cliente, e o kubectl também deve ter um certificado, esse certificado também é um certificado assinado pela ca reconhecida pelo servidor. Ambas as partes precisam autenticar uma a outra para realizar a comunicação criptografada, que é a autenticação ssl.

2. Conta no kubernetes

O cliente inicia uma solicitação ao apiserver. O apiserver precisa identificar se o usuário tem a permissão solicitada e se o usuário pode realizar a operação correspondente por meio do apiserver. Quais informações são necessárias para identificar as informações do usuário para concluir o controle de acesso relevante para o usuário?

kubectl explica pods.spec pode ver que existe um campo serviceAccountName (nome da conta de serviço), esta é a conta usada quando nosso pod se conecta ao apiserver, portanto, existem dois tipos de contas em todo o cluster kubernetes, ServiceAccount (conta de serviço), Conta de usuário (conta de usuário))

Conta de usuário: uma conta na qual todos podem fazer login na realidade, o cliente deseja iniciar uma solicitação ao apiserver, e o apiserver precisa identificar se o cliente possui a permissão solicitada, então usuários diferentes terão permissões diferentes, dependendo do representação da conta do usuário, chamada de nome de usuário

ServiceAccount: foi projetado para facilitar o processo no Pod para chamar a API do Kubernetes ou outros serviços externos. É um recurso no kubernetes

conta sa: a conta usada para fazer login no painel

conta de usuário: Este é o usuário que efetua login na máquina física do k8s

执行kubectl指令的时候会加载文件
[root@k8smaster secret]# cat /root/.kube/config 
文件里有一个user用户,做了rbac授权
user: kubernetes-admin
会基于这个用户去访问k8s

escreva no final

Não é fácil de criar, se você acha que o conteúdo é útil para você, por favor me dê um link de três links para me apoiar! Se houver algum erro, por favor, aponte-o nos comentários e eu vou alterá-lo a tempo!

A série atualmente sendo atualizada: Aprendendo k8s do zero

Obrigado por assistir, o artigo está misturado com compreensão pessoal, se houver algum erro, entre em contato comigo para apontar ~

Acho que você gosta

Origin blog.csdn.net/qq_45400861/article/details/127233017
Recomendado
Clasificación