Importar e exportar chaves no OVHcloud KMS com BYOK
Saiba como importar e exportar em segurança material de chave encriptado com o OVHcloud KMS através de encapsulamento RSA assimétrico (BYOK)
Objetivo
Bring Your Own Key (BYOK) permite-lhe importar e exportar material de chave criptográfico com o OVHcloud Key Management Service (KMS) sem o enviar em texto claro. Um par de chaves RSA de transporte protege o material em trânsito: a chave pública encapsula-o e apenas o detentor da chave privada o pode desencapsular.
Este guia explica como importar e exportar uma chave com o OVHcloud KMS utilizando encapsulamento de chave RSA assimétrico (BYOK).
O BYOK via KMIP ainda não está disponível. Este guia abrange apenas a API REST regional, a CLI OKMS e o SDK Go.
As chaves com o nível de proteção HSM seguem regras adicionais, tanto como chaves de transporte como chave importada ou exportada. Consulte Utilizar o BYOK com chaves HSM.
Requisitos
- Dispor de uma conta de cliente OVHcloud.
- Ter encomendado um KMS OVHcloud.
- Ter configurado um método de autenticação para o plano de dados OKMS (token de acesso pessoal, conta de serviço ou certificado de acesso).
- Poder aplicar uma política IAM no seu domínio OKMS; as ações BYOK necessárias estão listadas em Configurar o IAM para o BYOK.
- Opcional: a CLI OKMS (versão 0.6.0 ou superior) ou o SDK Go instalado para os exemplos nos separadores.
Instruções
Compreender a cerimónia de encapsulamento RSA
A cerimónia envolve dois ambientes e um operador:
- Destino (Dst): o seu domínio OKMS, onde a chave importada será armazenada.
- Origem (Src): o sistema que detém atualmente o material de chave (outro KMS, uma aplicação ou uma ferramenta como o OpenSSL).
- Operator: a entidade que dispõe das permissões necessárias para aceder tanto ao domínio OKMS como à origem da chave a importar. Pode ser uma pessoa que utiliza o CLI OKMS ou um serviço que atua através da API.
- Gere um par de chaves RSA de transporte no OVHcloud KMS com as operações
wrapKeyeunwrapKey. - Exporte a chave de transporte pública do OVHcloud KMS.
- Importe a chave de transporte pública no ambiente de origem.
- Na origem, exporte o material de chave encapsulado (encriptado) com a chave de transporte utilizando
RSA-OAEPouRSA-OAEP-256. - No destino, importe a chave encapsulada com
POST /api/{okmsId}/v1/servicekeye uma carga útilwrappedKeys. O KMS desencapsula o ciphertext com a chave de transporte privada e armazena a chave de serviço resultante.
As chaves importadas desta forma têm never_extractable definido como false, porque o material existia fora do KMS antes da importação. Para extrair posteriormente uma chave sob forma encapsulada, importe-a com extractable definido como true (não pode ser ativado posteriormente) e siga Exportar uma chave encapsulada. Consulte Atributos de sensibilidade das chaves de serviço para a lista completa de atributos.
Para seguir este guia precisa de dois valores do seu domínio OKMS: o seu endpoint regional e o seu okmsId. As chamadas à API REST incluem ambos no URL, enquanto o CLI OKMS e o SDK Go os leem da respetiva configuração. Ambos são devolvidos pela seguinte chamada à API:
Também são apresentados no separador Informações gerais do .
Prefira esta cerimónia à importação de chave em texto claro sempre que a chave deva permanecer de confiança durante o trânsito.
Configurar o IAM para o BYOK
Aplique uma política ao recurso do seu domínio OKMS. O respetivo URN é apresentado no separador Informações gerais do . Substitua <identity_urn> e <okms_urn> pelos seus valores. Crie as políticas através da Área de Cliente OVHcloud ou da API OVHcloud.
Importação BYOK — ler, criar ou importar chaves de serviço e desencapsular com uma chave de transporte:
Exportação BYOK — importar uma chave de transporte pública, atualizar a extraibilidade e encapsular uma chave para exportação:
Para a importação, serviceKey/unwrapKey deve estar autorizado na chave de transporte RSA referenciada por wrappingKeyId. Para a exportação, importe primeiro a chave de transporte pública de destino (create / import), depois autorize serviceKey/wrapKey nessa chave de transporte e serviceKey/get na chave exportada. serviceKey/update é necessário para definir extractable como false após a exportação.
Criar a chave de transporte RSA no KMS de destino
Crie uma chave RSA dedicada ao encapsulamento. Para a cerimónia de importação, defina nesta chave tanto wrapKey como unwrapKey; são mutuamente exclusivas com sign e verify.
Tamanhos de chave RSA suportados: 2048, 3072 ou 4096 bits.
SOFTWARE é o nível de proteção predefinido, pelo que não precisa de o indicar.
Guarde o id da chave devolvida — irá precisar dele como wrappingKeyId durante a importação.
Obter a chave de transporte pública
Exporte a parte pública da chave de transporte e forneça-a ao ambiente de origem. Nunca partilhe a chave privada — ela permanece dentro do KMS de destino.
A resposta inclui o material de chave pública no array keys (JWK).
Encapsular o material de chave de origem
No ambiente de origem, encripte o material de chave com a chave RSA pública de destino.
Este passo é realizado fora do OVHcloud KMS: utilize uma biblioteca JOSE no ambiente de origem.
Algoritmos de encapsulamento suportados (RFC 7518):
keyFormatType descreve o formato do material de chave em texto claro antes do encapsulamento e após o desencapsulamento. O ciphertext é sempre uma cadeia JWE Compact Serialization (o algoritmo de encapsulamento é transportado no cabeçalho JWE).
Após o encapsulamento com a chave pública de destino, envie no pedido de importação o ciphertext JWE Compact Serialization resultante. Para um exemplo em Go deste passo de encapsulamento, consulte Exemplo de ponta a ponta em Go.
Importar a chave encapsulada
Invoque POST /api/{okmsId}/v1/servicekey com um array wrappedKeys em vez de keys em texto claro.
Cada entrada de wrappedKeys:
Pode importar uma chave apenas pública (class passa a PUBLIC_KEY) ou uma chave privada (o KMS reconstrói a parte pública; class passa a KEY_PAIR). O material simétrico é armazenado como SECRET_KEY.
Ações IAM nesta chamada: okms:apikms:serviceKey/create, okms:apikms:serviceKey/import e okms:apikms:serviceKey/unwrapKey na chave de transporte.
Valores de keyFormatType: RAW, JWK, PKCS1 ou PKCS8.
Verificar a chave importada
Confirme que a chave existe e corresponde ao tipo e às operações esperadas.
Verifique que:
- o
stateda chave éactive(ou ative-a se o seu fluxo de trabalho o exigir). type,sizeeoperationscorrespondem ao esperado.- os atributos de sensibilidade em
attributesrefletem uma chave importada (never_extractablevalefalse).
Pode depois utilizar a chave para encrypt, decrypt, sign ou verify, conforme documentado em Utilizar o seu OVHcloud Key Management Service (KMS).
Exportar uma chave encapsulada
A exportação segura é o inverso da importação: o OVHcloud KMS encripta o material de chave com uma chave de transporte RSA e devolve apenas um ciphertext JWE. A chave de transporte privada deve residir no ambiente de destino — aqui o sistema externo que recebe a chave, não o OVHcloud KMS — para que apenas esse ambiente possa desencapsular o material.
Compreender a cerimónia de exportação
- Gere um par de chaves RSA de transporte no ambiente de destino (outro KMS ou uma ferramenta que receberá a chave).
- Importe a chave de transporte pública de destino no OVHcloud KMS com a operação
wrapKey. Esta chave é owrappingKeyIdutilizado no momento da exportação. - No OVHcloud KMS, exporte a chave de serviço encapsulada por essa chave de transporte. A chave deve ter sido criada ou importada com
extractabledefinido comotrue. Defina depoisextractablecomofalsequando possível. - Transfira o ciphertext para o destino e desencapsule-o com a chave de transporte privada de destino.
Não gere o par de chaves de transporte de exportação no OVHcloud KMS. Se a chave de transporte privada permanecesse no OVHcloud KMS, o destino não conseguiria desencapsular o ciphertext. Apenas a parte pública é importada no OVHcloud KMS para o encapsulamento.
A chave de transporte referenciada por wrappingKeyId deve ser uma chave RSA no mesmo domínio OKMS, com a utilização wrapKey. Para exportar uma chave armazenada no HSM, consulte Utilizar o BYOK com chaves HSM. As chaves sensíveis (material AES/oct e RSA/EC privado) só podem ser extraídas após encapsulamento — a extração em texto claro não é suportada para essas chaves.
Importar a chave de transporte pública de destino no OVHcloud KMS
Registe a chave pública de destino para que o OVHcloud KMS possa encapsular com ela a chave exportada. Importe-a como chave RSA apenas pública com wrapKey (sem material privado).
Guarde o id da chave devolvida como wrappingKeyId.
Ativar a extração
A chave que exporta deve ser extraível, e isso é decidido na criação ou na importação da chave. Depois, extractable só pode passar de true para false: uma vez definido como false, nunca mais pode voltar a ser definido como true. Uma chave criada ou importada sem extractable definido como true nunca poderá, portanto, ser exportada. Esta regra aplica-se tanto às chaves SOFTWARE como às chaves HSM.
Ativar a extração reduz a fronteira de proteção da chave, e uma chave criada com extractable definido como true tem never_extractable definido como false de forma permanente. Crie uma chave extraível apenas se pretender migrá-la.
Defina extractable como true ao criar a chave:
Para uma importação, defina "extractable": true no corpo do pedido (API REST), adicione --extractable (CLI OKMS) ou passe okms.WithExtractable(true) (SDK Go).
Quando a chave já não precisar de ser exportada, por exemplo após uma exportação encapsulada bem-sucedida (consulte Exportar a chave encapsulada com a chave de transporte), desative a extração. Esta operação é irreversível. Ação IAM: okms:apikms:serviceKey/update.
Exportar a chave encapsulada com a chave de transporte
Invoque GET /api/{okmsId}/v1/servicekey/{keyId} com os parâmetros de consulta de encapsulamento abaixo. Quando estes parâmetros estão presentes, a API devolve wrappedKeys em vez de keys em texto claro.
Ações IAM: okms:apikms:serviceKey/get na chave exportada e okms:apikms:serviceKey/wrapKey na chave de transporte.
Exemplo de resposta:
Desencapsular o ciphertext no destino
Transfira o ciphertext para o ambiente de destino. Desencapsule-o com a chave de transporte privada de destino (a contraparte da chave pública que importou no OVHcloud KMS).
- Se o destino for outro domínio OKMS, importe aí o material encapsulado com
wrappedKeyscomo em Importar a chave encapsulada, utilizando o identificador da chave de transporte desse domínio comowrappingKeyId. - Se o destino for um sistema externo, utilize a respetiva API nativa de desencapsulamento / importação com a chave de transporte privada e o mesmo
keyFormatType/ algoritmo de encapsulamento que na exportação.
Utilizar o BYOK com chaves HSM
Com o nível de proteção HSM, o material de chave é encapsulado e desencapsulado dentro do HSM: nunca aparece em texto claro no OVHcloud KMS. O formato JWE é o mesmo que para as chaves SOFTWARE (RSA-OAEP ou RSA-OAEP-256 com A256GCM).
O nível de proteção HSM não está disponível em todas as regiões. Para verificar a sua disponibilidade na região do seu domínio OKMS, consulte a lista protectionLevel devolvida para essa região pela seguinte chamada à API:
A chave de transporte deve estar armazenada no HSM sempre que a chave importada ou exportada estiver armazenada nele, como resume a tabela seguinte:
As importações no HSM descritas abaixo só são apresentadas com a API REST.
Criar uma chave de transporte HSM
Para importar uma chave no HSM, crie a chave de transporte com o nível de proteção HSM:
Em seguida, exporte a respetiva chave pública e encapsule o material de chave na origem, conforme descrito em Obter a chave de transporte pública e Encapsular o material de chave de origem.
Importar uma chave no HSM
Como o HSM nunca expõe o material desencapsulado, o OVHcloud KMS não pode deduzir o tipo de chave. O pedido de importação difere do pedido de uma importação SOFTWARE:
- Defina
protectionLevelcomoHSM. A chave de transporte também deve ser uma chaveHSM. - Declare
type:oct,RSAouEC. Não definasizenemcurveparaRSAeEC: o HSM lê-os a partir da chave. Paraoct,sizeé opcional (128,192ou256). - Não defina
keyFormatTypeemwrappedKeys. O texto claro encapsulado no JWE deve corresponder aos bytes brutos da chave para uma chaveoct, e à chave privada em PKCS#8 (DER) para uma chaveRSAouEC. - Chaves suportadas: AES de
128,192ou256bits, RSA de2048,3072ou4096bits, ECP-256,P-384ouP-521. Uma chave pública isolada não pode ser importada encapsulada no HSM: apenas a importação em texto claro é possível.
Uma chave de transporte HSM também pode desencapsular uma chave SOFTWARE: nesse caso, siga Importar a chave encapsulada com keyFormatType.
Exportar uma chave a partir do HSM
Apenas as chaves simétricas (oct) podem ser exportadas a partir do HSM: o HSM nunca liberta as chaves privadas RSA ou EC. Tal como para uma chave SOFTWARE, a chave deve ter sido criada ou importada com extractable definido como true, o que não pode ser ativado posteriormente (consulte Ativar a extração).
A chave de transporte deve estar armazenada no HSM. Importe a chave de transporte pública de destino com o nível de proteção HSM:
Em seguida, exporte a chave definindo wrappedKeyFormat como RAW: o HSM encapsula sempre os bytes brutos da chave, pelo que a carga útil do JWE desencriptado é a própria chave AES (32 bytes para uma chave de 256 bits).
No destino, desencripte o JWE com a chave de transporte privada, conforme descrito em Desencapsular o ciphertext no destino.
Exemplo de ponta a ponta em Go
Os exemplos seguintes executam as duas cerimónias com um par de chaves RSA, utilizando o SDK Go para as chamadas ao OVHcloud KMS e o go-jose para as operações JWE realizadas fora do OVHcloud KMS. Ambos os exemplos codificam o material de chave em PKCS#8 (DER), o que corresponde ao valor PKCS8 de keyFormatType.
Importar uma chave gerada localmente
O programa gera a chave com a biblioteca padrão de Go, encapsula-a localmente com a chave de transporte pública e depois importa-a. O material de chave nunca é enviado em texto claro para o OVHcloud KMS.
O algoritmo de encriptação do conteúdo JWE (enc) deve ser A256GCM.
Exportar uma chave e desencriptar o JWE
O destino (aqui, o programa local) gera o par de chaves de transporte, importa apenas a sua parte pública no OVHcloud KMS e, em seguida, desencripta, com a parte privada, o JWE exportado.
Quer saber mais?
Utilizar o seu OVHcloud Key Management Service (KMS)
Primeiros passos com OVHcloud Key Management Service (KMS)
Fale com a nossa comunidade de utilizadores.