Secret

Nesta página, você vê a descrição do objeto secret do Kubernetes e do uso dele no Google Kubernetes Engine.

O que é uma chave secreta?

Secret

Os secrets são objetos seguros que armazenam nos clusters dados confidenciais, como senhas, tokens OAuth e chaves SSH. Armazenar dados confidenciais em secrets é mais seguro do que usar ConfigMaps em texto simples ou especificações do pod. Com os secrets, você controla como os dados confidenciais são usados e reduz o risco de expô-los a usuários não autorizados.

Também é possível criptografar os secrets na camada do aplicativo por meio de uma chave gerenciada no Cloud KMS. Para saber mais, consulte Criptografia de secrets na camada do aplicativo.

Como criar um Secret

Use kubectl create secret para criar um secret:

    kubectl create secret type name data
    

em que:

  • type pode ser um dos seguintes:

    • generic: cria um secret a partir de um valor literal, diretório ou arquivo local.
    • docker-registry: cria um secret dockercfg para uso com um registro do Docker. Usado para autenticação nos registros do Docker.
    • tls: cria um secret TLS a partir do par de chaves públicas/privadas determinado. Você já precisa ter esse par. O certificado de chave pública precisa ser codificado em .PEM e corresponder à chave privada fornecida.

    Na maioria dos secrets, você usa o tipo generic.

  • name é o nome do secret que você está criando;

  • data pode ser um dos seguintes:

    • Um caminho para um diretório que contém um ou mais arquivos de configuração, indicado pelas sinalizações --from-file ou --from-env-file.
    • Pares de chave-valor, cada um deles especificado com as sinalizações --from-literal.

Para mais informações sobre kubectl create, consulte a documentação de referência (em inglês).

Outra opção para criar um secret é definir um objeto secret (em inglês) em um arquivo de manifesto YAML e implantá-lo usando o comando a seguir:

    kubectl create -f file-name.yaml
    

Por exemplo, consulte Distribuir credenciais com segurança usando secrets (em inglês).

Com arquivos

Para criar um secret a partir de um ou mais arquivos, use --from-file ou --from-env-file. O arquivo precisa ser em texto simples, mas a extensão dele pode ser qualquer uma.

--from-file

Quando você cria um secret usando --from-file, o valor dele é todo o conteúdo do arquivo. Se o valor do secret tiver vários pares de chave-valor, use --from-env-file.

É possível passar único arquivo ou vários arquivos:

    kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2
    

Também é possível passar um diretório contendo vários arquivos:

    kubectl create secret type name --from-file /path/to/directory
    

Por exemplo, com o comando a seguir, você cria um secret chamado credentials a partir de dois arquivos, username.txt e password.txt, e define as chaves como username.txt e password.txt, respectivamente:

    kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt
    

Os valores secretos são codificados em base 64 no Kubernetes.

Executar kubectl get secret credentials -o yaml retorna a saída a seguir:

    apiVersion: v1
    data:
      password.txt: MTIzNAo=
      username.txt: YWRtaW4K
    kind: Secret
    metadata:
      creationTimestamp: ...
      name: credentials
      namespace: default
      resourceVersion: "2011810"
      selfLink: /api/v1/namespaces/default/secrets/credentials
      uid: ...
    type: Opaque
    

Por padrão, a chave é o nome do arquivo. Use a sintaxe estendida de --from-file para modificar a chave:

    kubectl create secret type name --from-file=key=/path/to/directory
    

No exemplo a seguir, você cria um secret chamado "credentials" a partir de dois arquivos, username.txt e password.txt, e define as chaves como username e password, em vez de usar os nomes de arquivo:

    kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt
    

--from-env-file

Para carregar vários pares de chave-valor em um secret, armazene-os em um ou mais arquivos em texto simples e carregue-os usando --from-env-file em vez de --from-file. Especifique a sinalização várias vezes para carregar muitos arquivos. As mesmas limitações de --from-file são aplicadas.

Por exemplo, com o comando a seguir, você cria um secret chamado credentials a partir de um arquivo, credentials.txt, que contém vários pares de chave-valor:

    # Each of these key-value pairs is loaded into the Secret
    username=jane
    password=d7xnNss7EGCFZusG
    

Os valores de segredos são codificados em base64 no Kubernetes.

    kubectl create secret generic credentials --from-env-file ./credentials.txt
    

Executar kubectl get secret credentials -o yaml retorna a saída a seguir:

apiVersion: v1
    data:
      password: ZDd4bk5zczdFR0NGWnVzRw==
      username: amFuZQ==
    kind: Secret
    metadata:
      creationTimestamp: 2019-06-04T15:39:27Z
      name: credentials
      namespace: default
      resourceVersion: "14507319"
      selfLink: /api/v1/namespaces/default/secrets/credentials
      uid: efce376b-86de-11e9-9742-42010a80022f
    type: Opaque
    

Limitações

Arquivos incomuns, como links simbólicos, dispositivos e canalizações, são ignorados pela kubectl. Os subdiretórios também são ignorados: kubectl create secret não se propaga aos subdiretórios.

A partir de valores literais

Para criar um secret de valores literais, use --from-literal.

Por exemplo, com o comando a seguir, você cria um secret genérico chamado literal-token com dois pares de chave-valor:

    kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234
    

Especifique --from-literal em cada par de chave-valor. Os valores são automaticamente codificados em Base64.

Executar kubectl get secret literal-token -o yaml retorna a saída a seguir:

    apiVersion: v1
    data:
      password: MTIzNA==
      user: YWRtaW4=
    kind: Secret
    metadata:
      creationTimestamp: ...
      name: literal-token
      namespace: default
      resourceVersion: "2012831"
      selfLink: /api/v1/namespaces/default/secrets/literal-token
      uid: ...
    type: Opaque
    

Na saída anterior, password e user são codificados em Base64. A codificação Base64 possibilita que a informação seja resumida por aplicativos e serviços que não podem processar certos caracteres. A codificação base64 não fornece segurança.

Como usar uma chave secreta

Para usar um secret com as cargas de trabalho, especifique variáveis de ambiente que mencionem os valores dele ou ative um volume que contenha um secret.

Para saber sobre o uso de chaves secretas, consulte Como usar chaves secretas.

A seguir