Utilización de Hyper Protect Crypto Services PKCS #11 para el cifrado nativo de IBM Db2

El cifrado nativo de IBM Db2® protege los archivos de base de datos de claves y las imágenes de copia de seguridad de base de datos del acceso inadecuado a la vez que se almacenan en soportes de almacenamiento externos. El sistema de base de datos cifra y descifra automáticamente los datos cuando lo utilizan los usuarios y las aplicaciones autorizadas. Normalmente, los usuarios de las bases de datos no necesitan conocer el cifrado nativo y las aplicaciones cliente de base de datos no necesitan ser adaptadas específicamente.

El cifrado nativo de db2 utiliza una jerarquía de claves de dos niveles: los datos se cifran con una clave de cifrado de datos (DEK). La DEK se cifra con una clave maestra y se almacena de forma cifrada con la base de datos o la imagen de copia de seguridad. Db2 genera una DEK exclusiva para cada base de datos cifrada y para cada copia de seguridad cifrada.

Se utiliza una clave maestra para cifrar una DEK. Cada base de datos cifrada se asocia a una clave maestra a la vez.

Una cuestión importante cuando planifica el cifrado nativo de Db2 es la ubicación en la que guarda la clave maestra y cómo la protege.

Objetivos

Esta guía de aprendizaje muestra cómo puede mantener un control completo y exclusivo de las claves maestras almacenándolas en IBM Cloud® Hyper Protect Crypto Services. Para ello, debe utilizar la característica de integración de PKCS #11 de Hyper Protect Crypto Services.

Con esta guía de aprendizaje, va a implementar la configuración que se muestra en la siguiente ilustración.

IBM Db2 cifrado predeterminado con la API PKCS #11 estándar
Figura 1. Cifrado predeterminado de IBM Db2 con la API PKCS #11 estándar

En esta configuración, Db2 es llamar a operaciones para gestionar las claves maestras en la biblioteca de PKCS #11 de Hyper Protect Crypto Services. La biblioteca de PKCS #11 de Hyper Protect Crypto Services interactúa con la instancia de Hyper Protect Crypto Services, que proporciona la mejor tecnología de clase para almacenar y gestionar las claves maestras.

Antes de empezar

Para completar esta guía de aprendizaje, debe cumplir los requisitos previos siguientes:

Flujo de tareas

Para completar esta solución, haremos un recorrido por los pasos siguientes:

  1. Inicializar la instancia de Hyper Protect Crypto Services
  2. Configuración de la biblioteca PKCS #11 de Hyper Protect Crypto Services
  3. Configurar Db2 y configurar el cifrado nativo de Db2

Inicializar la instancia de Hyper Protect Crypto Services

  1. Para esta guía de aprendizaje, necesita inicializar una instancia de Hyper Protect Crypto Services primero.

    Anote el ID de la instancia de la instancia de Hyper Protect Crypto Services y la dirección de punto final de EP11. Necesita esta información para los pasos siguientes.

  2. Cree un rol de IAM personalizado Discover HPCS. Este rol proporciona un permiso muy limitado para descubrir la instancia de Hyper Protect Crypto Services, que es necesaria para la biblioteca PKCS #11. Este rol no tiene permisos para utilizar, crear o gestionar claves o almacenes de claves EP11.

    1. En la interfaz de usuario, vaya a Gestionar > Access (IAM) y seleccione Roles y, a continuación, pulse Crear.
    2. Especifique el nombre Discover HPCS para su rol.
    3. Especifique un ID para el rol. Este ID se utiliza en el CRN, que se utiliza cuando asigna el acceso mediante la API. El ID de rol debe empezar por una letra mayúscula y utilizar sólo caracteres alfanuméricos; por ejemplo, DiscoverHPCS.
    4. Opcional: Especifique una descripción sucinta y útil que ayude a los usuarios que están asignando el acceso a conocer el nivel de acceso que la asignación de roles proporciona a un usuario. Esta descripción también se muestra en la interfaz de usuario cuando un usuario asigna acceso al servicio.
    5. En la lista de servicios, seleccione Hyper Protect Crypto Services
    6. Seleccione Añadir para la acción hs-crypto.discovery.listservers y, a continuación, pulse Crear.
  3. Siga las instrucciones de Configuración de tipos de usuario de API PKCS #11 para configurar los ID de servicio y las claves de API para el usuario normal y el usuario anónimo.

    No configure el tipo de usuario de SO que se menciona en las instrucciones. Asimismo, a diferencia de las instrucciones, no asigne el ID de servicio de usuario anónimo al rol personalizado de Key operator; en su lugar, asigne el rol personalizado de Discover HPCS.

    Con esta configuración, el usuario anónimo solo tiene permisos muy limitados en la instancia de Hyper Protect Crypto Services y no puede utilizar, crear ni gestionar claves o almacenes de claves EP11.

  4. Guarde el valor de las claves de API para el usuario normal y el usuario anónimo para los pasos siguientes.

  5. Siga las instrucciones para crear un almacén de claves EP11 privado y anote el ID de almacén de claves para los pasos siguientes.

Configurar la biblioteca de PKCS #11 de Hyper Protect Crypto Services

1. Ejecutar el contenedor de Db2 Community Edition

  1. Utilice el mandato siguiente para ejecutar el contenedor de Db2 Community Edition:

    docker run -itd --name mydb --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=password -e DBNAME=testdb ibmcom/db2
    
  2. Ejecute el mandato siguiente desde una línea de mandatos del sistema host:

    docker exec -it --user root --workdir / mydb bash
    

Este shell se va a utilizar para ejecutar los mandatos como root para los pasos siguientes.

2. Crear el archivo de configuración de PKCS #11 de Hyper Protect Crypto Services

Ahora, cree un archivo de configuración para la característica de PKCS #11 de Hyper Protect Crypto Services. El archivo de configuración se denomina grep11client.yaml.

Adapte la siguiente plantilla de archivo y asigne un nombre al archivo grep11client.yaml:

  • Sustituya <instance_ID> por el ID de la instancia de Hyper Protect Crypto Services
  • Sustituya <EP11_endpoint_URL> y <EP11_endpoint_port_number> por los parámetros respectivos de la dirección de punto final de EP11 de la instancia de Hyper Protect Crypto Services
  • Sustituya <private_keystore_id> por el ID del almacén de claves privado que ha creado anteriormente
  • Sustituya <anonymous_user_api_key> por la clave de API correspondiente del usuario anónimo
iamcredentialtemplate: &defaultiamcredential
          enabled: true
          endpoint: "https://iam.cloud.ibm.com"
          # The Universally Unique IDentifier (UUID) of your Hyper Protect Crypto Services instance.
          instance: "<instance_ID>"

tokens:
  0:
    grep11connection:
      # The EP11 endpoint address starting from 'ep11'. For example: "<instance_ID>.ep11.us-south.hs-crypto.appdomain.cloud"
      address: "<EP11_endpoint_URL>"
      port: "<EP11_endpoint_port_number>" # The EP11 endpoint port number
      tls:
        enabled: true # EP11 requires TLS connection.
        mutual: false
    storage:
      remotestore:
        enabled: true
    users:
       # The Security Officer (SO) user
      0: # The index of the Security Officer (SO) user MUST be 0.
        # The name for the Security Officer (SO) user. For example: "Administrator":
        name: "Administrator"
        iamauth: *defaultiamcredential
      # The normal user
      1: # The index of the normal user MUST be 1.
        # The name for the normal user. For example: "Normal user":
        name: "Normal user"
        # The 128-bit UUID of the private keystore which you created previously
        tokenspaceID: "<private_keystore_id>"
        iamauth: *defaultiamcredential
      # The anonymous user
      2: # The index of the anonymous user MUST be 2.
        # The name for the anonymous user. For example: "Anonymous":
        name: "Anonymous"
        # The public keystore will not be used with this setup.
        # Specify an arbitrary 128-bit UUID below, e.g.:
        tokenspaceID: "12345678-1234-1234-1234-1234567890AB"
        iamauth:
          <<: *defaultiamcredential
          # Provide the API key for the Anonymous user.
          apikey: "<anonymous_user_api_key>"
logging:
  # Set the logging level.
  # The supported levels, in an increasing order of verboseness: 'panic', 'fatal', 'error', 'warning'/'warn', 'info', 'debug', 'trace'. The Default value is 'warning'.
  loglevel: "info"
  logpath: "/tmp/grep11client.log" # The full path of your logging file.

3. Instalar la biblioteca de PKCS #11 de Hyper Protect Crypto Services

  1. Descargue la biblioteca PKCS #11 más reciente.

  2. Copie el archivo de configuración creado previamente grep11client.yaml y la biblioteca PKCS #11 pkcs11-grep11-<platform>.so.<version> en el contenedor Db2.

  3. Ejecute los siguientes mandatos como root para instalar la biblioteca de PKCS #11 de Hyper Protect Crypto Services en la configuración de Db2.

    mkdir /etc/ep11client
    chmod a+rx /etc/ep11client/
    cp grep11client.yaml /etc/ep11client/grep11client.yaml
    chmod a+r /etc/ep11client/grep11client.yaml
    
    mkdir -p /pkcs11
    cp pkcs11-grep11-<platform>.so.<version> /pkcs11/pkcs11-grep11.so
    chmod -R a+rwx /pkcs11
    
    touch /tmp/grep11client.log
    chmod a+rw /tmp/grep11client.log
    

Configurar cifrado nativo de Db2

Ahora, vamos a configurar el cifrado nativo de Db2. Para ello, asegúrese de que dispone de todos los privilegios de administrador de la base de datos.

  1. Cree el archivo /pkcs11/keystore.conf con el siguiente contenido:

    VERSION=1
    PRODUCT_NAME=Other
    ALLOW_KEY_INSERT_WITHOUT_KEYSTORE_BACKUP=true
    LIBRARY=/pkcs11/pkcs11-grep11.so
    SLOT_ID=0
    NEW_OBJECT_TYPE=PRIVATE
    KEYSTORE_STASH=/pkcs11/pkcs11_pw.sth
    
  2. Ejecute los siguientes mandatos como root para actualizar la propiedad y los permisos del archivo /pkcs11/keystore.conf:

    chown -R db2inst1:db2iadm1 /pkcs11/keystore.conf
    chmod ug+rw /pkcs11/keystore.conf
    
  3. Para crear un archivo de ocultación de contraseñas, ejecute los mandatos siguientes y sustituya <normal_user_api_key> por la clave de API del usuario normal que ha creado.

    su - db2inst1
    db2credman -stash -password "<normal_user_api_key>" -to /pkcs11/pkcs11_pw.sth
    
  4. Para actualizar la configuración de Db2, ejecute el mandato siguiente como usuario db2inst1:

    db2 update dbm cfg using keystore_location /pkcs11/keystore.conf  keystore_type pkcs11
    
  5. Para establecer la variable de entorno DB2_DEK_MAC_TYPE, ejecute los mandatos siguientes como usuario db2inst1 y reinicie DB2:

    db2 terminate
    db2stop
    export DB2_DEK_MAC_TYPE=HMAC
    db2start
    

    Debe especificar la variable de entorno DB2_DEK_MAC_TYPE=HMAC antes de iniciar Db2. Si utiliza Db2 en Windows, debe establecer la variable de perfil de Db2 utilizando el mandato siguiente:

    db2set -g DB2_DEK_MAC_TYPE=HMAC
    
  6. Para crear una base de datos cifrada, ejecute los mandatos siguientes:

    db2 create db cryptdb1 encrypt
    

    Este mandato imprime la siguiente información:

    DB20000I  The CREATE DATABASE command completed successfully.
    
  7. Para probar la base de datos cifrada, ejecute los mandatos siguientes:

    db2 connect to cryptdb1
    db2 "create table test (id int not null, data varchar(100))"
    db2 "insert into test values (1, 'This is a secret text')"
    db2 "select * from test"
    

    Este mandato imprime la siguiente información:

    ID          DATA
    ----------- ----------------------------------------------------------------------------------------------------
          1 This is a secret text
    
    1 record(s) selected.
    

Próximos pasos

Sus datos confidenciales ahora se almacenan de forma segura en el almacenamiento cifrado. Y la clave maestra se mantiene en Hyper Protect Crypto Services de una manera altamente segura y a prueba de manipulaciones.

En esta guía de aprendizaje, ha aprendido a configurar el cifrado nativo de Db2 con Hyper Protect Crypto Services.