Guía de aprendizaje: Creación e importación de claves de cifrado
Aprenda a crear, cifrar y traer las claves de cifrado a la nube utilizando Key Protect.
Como profesional de la seguridad para su organización, siempre está buscando maneras de mejorar la seguridad de sus datos en reposo en la nube.
Para cumplir con los estrictos requisitos en cuanto a control de datos y auditoría normativa, desea integrar sus apps con un servicio de gestión de claves que ofrezca un control de acceso preciso a las claves de cifrado, funciones de seguimiento de auditoría y opciones flexibles para cargar las claves de cifrado que genere localmente.
Con Key Protect, puede crear claves de cifrado mediante el sistema de gestión de claves interno y, a continuación, cargar dichas claves para su uso en la nube.
Puede elegir entre distintas opciones para cargar claves en función de sus necesidades de seguridad en curso. A medida que gestiona el ciclo de vida de las claves de cifrado, controla el acceso a los recursos mediante Cloud Identity and Access Management, y supervisa la actividad de la API en el servicio con IBM Cloud Logs.
En esta guía de aprendizaje, se utiliza una señal de importación para cargar una clave de cifrado en Key Protect. Para obtener más información sobre las opciones para importar claves a Key Protect, consulte Planificación anticipada para importar material de claves.
Para saber cómo importar una clave sin una señal de importación, consulte Importación de una clave raíz
Objetivos
Esta guía de aprendizaje le muestra los pasos para crear e importar de forma segura claves de cifrado en el servicio Key Protect. Está pensado para los usuarios que son nuevos en Key Protect, pero que pueden estar familiarizados con los sistemas de gestión de claves. Los pasos siguientes tardan unos 20 minutos en completarse.
-
Configuración de la CLI de Key Protect
-
Preparación de la instancia de servicio de Key Protect para empezar a importar claves
-
Creación y cifrado de claves utilizando el kit de herramientas de criptografía de OpenSSL
-
Cómo importar una clave cifrada a la instancia de Key Protect
Esta guía de aprendizaje no supondrá ningún coste en su cuenta de IBM Cloud cuenta.
Antes de empezar
Para empezar, necesita la CLI de IBM Cloud para poder interactuar con los servicios que proporciona en IBM Cloud. También necesita los paquetes openssl y jq instalados localmente en el sistema.
-
Cree una Cuenta de IBM Cloud.
-
Descargue e instale la CLI base deIBM Cloud para el sistema operativo.
-
Configure y configure el plugin de CLI de Key Protect para empezar a gestionar claves. Si ya ha completado los dos primeros pasos listados anteriormente, empiece con el paso número 3 en el enlace antes de volver a esta guía de aprendizaje.
-
Descargue e instale la OpenSSL biblioteca de criptografía.
Puede utilizar los mandatos de
opensslpara generar claves de cifrado en el sistema local si está probando Key Protect por primera vez. Para esta guía de aprendizaje se requiere OpenSSL versión1.0.2ro posterior.Si utilizas un Mac, puedes descargar OpenSSL mediante Homebrew. Ejecute
brew install opensslsi va a instalar el paquete por primera vez, o ejecutebrew upgrade opensslpara actualizar un paquete existente a la última versión. -
Descarga e instala jq.
jqle ayuda a dividir datos JSON. Utilicejqen esta guía de aprendizaje para capturar datos específicos que se devuelven al llamar a la API de Key Protect.
Paso 1. Crear una instancia de Key Protect
Después de configurar una cuenta de IBM Cloud, complete los pasos siguientes para suministrar una instancia de Key Protect instancia.
-
En una ventana de terminal, ejecute el mandato siguiente para iniciar sesión en IBM Cloud con la CLI deIBM Cloud.
ibmcloud loginSi el inicio de sesión falla, ejecute el mandato
ibmcloud login --ssopara volver a intentarlo. Se requiere el parámetro--ssopara iniciar sesión con un ID federado. Si se utiliza esta opción, vaya al enlace que se muestra en la salida de la CLI para generar una contraseña de uso único. -
Seleccione la cuenta y el grupo de recursos donde desea crear una instancia de Key Protect.
En esta guía de aprendizaje, interactúa con la región de Washington DC. Si ha iniciado la sesión en una región distinta, asegúrese de establecer Washington DC como su región de destino ejecutando el mandato siguiente.
ibmcloud target -r us-east -
Suministre una instancia de Key Protect dentro de dicha cuenta y grupo de recursos.
En primer lugar, especifique el grupo de recursos para la instancia emitiendo:
ibmcloud target -g <your-resource-group>Por ejemplo,
ibmcloud target -g DefaultA continuación, puede crear la instancia emitiendo:
ibmcloud resource service-instance-create "import-keys-demo" kms tiered-pricing us-eastEsta guía de aprendizaje no supondrá ningún cargo en su cuenta de IBM Cloud.
-
Opcional: verifique que la instancia de Key Protectse ha creado satisfactoriamente listando las instancias de Key Protect disponibles.
ibmcloud resource service-instancesCorrecto Ahora ya tiene la instancia de Key Protect donde puede almacenar y gestionar las claves de cifrado. Continúe con el paso siguiente.
Paso 2. Configure la API de Key Protect
Ahora que ha suministrado una instancia de Key Protect, está preparado para empezar a utilizar la API.
Key Protect proporciona una interfaz gráfica de usuario y una API REST para crear, realizar el seguimiento y gestionar claves de cifrado. Los 2 API de Key Protect requiere una señal IAM de IBM Cloud y un ID de instancia válidos para autenticarse en el servicio.
En este paso, utilizará la CLI de IBM Cloud para recopilar las credenciales de autenticación que necesita para empezar a interactuar con las API de Key Protect. Para recuperar y preparar las credenciales para los pasos posteriores, debe establecer también las credenciales como variables de entorno en el terminal.
-
En la ventana de terminal, establezca el punto final de API de Key Protect como una variable de entorno.
export KP_API_URL=https://<region>.kms.cloud.ibm.com -
Genere una señal de acceso de IBM Cloud utilizando el plug-in de CLI de Key Protect y establézcala como una variable de entorno.
La variable de entorno debe comenzar con el tipo de autorización,
Bearer. El mandato de CLI, como se muestra en el ejemplo, incluirá automáticamente el tipo correcto.export ACCESS_TOKEN=`ibmcloud iam oauth-tokens | grep IAM | cut -d \: -f 2 | sed 's/^ *//'`Las señales de acceso de IBM Cloud son válidas durante 1 hora, pero puede volver a generarlas cuando las necesite. Para generar una nueva señal de acceso, ejecute el mandato mandato
ibmcloud iam oauth-tokens. Para obtener más información sobre cómo recuperar señales de acceso de IBM Cloud, consulte Recuperación de una señal de acceso. -
Recupere el identificador que está asociado a la instancia de Key Protect y, a continuación, establezca el valor como una variable de entorno.
export INSTANCE_ID=`ibmcloud resource service-instance "import-keys-demo" --output json | jq -r '.[].guid'` -
Opcional: Verifique que las variables de entorno se han establecido correctamente mostrándolas en la pantalla del terminal.
$ echo $KP_API_URL https://us-east.kms.cloud.ibm.com $ echo $ACCESS_TOKEN Bearer eyJraWQiOiIyM... $ echo $INSTANCE_ID c1cf624b-6bed-4d4d-bd54-8e2534258a88Correcto Ahora ya tiene las credenciales de servicio que necesita para autenticarse en la API de Key Protect. Continúe con el paso siguiente.
Paso 3. Crear una señal de importación
Con sus credenciales de servicio, puede empezar a interactuar con API de Key Protect para crear y llevar sus propias claves de cifrado al servicio.
En el paso siguiente, creará una señal de importación para la instancia de Key Protect. Al crear una señal de importación basada en una política que especifique, habilita una seguridad adicional para la clave de cifrado mientras está de camino al servicio.
-
Utilizando la sesión de terminal, cambie a un nuevo directorio
key-protect-test.mkdir key-protect-test && cd key-protect-testUtilizará este directorio para almacenar archivos para pasos posteriores.
-
Cree una señal de importación para la instancia de Key Protect y guarde la respuesta en un archivo JSON.
$ curl -X POST \ "$KP_API_URL/api/v2/import_token" \ -H "accept: application/vnd.ibm.collection+json" \ -H "authorization: $ACCESS_TOKEN" \ -H "bluemix-instance: $INSTANCE_ID" \ -H "content-type: application/json" \ -d '{ "expiration": 1200, "maxAllowedRetrievals": 1 }' > createImportTokenResponse.jsonEn el cuerpo de la solicitud, puede especificar una política en la señal de importación que limite su uso en función del recuento de tiempo y de uso. En este ejemplo, se establece la hora de caducidad de la señal de importación en 1200 segundos (20 minutos), y también se permite sólo una recuperación de dicha señal dentro del tiempo de caducidad.
-
Ver detalles de la señal de importación.
jq '.' createImportTokenResponse.jsonLa salida muestra los metadatos asociados a la señal de importación, como por ejemplo la fecha de creación y los detalles de política. En el fragmento de código siguiente se muestra una salida de ejemplo.
{ "creationDate": "2019-04-08T16:58:29Z", "expirationDate": "2019-04-08T17:18:29Z", "maxAllowedRetrievals": 1, "remainingRetrievals": 1 }
Paso 4. Recuperar la señal de importación
En el paso anterior, ha creado una señal de importación y ha visualizado los metadatos que están asociados a la señal.
{
"creationDate": "2019-04-08T16:58:29Z",
"expirationDate": "2019-04-08T17:18:29Z",
"maxAllowedRetrievals": 1,
"remainingRetrievals": 1
}
En este paso, recuperará la clave de cifrado pública y el valor nonce que están asociados a la señal de importación. Necesita la clave pública para cifrar los datos en un paso posterior y el nonce para verificar la solicitud de importación segura al servicio Key Protect.
Para recuperar el contenido de la señal de importación:
-
Recupere la señal de importación que ha generado el paso anterior y guarde la respuesta en un archivo JSON.
$ curl -X GET \ "$KP_API_URL/api/v2/import_token" \ -H "accept: application/vnd.ibm.collection+json" \ -H "authorization: $ACCESS_TOKEN" \ -H "bluemix-instance: $INSTANCE_ID" > getImportTokenResponse.json -
Opcional: Inspeccione el contenido de la señal de importación.
jq '.' getImportTokenResponse.jsonLa salida muestra información detallada sobre la señal de importación. En el fragmento de código siguiente se muestra una salida de ejemplo con valores truncados.
{ "creationDate": "2019-04-08T16:58:29Z", "expirationDate": "2019-04-08T17:18:29Z", "maxAllowedRetrievals": 1, "remainingRetrievals": 0, "payload": "Rm91ciBzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdv...", "nonce": "8zJE9pKVdXVe/nLb" }El valor de
payloadrepresenta la clave pública que está asociada a la señal de importación. Este valor está codificado en base64. El valornoncese utiliza para verificar la singularidad de una solicitud al servicio. Tiene que cifrar y proporcionar este valor al importar la clave de cifrado en un paso posterior. -
Descodifique y guarde la clave pública en un archivo denominado
PublicKey.pem.jq -r '.payload' getImportTokenResponse.json | base64 --decode -o PublicKey.pemLa clave pública se descarga ahora en el sistema en formato PEM. Continúe con el paso siguiente.
Paso 5. Crear una clave de cifrado
Con Key Protect, puede obtener las ventajas de seguridad que ofrece Bring Your Own Key (BYOK) creando y cargando sus propias claves para utilizar en IBM Cloud.
En el paso siguiente, creará una clave simétrica AES de 256 bits en el sistema local.
En esta guía de aprendizaje se utiliza el kit de herramientas de criptografía de OpenSSL para generar una clave pseudoaleatoria, pero es posible que desee explorar distintas opciones para generar claves más fuertes de acuerdo con sus necesidades de seguridad. Por ejemplo, es posible que desee utilizar el sistema de gestión de claves internas de la organización, respaldado por un módulo de seguridad de hardware (HSM) local, para crear y exportar claves.
-
En una ventana de terminal, ejecute el mandato
opensslsiguiente para crear una clave de cifrado de 256 bits.openssl rand 32 > PlainTextKey.binCorrecto Tu clave de encriptación se guarda ahora en un archivo llamado
PlainTextKey.bin. Continúe con el paso siguiente.
Paso 6. Cifrar el nonce
Para verificar que los bits que recibimos son exactamente los mismos que los bits que envía como parte de una solicitud, Key Protect requiere una verificación de nonce al cargar la clave simétrica en el servicio.
En la criptografía, un nonce sirve como una señal de sesión que comprueba la singularidad de una solicitud para protegerse frente a ataques maliciosos y llamadas no autorizadas. Utilizando el mismo nonce que ha distribuido Key Protect, ayuda a confirmar que la solicitud de cargar una clave es válida. El valor nonce se debe cifrar utilizando la misma clave que desea importar en el servicio.
Para cifrar el valor nonce:
-
Cifre la clave que ha generado en el paso anterior y establezca el valor codificado como una variable de entorno.
KEY_MATERIAL=$(base64 PlainTextKey.bin) -
Recopile el valor nonce que ha recuperado en el paso 4.
NONCE=$(jq -r '.nonce' getImportTokenResponse.json) -
Ejecute lo siguiente para cifrar el valor nonce con la clave de cifrado que ha generado en el paso 5. A continuación, guarde la respuesta en un archivo denominado
EncryptedValues.json.ibmcloud kp import-token nonce-encrypt -k $KEY_MATERIAL -n $NONCE --output json > EncryptedValues.json -
Opcional: Inspeccione el contenido del archivo JSON utilizando
jqcomo se muestra a continuación.jq '.' EncryptedValues.jsonLa salida muestra los valores que tiene que proporcionar para el paso siguiente. En el fragmento de código siguiente se muestra una salida de ejemplo con valores truncados.
{ "encryptedNonce": "DVy/Dbk37X8gSVwRA5U6vrHdWQy8T2ej+riIVw==", "iv": "puQrzDX7gU1TcTTx" }El valor de
encryptedNoncerepresenta el nonce original envuelto (o cifrado) por la clave de cifrado que ha generado mediante OpenSSL. Los 2ives el vector de inicialización (IV) que crea el algoritmo AES- GCM y es necesario más tarde para que Key Protect pueda descifrar correctamente el nonce.
Paso 7. Cifrar la clave
A continuación, utilice la clave pública que ha distribuido Key Protect para cifrar la clave simétrica que usted ha generado utilizando OpenSSL.
-
Cifre la clave generada utilizando la clave pública que ha recuperado en el paso 4.
openssl pkeyutl \ -encrypt \ -pubin \ -keyform PEM \ -inkey PublicKey.pem \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -in PlainTextKey.bin \ -out EncryptedKey.binSi obtiene un error relacionado con los valores del parámetro al ejecutar el
opensslen Mac OSX, es posible que tenga que asegurarse de que OpenSSL está correctamente configurado para su entorno configurado para su entorno. Si ha instalado OpenSSL utilizando Homebrew, ejecutebrew updatey despuésbrew install opensslpara obtener la última versión. A continuación, ejecuteexport PATH="/usr/local/opt/openssl/bin:$PATH" >> ~/.bash_profilea enlazar el paquete. Abra una nueva sesión de terminal y, a continuación, ejecutewhich openssl && openssl versionpara comprobar que la última versión de OpenSSL está disponible en/usr/local/. Si sigue encontrando errores, asegúrese de utilizar solamente los parámetros que se enumeran en este ejemplo.Correcto Tu clave encriptada se guarda ahora en un archivo llamado
EncryptedKey.bin. Ya está preparado para cargar su clave cifrada en Key Protect. Continúe con el paso siguiente.
Paso 8. Importar la clave
Ahora puede importar la clave cifrada utilizando la API de Key Protect.
Para importar la clave:
-
Recopile los valores de la clave cifrada, del nonce cifrado y del vector de inicialización (IV).
ENCRYPTED_KEY=$(openssl enc -base64 -A -in EncryptedKey.bin)ENCRYPTED_NONCE=$(jq -r '.encryptedNonce' EncryptedValues.json)IV=$(jq -r '.iv' EncryptedValues.json) -
Guarde la clave cifrada en la instancia de Key Protect ejecutando el siguiente mandato
curl.$ curl -X POST \ "$KP_API_URL/api/v2/keys" \ -H "accept: application/vnd.ibm.collection+json" \ -H "authorization: $ACCESS_TOKEN" \ -H "bluemix-instance: $INSTANCE_ID" \ -H "content-type: application/json" \ -d '{ "metadata": { "collectionType": "application/vnd.ibm.kms.key+json", "collectionTotal": 1 }, "resources": [ { "name": "encrypted-root-key", "type": "application/vnd.ibm.kms.key+json", "payload": "'"$ENCRYPTED_KEY"'", "extractable": false, "encryptionAlgorithm": "RSAES_OAEP_SHA_256", "encryptedNonce": "'"$ENCRYPTED_NONCE"'", "iv": "'"$IV"'" } ] }' > createRootKeyResponse.jsonEn el cuerpo de la solicitud, proporcione la clave de cifrado que ha preparado en el paso anterior. También proporcione los valores de nonce cifrado y de IV que se necesitan para verificar la solicitud. Por último, el valor
extractablese establece enfalsedesigna tu nueva clave como clave raíz en el servicio que puedes utilizar para el cifrado de sobres.Key Protect recibe el paquete cifrado en el protocolo TLS 1.2 o 1.3. Dentro de un módulo de seguridad de hardware, el sistema utiliza la clave privada para descifrar la clave simétrica. Por último, el sistema utiliza la clave simétrica y el IV para descifrar el nonce y verificar la solicitud.
Si la solicitud de API falla con un error de señal de importación caducada, vuelva al paso 3 para crear una nueva señal de importación. Recuerde que las señales de importación y las claves públicas asociadas caducan en base a la política que especifique en el momento de crearlas.
-
Ver detalles de la señal de importación.
jq '.' createRootKeyResponse.jsonEn el fragmento de código siguiente se muestra una salida de ejemplo.
{ "metadata": { "collectionType": "application/vnd.ibm.kms.key+json", "collectionTotal": 1 }, "resources": [ { "id": "02fd6835-6001-4482-a892-13bd2085f75d", "type": "application/vnd.ibm.kms.key+json", "name": "encrypted-root-key", "state": 1, "crn": "crn:v1:bluemix:public:kms:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:12e8c9c2-a162-472d-b7d6-8b9a86b815a6:key:02fd6835-6001-4482-a892-13bd2085f75d", "extractable": false, "imported": true } ] }El valor
ides un identificador exclusivo que se asigna a la clave y se utiliza para las subsiguientes llamadas a la API de Key Protect. El valorstateestablecido en 1 indica que la clave de cifrado está ahora en estado Activo. El valor decrnproporciona a vía de acceso de ámbito completa a la clave que especifica dónde reside el recurso en IBM Cloud. Por último, los valoresextractableeimporteddescriben este recurso como una clave raíz que ha importado al servicio. -
Opcional: Vaya al panel de control de Key Protect para ver y gestionar la clave de cifrado.

Puede examinar las características generales de sus claves desde la página de detalles de la aplicación. Elija entre una lista de opciones para gestionar la clave, como por ejemplo Rotación de la clave o Supresión de la clave.
Paso 9. Limpieza
-
Recopile el identificador de la clave de cifrado que ha importado en el paso anterior.
ROOT_KEY_ID=$(jq -r '.resources[].id' createRootKeyResponse.json) -
Elimine la clave de cifrado de la instancia de Key Protect.
$ curl -X DELETE \ "$KP_API_URL/api/v2/keys/$ROOT_KEY_ID" \ -H "accept: application/vnd.ibm.collection+json" \ -H "authorization: $ACCESS_TOKEN" \ -H "bluemix-instance: $INSTANCE_ID" | jq . -
Elimine todos los archivos locales asociados con esta guía de aprendizaje.
rm *.json *.bin *.pem -
Suprima el directorio de prueba que ha creado para esta guía de aprendizaje.
cd .. && rm -r key-protect-test -
Opcional: Elimine la instancia de servicio de Key Protect.
ibmcloud resource service-instance-delete import-keys-demoSi ha creado más claves de prueba en la instancia de Key Protect, asegúrese de eliminar todas las claves de cifrado de la instancia antes de suprimir o dejar de suministrar la instancia.
Próximos pasos
En esta guía de aprendizaje, ha aprendido a configurar la API de Key Protect, crear una clave de cifrado e importar de forma segura una clave cifrada en la instancia de Key Protect.
-
Obtenga más información sobre Utilización de la clave raíz para proteger los datos en reposo.
-
Despliegue la clave raíz en los servicios de nube soportados.
-
Obtenga más información sobre la API deKey Protect.