Secrets

Nesta página, descrevemos o objeto Secret no Kubernetes e como usá-lo no Google Kubernetes Engine (GKE).

O que é um secret?

Secrets são objetos seguros que armazenam dados confidenciais, como senhas, tokens OAuth e chaves SSH, nos clusters. Armazenar dados confidenciais em secrets é mais seguro que nos ConfigMaps de texto simples ou nas especificações de pod. O uso de secrets permite controlar como os dados confidenciais são usados e reduz o risco de expor os dados 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:

    • generic: cria um secret com base em 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 com base no par de chaves públicas/privadas determinado. O par de chaves públicas/privadas precisa existir de antemão. 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 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 com base em um ou mais arquivos, use --from-file ou --from-env-file. O arquivo precisa ser de texto simples, mas a extensão do arquivo não importa.

--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 especificar um ou vários arquivos:

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

É possível também especificar 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 com base em 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 de secrets são codificados em base 64 no Kubernetes.

Executar kubectl get secret credentials -o yaml retorna a resposta 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. É possível carregar vários arquivos especificando a sinalização várias vezes. As mesmas limitações de --from-file são aplicadas.

Por exemplo, com o comando a seguir, você cria um secret chamado credentials com base em 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 secrets 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 resposta 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 barras verticais, são ignorados pelo kubectl. Os subdiretórios também são ignorados. kubectl create secret não se propaga aos subdiretórios.

Com base em valores literais

Para criar um secret com base em 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 resposta 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 resposta anterior, password e user são codificados em Base64. A codificação base64 permite que a informação seja processada por apps 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, é possível especificar variáveis de ambiente que façam referência aos valores do secret ou ativar um volume contendo o secret.

Para saber sobre o uso de secrets, consulte Como usar secrets.

A seguir