Secrets

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

O que é um 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. 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

Você pode criar um secret usando a linha de comando ou um arquivo YAML.

kubectl

Para criar um secret, execute o seguinte comando:

kubectl create secret SECRET_TYPE SECRET_NAME DATA

Substitua:

  • SECRET_TYPE: o tipo do secret, que pode ser um dos seguintes:

    • generic: cria um secret a partir de um valor literal, diretório ou arquivo local.
    • docker-registry: crie 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. O par de chave pública/privada já precisa existir. 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.

  • SECRET_NAME: o nome do secret que você está criando.

  • DATA: os dados a serem adicionados ao secret, que podem 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 por sinalizações --from-literal.

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

Arquivo YAML

Para criar um secret usando um arquivo YAML, defina um objeto Secret no arquivo e implante o objeto usando o seguinte comando:

kubectl create -f FILE_NAME.yaml

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

Como criar secrets a partir de arquivos

Para criar um secret com base em 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.

Criar um secret usando --from-file

Quando você cria o secret usando --from-file, o valor do secret é 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 SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_FILE1 \
  --from-file PATH_TO_FILE2

Substitua:

  • SECRET_TYPE: o tipo do secret, que pode ser um dos seguintes:

    • generic: cria um secret a partir de um valor literal, diretório ou arquivo local.
    • docker-registry: crie 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. O par de chave pública/privada já precisa existir. 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.

  • SECRET_NAME: o nome do secret que você está criando.

  • PATH_TO_FILE: o caminho para o arquivo.

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

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file PATH_TO_DIRECTORY

Substitua PATH_TO_DIRECTORY pelo caminho para o diretório.

Por exemplo, o comando a seguir cria um secret do tipo generic 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 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. Neste exemplo, as chaves são password.txt e username.txt. É possível substituir a chave padrão usando a sintaxe estendida na sinalização --from-file:

kubectl create secret SECRET_TYPE SECRET_NAME \
  --from-file=KEY_NAME=PATH_TO_DIRECTORY

Substitua KEY_NAME pelo nome da chave que você quer definir.

No exemplo a seguir, criamos um secret do tipo generic 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

Criar um secret usando --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.

No exemplo a seguir, criamos um secret de tipo generic chamado credentials a partir de um único arquivo, credentials.txt, que contém vários pares de chave-valor.

  1. Crie o arquivo credentials.txt:

    # 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.

  2. Criar o secret:

    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.

Com base em valores literais

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

Por exemplo, com o comando a seguir, você cria um secret do tipo generic 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

Nesta saída, 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 uma chave secreta com as cargas de trabalho, é possível especificar variáveis de ambiente que façam referência aos valores da chave secreta ou ativar um volume contendo a chave secreta.

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

Próximas etapas