Pular para o conteúdo principal

Segredos no KMS

O NNumbers Cloud Key Management Service (KMS) funciona como um cofre (Vault) de segredos e pode ser usado, por exemplo, para manter senhas, certificados, etc e pode ser usado em alguns elementos da cloud (e.g. NNumbers Cloud Load Balancer ou Kubernetes como serviço).

Para a criação de um segredo na plataforma NNumbers Cloud é necessário a utilização de APIs disponíveis na plataforma.

Para a utilização de APIs da plataforma é necessário a posse de uma credencial de acesso (e.g. usuário e senha ou credencial de aplicação), e de posse das credenciais é necessário criar um token de acesso (veja Criação de token de acesso à partir de credenciais de aplicação ou Criação de token de acesso à partir de credenciais de usuário).

Os tokens de acesso são válidos apenas por um dia.

aviso

Recomendamos que qualquer acesso às APIs sejam feitos por credenciais de aplicação. Nunca distribua suas credenciais de acesso a cloud para aplicativos, principalmente de terceiros ou a terceiros não autorizados.

Para este tutorial utilizaremos o exemplo de um segredo que irá conter um certificado no formato PKCS#12 para ser utilizado pelo serviço balanceador de carga (NNumbers Cloud Load Balancer) com ouvintes do tipo TERMINATED_HTTPS.

Armazenamento do segredo via API​

A API de segredos do NNumbers Cloud KMS tem uma propriedade chamada “expiration”. Essa propriedade determina até quando o segredo permanece armazenado/válido. Neste tutorial faremos uso da data do certificado aqui utilizado para extrair a data de expiração. O padrão válido para esta data é o de data e hora da internet, definido pela RFC 3339 — o perfil de ISO 8601 usado em APIs.

EXPIRATION_DATE_TIME=$(date -d "$(openssl x509 -text -noout -in fullchain.pem |grep -i 'Not After :' | awk '{ print $4" "$5" "$6" "$7" "$8 }')" +'%FT%T%:z')
Nome do AtributoTipoDescriçãoPadrã
nomestringnome do segredonenhum
expirationstring

É um timestamp UTC em ISO 8601 formato YYYY-MM-DDTHH:MM:SSZ. Se informado, o segredo não estará disponível após esta data/hora

nenhum
algorithmstring

Metadado informado pelo usuário ou sistema para propósito informacional.

nenhum
bit_lengthinteger

Metadado informado pelo usuário ou sistema para propósito informacional. Deve ser maior que zero.

nenhum
modestring

Metadado informado pelo usuário ou sistema para propósito informacional.

nenhum
payloadstring

O dado do segredo para ser armazenado. payload_content_type também deve ser informado se payload for informado.

nenhum
payload_content_typestring

O tipo de media para o conteúdo do payload. Para mais informações veja Tipos de Segredo.

nenhum
payload_content_encodingstring

O encoding usado para o payload para ser possível incluí-lo na requisição JSON. Correntemente, apenas base64 é suportado.

nenhum
secret_typestring

Usado para indicar o tipo de segredo sendo armazenado. Para mais informações veja Tipos de Segredo.

opaque

Crie um arquivo com o payload.

cat <<EOF> payload.txt
{"name": "meu_site_com_br_tls_secret", "algorithm": "aes", "mode": "cbc", "bit_length": 256, "secret_type": "opaque", "expiration": "${EXPIRATION_DATE_TIME}", "payload": "$(base64 < ${FILE_BASE_NAME}.pfx)", "payload_content_type": "application/octet-stream", "payload_content_encoding": "base64" }
EOF

Execute a chamada para a API utilizando o token de acesso obtido anteriormente.

curl -0 -v -X POST https://cloud.nnumbers.com.br:9311/v1/secrets/ \
-H "Content-Type: application/json" \
-H "X-Auth-Token: ${X_AUTH_TOKEN}" \
-d @payload.txt

Criação de segredos via interface gráfica​

No console administrativo, acesso o menu, Secrets em Key Management

Painel da NNumbers Cloud, Segredos no KMS: no console administrativo, acesso o menu, Secrets em Key Management

Clique no botão Create Secret

Formulário Create Secret, etapa 1: campos de nome e tipo do segredo

Formulário Create Secret, etapa 2: conteúdo e formato do segredo

Formulário Create Secret, etapa 3: data de expiração e confirmação

Quando o valor empty for selecionado no campo Payload Content Type, nenhum campo para envio do payload será aberto no momento inicial, permitindo que o payload do segredo seja enviado posteriormente

Quando o valor Plain Text (UTF-8) for selecionado no campo Payload Content Type, o campo Payload será exibido para envio do conteúdo. Veja mais em Tipos de Segredo.

Quando o valor Octet Stream for selecionado no campo Payload Content Type, o campo Secret File será exibido para envio de um arquivo (e.g. certificado) que será armazenado no segredo. Veja mais em Tipos de Segredo.

NameNome do segredo
Secret type

Veja Tipos de Segredo

Expiration DateData de expiração
AlgorithmAES, DES, 3DES, TWOFISH, SHA1, RSA, custom
ModeCBC, CFB, CTR, ECB, OFB, custom
Bit Length64, 128, 256, 1024, 2048

Tipos de segredo​

Todo segredo no NNumbers Cloud KMS tem um tipo. Tipos de segredo são usados para descrever diferentes tipos de dados de segredo que são armazenados no NNumbers Cloud KMS. O tipo para um segredo particular é listado no atributo de metadado secret_type.

Os tipos de segredo possíveis são:

  • symmetric - O tipo de segredo simétrico é usado para armazenar matrizes de bytes de dados confidenciais, como chaves usadas para criptografia simétrica. O tipo de conteúdo usado com segredos simétricos é “application/octet-stream”. Ao armazenar um segredo simétrico com uma única solicitação POST, os dados devem ser codificados para que possam ser incluídos no corpo JSON da solicitação. Nesse caso, a codificação de conteúdo de base64 pode ser usada.

  • public - O tipo de segredo público é usado para armazenar a chave pública de um par de chaves assimétricas (público/privada). Por exemplo, um segredo público pode ser usado para armazenar a chave pública de um par de chaves RSA. Atualmente, há apenas um formato de arquivo aceito para segredos públicos: uma estrutura SubjectPublicKeyInfo codificada por DER conforme definido por X.509, RFC 5280 que foi codificada em base64 com um cabeçalho e rodapé PEM. Este é o tipo de chave pública gerada pela ferramenta openssl por padrão. O tipo de conteúdo usado com segredos públicos é “application/octet-stream”. Ao armazenar um segredo público com uma única solicitação POST, o conteúdo do arquivo deve ser codificado, pois o JSON não aceita caracteres de nova linha. Nesse caso, o conteúdo do arquivo deve ser codificado em Base64 e a codificação de conteúdo de base64 pode ser usada.

  • private - Usado para armazenar a chave privada de um par de chaves assimétricas (pública/privada).

  • passphrase - Usado para armazenar texto plano de senhas.

  • certificate - Usado para armazenar certificados criptográficos tais como certificados X.509.

  • opaque - Usado para compatibilidade com versões prévias da API sem segredos “tipados”. Novas aplicações são encorajadas a especificar um dos outros tipos de segredo.

Próximos passos​