IBM Cloud Docs
Guía de aprendizaje: Creación e importación de claves de cifrado

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.

  1. Cree una Cuenta de IBM Cloud.

  2. Descargue e instale la CLI base deIBM Cloud para el sistema operativo.

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

  4. Descargue e instale la OpenSSL biblioteca de criptografía.

    Puede utilizar los mandatos de openssl para 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ón 1.0.2r o posterior.

    Si utilizas un Mac, puedes descargar OpenSSL mediante Homebrew. Ejecute brew install openssl si va a instalar el paquete por primera vez, o ejecute brew upgrade openssl para actualizar un paquete existente a la última versión.

  5. Descarga e instala jq.

    jq le ayuda a dividir datos JSON. Utilice jq en 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.

  1. En una ventana de terminal, ejecute el mandato siguiente para iniciar sesión en IBM Cloud con la CLI deIBM Cloud.

    ibmcloud login
    

    Si el inicio de sesión falla, ejecute el mandato ibmcloud login --sso para volver a intentarlo. Se requiere el parámetro --sso para 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.

  2. 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
    
  3. 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 Default

    A continuación, puede crear la instancia emitiendo:

    ibmcloud resource service-instance-create "import-keys-demo" kms tiered-pricing us-east
    

    Esta guía de aprendizaje no supondrá ningún cargo en su cuenta de IBM Cloud.

  4. Opcional: verifique que la instancia de Key Protectse ha creado satisfactoriamente listando las instancias de Key Protect disponibles.

    ibmcloud resource service-instances
    

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

  1. 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
    
  2. 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.

  3. 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'`
    
  4. 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-8e2534258a88
    

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

  1. Utilizando la sesión de terminal, cambie a un nuevo directorio key-protect-test.

    mkdir key-protect-test && cd key-protect-test
    

    Utilizará este directorio para almacenar archivos para pasos posteriores.

  2. 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.json
    

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

  3. Ver detalles de la señal de importación.

    jq '.' createImportTokenResponse.json
    

    La 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:

  1. 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
    
  2. Opcional: Inspeccione el contenido de la señal de importación.

    jq '.' getImportTokenResponse.json
    

    La 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 payload representa la clave pública que está asociada a la señal de importación. Este valor está codificado en base64. El valor nonce se 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.

  3. Descodifique y guarde la clave pública en un archivo denominado PublicKey.pem.

    jq -r '.payload' getImportTokenResponse.json | base64 --decode -o PublicKey.pem
    

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

  1. En una ventana de terminal, ejecute el mandato openssl siguiente para crear una clave de cifrado de 256 bits.

    openssl rand 32 > PlainTextKey.bin
    

    Correcto 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:

  1. 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)
    
  2. Recopile el valor nonce que ha recuperado en el paso 4.

    NONCE=$(jq -r '.nonce' getImportTokenResponse.json)
    
  3. 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
    
  4. Opcional: Inspeccione el contenido del archivo JSON utilizando jq como se muestra a continuación.

    jq '.' EncryptedValues.json
    

    La 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 encryptedNonce representa el nonce original envuelto (o cifrado) por la clave de cifrado que ha generado mediante OpenSSL. Los 2 iv es 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.

  1. 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.bin
    

    Si obtiene un error relacionado con los valores del parámetro al ejecutar el openssl en 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, ejecute brew update y después brew install openssl para obtener la última versión. A continuación, ejecute export PATH="/usr/local/opt/openssl/bin:$PATH" >> ~/.bash_profile a enlazar el paquete. Abra una nueva sesión de terminal y, a continuación, ejecute which openssl && openssl version para 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:

  1. 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)
    
  2. 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.json
    

    En 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 extractable se establece en false designa 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.

  3. Ver detalles de la señal de importación.

    jq '.' createRootKeyResponse.json
    

    En 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 id es un identificador exclusivo que se asigna a la clave y se utiliza para las subsiguientes llamadas a la API de Key Protect. El valor state establecido en 1 indica que la clave de cifrado está ahora en estado Activo. El valor de crn proporciona a vía de acceso de ámbito completa a la clave que especifica dónde reside el recurso en IBM Cloud. Por último, los valores extractable e imported describen este recurso como una clave raíz que ha importado al servicio.

  4. Opcional: Vaya al panel de control de Key Protect para ver y gestionar la clave de cifrado.

    La imagen muestra la vista del panel de control de Key Protect.

    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

  1. Recopile el identificador de la clave de cifrado que ha importado en el paso anterior.

    ROOT_KEY_ID=$(jq -r '.resources[].id' createRootKeyResponse.json)
    
  2. 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 .
    
  3. Elimine todos los archivos locales asociados con esta guía de aprendizaje.

    rm *.json *.bin *.pem
    
  4. Suprima el directorio de prueba que ha creado para esta guía de aprendizaje.

    cd .. && rm -r key-protect-test
    
  5. Opcional: Elimine la instancia de servicio de Key Protect.

    ibmcloud resource service-instance-delete import-keys-demo
    

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