Configurar a autenticação de quórum para usuários de criptografia do AWS CloudHSM usando a CloudHSM CLI
Estes tópicos descrevem como configurar seu CloudHSM para autenticação de quórum por usuários de criptografia. Execute estas etapas uma vez durante a configuração inicial. Para gerenciamento e uso subsequentes de chaves, consulte Gerenciamento e uso de chaves com autenticação de quórum habilitada para que o AWS CloudHSM use a CloudHSM CLI.
Tópicos
Pré-requisitos
Familiaridade com a CloudHSM CLI
Etapa 1. Criar e registrar uma chave para assinatura
Para usar a autenticação de quórum, cada usuário de criptografia deve concluir todas as etapas a seguir:
Tópicos
Criar um par de chaves RSA
Existem muitas maneiras diferentes de criar e proteger um par de chaves. O exemplo a seguir mostra como fazer isso com o OpenSSL
exemplo Crie uma chave privada com o OpenSSL
O exemplo a seguir demonstra como usar o OpenSSL para criar uma chave RSA de 2048 bits. Para usar este exemplo, substitua <crypto_user1.key> pelo nome do arquivo onde você deseja armazenar a chave.
$openssl genrsa -out<crypto_user1.key>Generating RSA private key, 2048 bit long modulus .....................................+++ .+++ e is 65537 (0x10001)
Em seguida, gere a chave pública usando a chave privada que você acabou de criar.
exemplo Crie uma chave pública com o OpenSSL
O exemplo a seguir demonstra como usar o OpenSSL para criar uma chave pública a partir da chave privada que você acabou de criar.
$openssl rsa -in crypto_user1.key -outform PEM -pubout -out crypto_user1.pubwriting RSA key
Criar um token de registro
Você cria um token e o assina com a chave privada que acabou de gerar na etapa anterior.
Criar um token de registro
-
Use o comando a seguir para iniciar CloudHSM CLI:
-
Crie um token de registro executando o comando quorum token-sign generate:
aws-cloudhsm >quorum token-sign generate --service registration --token /path/tokenfile{ "error_code": 0, "data": { "path": "/path/tokenfile" } } -
O comando quorum token-sign generate gera um token de registro no caminho de arquivo especificado. Inspecione o arquivo de token:
$cat /path/tokenfile{ "version": "2.0", "tokens": [ { "approval_data":<approval data in base64 encoding>, "unsigned":<unsigned token in base64 encoding>, "signed": "" } ] }O caminho do arquivo consiste no seguinte:
approval_data: um token de dados aleatório codificado em base64 cujos dados brutos não excedem o máximo de 245 bytes.
unsigned: um token codificado em base64 e com hash SHA256 do approval_data.
signed: um token assinado codificado em base64 (assinatura) do token não assinado, usando a chave privada RSA de 2048 bits gerada anteriormente com o OpenSSL.
Você assina o token não assinado com a chave privada para demonstrar que tem acesso à chave privada. Você precisará do arquivo de token de registro totalmente preenchido com uma assinatura e a chave pública para registrar o usuário de criptografia como usuário de quórum no cluster do AWS CloudHSM.
Assinar o token de registro não assinado
Decodifique o token não assinado codificado em base64 e coloque-o em um arquivo binário:
$echo -n '6BMUj6mUjjko6ZLCEdzGlWpR5sILhFJfqhW1ej3Oq1g=' | base64 -d > crypto_user.binUse OpenSSL e a chave privada para assinar o token de registro não assinado, agora binário, e criar um arquivo de assinatura binária:
$openssl pkeyutl -sign \ -inkey crypto_user1.key \ -pkeyopt digest:sha256 \ -keyform PEM \ -in crypto_user.bin \ -out crypto_user.sig.bin-
Codifique a assinatura binária em base64:
$base64 -w0 crypto_user.sig.bin > crypto_user.sig.b64 -
Copie e cole a assinatura codificada em base64 no arquivo de token:
{ "version": "2.0", "tokens": [ { "approval_data":<approval data in base64 encoding>, "unsigned":<unsigned token in base64 encoding>, "signed":<signed token in base64 encoding>} ] }
Registrar uma chave pública no HSM
Depois de criar uma chave, o usuário de criptografia deverá registrar a chave pública no cluster do AWS CloudHSM.
-
Inicie a CloudHSM CLI:
-
Faça login como o usuário de criptografia cuja chave pública você deseja registrar.
aws-cloudhsm >login --username crypto_user1 --role crypto-userEnter password: { "error_code": 0, "data": { "username": "crypto_user1", "role": "crypto-user" } } -
Registre uma chave pública no Registrar a estratégia de quórum de assinatura de token de um usuário usando a CLI do CloudHSM. Para obter mais informações, consulte o exemplo a seguir ou use o comando help user change-quorum token-sign register.
exemplo Registre uma chave pública com o cluster do AWS CloudHSM
O exemplo a seguir mostra como usar o comando user change-quorum token-sign register na CloudHSM CLI para registrar a chave pública de um administrador no HSM. Para usar esse comando, o usuário de criptografia deve estar conectado no HSM. Substitua estes valores pelos seus próprios:
aws-cloudhsm >user change-quorum token-sign register --public-key</path/crypto_user.pub>--signed-token</path/tokenfile>{ "error_code": 0, "data": { "username": "crypto_user1", "role": "crypto-user" } }nota
/path/crypto_user.pub: o caminho do arquivo PEM de chave pública
Obrigatório: sim
/path/token-file: o caminho do arquivo com token assinado pela chave privada do usuário
Obrigatório: sim
-
Depois que todos os usuários de criptografia registrarem suas chaves públicas, a saída do comando user list mostra essa informação no campo de quórum, informando a estratégia de quórum ativada em uso.
Neste exemplo, o cluster do AWS CloudHSM possui dois HSMs, cada um com os mesmos usuários de criptografia, conforme mostrado na saída a seguir do comando user list. Para obter mais informações sobre como criar usuários, consulte Gerenciamento de usuários com a CLI do CloudHSM.
aws-cloudhsm >user list{ "error_code": 0, "data": { "users": [ { "username": "admin", "role": "admin", "locked": "false", "mfa": [], "quorum": [], "cluster-coverage": "full" }, { "username": "crypto_user1", "role": "crypto-user", "locked": "false", "mfa": [], "quorum": [ { "strategy": "token-sign", "status": "enabled" } ], "cluster-coverage": "full" }, { "username": "crypto_user2", "role": "crypto-user", "locked": "false", "mfa": [], "quorum": [ { "strategy": "token-sign", "status": "enabled" } ], "cluster-coverage": "full" }, { "username": "crypto_user3", "role": "crypto-user", "locked": "false", "mfa": [], "quorum": [ { "strategy": "token-sign", "status": "enabled" } ], "cluster-coverage": "full" }, { "username": "app_user", "role": "internal(APPLIANCE_USER)", "locked": "false", "mfa": [], "quorum": [], "cluster-coverage": "full" } ] } }
Etapa 2. Definir os principais valores do quórum durante a geração da chave
Para usar a autenticação de quórum, um usuário de criptografia deve fazer login no HSM e, em seguida, definir os valores de quórum chave associados. Esse é o número mínimo de aprovações de usuários de criptografia necessárias para realizar operações de gerenciamento/uso de usuários do HSM. Para obter mais informações sobre os comandos de teclas associados ao gerenciamento ou ao uso de chaves, consulte Serviços e tipos compatíveis.
Gerar um par de chaves com valores de quórum chave definidos
-
Use o comando a seguir para iniciar a CloudHSM CLI:
-
Usando a CloudHSM CLI, faça login como um usuário de criptografia.
aws-cloudhsm >login --username crypto_user1 --role crypto-userEnter password: { "error_code": 0, "data": { "username": "crypto_user1", "role": "crypto-user" } }
Este exemplo gera um par de chaves RSA que tem os valores de quórum de chaves dois (2) definidos para operações de gerenciamento e uso de chaves. Você pode escolher qualquer valor de zero (0) até oito (8), até o número total de usuários de criptografia no HSM. Neste exemplo, o HSM tem três (3) usuários de criptografia, então o valor máximo possível é três (3). Observe que, neste exemplo, estamos compartilhando a chave <crypto_user2> durante a geração da chave. Observe também que as chaves públicas não têm valores de quórum.
aws-cloudhsm >key generate-asymmetric-pair rsa \ --public-exponent 65537 \ --modulus-size-bits 2048 \ --public-label rsa-public-key-example \ --private-label rsa-private-key-example \ --public-attributes verify=true \ --private-attributes sign=true --share-crypto-users crypto_user2 \ --manage-private-key-quorum-value 2 \ --use-private-key-quorum-value 2{ "error_code": 0, "data": { "public_key": { "key-reference": "0x0000000000640006", "key-info": { "key-owners": [ { "username": "crypto_user", "key-coverage": "full" } ], "shared-users": [], "key-quorum-values": { "manage-key-quorum-value": 0, "use-key-quorum-value": 0 }, "cluster-coverage": "full" }, "attributes": { "key-type": "rsa", "label": "rsa-public-key-example", "id": "0x", "check-value": "0x218f50", "class": "public-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": false, "sign": false, "trusted": false, "unwrap": false, "verify": true, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 512, "public-exponent": "0x010001", "modulus": "0xbdf471a3d2a869492f51c767bece8780730ae6479a9a75efffe7cea3594fb28ca518630e7b1d988b45d2fedc830b7ab848448c24c476cacb73d1523278aed289551e07af0fbfabe4811cc4601678bd097b5c0a578249ed1eb0e4878a80ba1ed85ac46eb1fee60d2a8bdd322075196dec4b57fa2cd82af44ad068115ac219bc073ec65c19c97bd883cf26931408d7bc51e237626b8b9b8f2485425907a0eb42f2f4c40018c8dac7ceeb1b646305a2e537ab904346883e41d568264abee0137048e4657d2cf72801810f3212f662b7a7ae134848b922771f6a30aa76718008d9cc74ff8ddcd8d867b05c3d40020d1514999af96889911467191b9f390d8de07f83", "modulus-size-bits": 2048 } }, "private_key": { "key-reference": "0x0000000000640007", "key-info": { "key-owners": [ { "username": "crypto_user", "key-coverage": "full" } ], "shared-users": [ { "username": "crypto_user2", "key-coverage": "full" } ], "key-quorum-values": { "manage-key-quorum-value": 2, "use-key-quorum-value": 2 }, "cluster-coverage": "full" }, "attributes": { "key-type": "rsa", "label": "rsa-private-key-example", "id": "0x", "check-value": "0x218f50", "class": "private-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 1216, "public-exponent": "0x010001", "modulus": "0xbdf471a3d2a869492f51c767bece8780730ae6479a9a75efffe7cea3594fb28ca518630e7b1d988b45d2fedc830b7ab848448c24c476cacb73d1523278aed289551e07af0fbfabe4811cc4601678bd097b5c0a578249ed1eb0e4878a80ba1ed85ac46eb1fee60d2a8bdd322075196dec4b57fa2cd82af44ad068115ac219bc073ec65c19c97bd883cf26931408d7bc51e237626b8b9b8f2485425907a0eb42f2f4c40018c8dac7ceeb1b646305a2e537ab904346883e41d568264abee0137048e4657d2cf72801810f3212f662b7a7ae134848b922771f6a30aa76718008d9cc74ff8ddcd8d867b05c3d40020d1514999af96889911467191b9f390d8de07f83", "modulus-size-bits": 2048 } } } }
Ao gerar uma chave com controles de quórum, a chave deve estar associada a um número mínimo de usuários igual ao maior valor de quórum da chave. Os usuários associados incluem o proprietário da chave e os usuários de criptografia com quem essa chave é compartilhada. Para determinar o número mínimo de usuários com quem compartilhar a chave, obtenha o maior valor de quórum entre o valor do quórum de uso da chave e o valor do quórum de gerenciamento de chaves e subtraia 1 para contabilizar o proprietário da chave, que, por padrão, está associado à chave. Para compartilhar a chave com mais usuários, use o comando Compartilhar uma chave usando a CloudHSM CLI.
A falha em compartilhar a chave com usuários suficientes na geração da chave resultará em falha, conforme mostrado abaixo.
aws-cloudhsm >key generate-asymmetric-pair rsa \ --public-exponent 65537 \ --modulus-size-bits 2048 \ --public-label rsa-public-key-example \ --private-label rsa-private-key-example \ --public-attributes verify=true \ --private-attributes sign=true --share-crypto-users crypto_user2 crypto_user3 \ --manage-private-key-quorum-value 3 \ --use-private-key-quorum-value 4{ "error_code": 1, "data": "Invalid quorum value provided." }