Utilización de Hyper Protect Crypto Services PKCS #11 para Oracle Transparent Database Encryption

Transparent Data Encryption (TDE) es una tecnología bien establecida para cifrar los datos confidenciales en los bases de datos. TDE es compatible con varios sistemas de bases de datos populares, tanto en la nube como en el entorno local, por ejemplo, la base de datos Oracle®. Con TDE, un sistema de base de datos cifra los datos en soportes de almacenamiento de base de datos, tales como espacios de tabla y archivos, y en soportes de copia de seguridad. El sistema de base de datos cifra y descifra de manera automática y transparente los datos cuando lo utilizan los usuarios y las aplicaciones autorizadas. No es necesario que los usuarios de las bases de datos conozcan TDE y no es necesario que las aplicaciones de las bases de datos se adapten específicamente para TDE.

Normalmente, TDE utiliza una jerarquía de claves de dos niveles, que consta de una clave de cifrado maestra de TDE y una clave de cifrado de datos de TDE. La clave de cifrado de datos de TDE se utiliza para cifrar y descifrar datos, mientras que la clave de cifrado maestra de TDE se utiliza para cifrar y descifrar la clave de cifrado de datos de TDE.

Por lo tanto, una pregunta importante cuando planifica el uso de TDE es: ¿Dónde guarda la clave de cifrado maestra de TDE y cómo la protege?

Objetivos

Esta guía de aprendizaje muestra cómo puede mantener un control completo y exclusivo de las claves de cifrado maestro de TDE 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.

Cifrado de base de datos transparente utilizando la API de PKCS #11 estándar
Figura 1. Cifrado de base de datos transparente utilizando la API PKCS #11 estándar

En esta configuración, la Oracle Database llamará a operaciones para gestionar las claves de cifrado maestro de TDE en la biblioteca de PKCS #11 de Hyper Protect Crypto Services. La biblioteca de PKCS #11 de Hyper Protect Crypto Services interactúa con su instancia de Hyper Protect Crypto Services, que proporciona la mejor tecnología de clase para almacenar y gestionar las claves de cifrado maestro de TDE.

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. Inicialice su instancia de Hyper Protect Crypto Services.
  2. Configure la biblioteca PKCS #11 de Hyper Protect Crypto Services en el entorno de base de datos de Oracle.
  3. Configure TDE de base de datos de Oracle y cifre sus datos.

Comencemos con el proceso de inicialización de instancia de Hyper Protect Crypto Services.

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. Generar una clave de API para acceder a la instancia de Hyper Protect Crypto Services. Ejecute el siguiente mandato para crear una API para la cuenta de IBM Cloud:

    ibmcloud iam api-key-create apikeyhpcs -d "API key for Hyper Protect Crypto Services PKCS11"
    
  3. Guardar el valor de la clave de API para los pasos siguientes.

Configurar la biblioteca de PKCS #11 de Hyper Protect Crypto Services en el entorno de Oracle Database

1. Configurar Oracle Database

Necesita una instalación de Oracle Database Enterprise Edition con Oracle Advanced Security. Esta guía de aprendizaje utiliza un solo contenedor Docker de instancia de Oracle Database 19.3 Enterprise Edition. Para obtener más información sobre los contenedores de Oracle Database e instrucciones sobre cómo crear un contenedor respectivo, consulte Oracle Database en Docker.

  1. Inicie el contenedor de Oracle Database:

    docker run --name oradb -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=password oracle/database:19.3.0-ee
    

    Espere hasta que se haya completado la creación de la base de datos y la instancia.

  2. Ejecute el mandato siguiente desde una línea de mandatos del sistema host:

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

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

2. Configurar la biblioteca 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 <your_api_key> por el valor de la clave de API que ha creado.
iamcredentialtemplate: &defaultiamcredential
          enabled: true
          endpoint: "https://iam.cloud.ibm.com"
          # Keep the 'apikey' empty. It will be overridden by the Anonymous user API key configured later.
          apikey:
          # 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>"
      # The EP11 endpoint port number
      port: "<EP11_endpoint_port_number>"
      tls:
        # Grep11 requires TLS connection.
        enabled: true
        # Grep11 requires server only authentication, so 'mutual' needs to be set as 'false'.
        mutual: false
        # 'cacert' is a full-path certificate file.
        # In Linux with the 'ca-ca-certificates' package installed, this is normally not needed.
        cacert:
        # Grep11 requires the server-only authentication, so 'certfile' and 'keyfile' need to be empty.
        certfile:
        keyfile:
    storage:
      filestore:
        enabled: false
        storagepath:
        # 'remotestore' needs to be enabled if you want to generate keys with the attribute CKA_TOKEN.
      remotestore:
        enabled: true
    users:
      0: # The index of the Security Officer (SO) user MUST be 0.
        # The name for the Security Officer (SO) user. For example: "Administrator".
        # NEVER put the API key under the SO user for security reasons.
        name: "Administrator"
        iamauth:
          <<: *defaultiamcredential
      1: # The index of the normal user MUST be 1.
        # The name for the normal user. For example: "Normal user".
        # NEVER put the API key under the normal user for security reasons.
        name: "Normal user"
         # The Space ID is a 128-bit UUID and can be chosen freely.
         # The UUID can be generated by third-party tools, such as 'https://www.uuidgenerator.net/'.
         # For example: "f00db2f1-4421-4032-a505-465bedfa845b".
         # 'tokenspaceID' under the normal user is to identify the private keystore.
        tokenspaceID: "f00db2f1-4421-4032-a505-465bedfa845b"
        iamauth:
          <<: *defaultiamcredential
      2: # The index of the anonymous user MUST be 2.
        # The name for the anonymous user. For example: "Anonymous".
        name: "Anonymous"
        # The Space ID is a 128-bit UUID and can be chosen freely.
        # The UUID can be generated by third-party tools, such as 'https://www.uuidgenerator.net/'.
        # For example: "ca22be26-b798-4fdf-8c83-3e3a492dc215".
        # 'tokenspaceID' under the anonymous user is to identify the public keystore.
        tokenspaceID: "ca22be26-b798-4fdf-8c83-3e3a492dc215"
        iamauth:
          <<: *defaultiamcredential
          # This API key for the Anonymous user must be provided.
          # It will overide the 'apikey' in the previous defaultcredentials.iamauth.apikey field
          apikey: "<your_api_key>"
logging:
  # Set the logging level.
  # The supported levels, in an increasing order of verboseness, are:
  # 'panic', 'fatal', 'error', 'warning'/'warn', 'info', 'debug', 'trace'.
  # The Default value is 'debug'.
  loglevel: debug
  # The full path of your logging file.
  # For example: /tmp/grep11client.log
  logpath: /tmp/grep11client.log

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 grep11client.yaml y la biblioteca PKCS #11 pkcs11-grep11-<platform>.so.<version> en la carpeta de inicio del contenedor Oracle Database.

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

    mkdir /etc/ep11client
    chmod a+rx /etc/ep11client/
    cp grep11client.yaml /etc/ep11client/grep11client.yaml
    chmod a+r /etc/ep11client/grep11client.yaml
    
    mkdir -p /opt/oracle/extapi/64/hsm/ibm
    cp pkcs11-grep11.so.1.1.3 /opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so
    chown -R oracle:oinstall /opt/oracle/extapi
    
    touch /tmp/grep11client.log
    chmod a+rw /tmp/grep11client.log
    chown oracle:oinstall /tmp/grep11client.log
    

El directorio /opt/oracle/extapi/64/hsm y los subdirectorios solo pueden contener un archivo de biblioteca. Elimine cualquier otro archivo de biblioteca que exista en dicho directorio y los subdirectorios.

4. Comprobar la configuración de la biblioteca

  1. Instale el programa de utilidad de línea de mandatos OpenSC (pkcs11-tool) con el mandato siguiente:

    sudo yum install opensc
    
  2. Ejecute el mandato siguiente como usuario root para comprobar la configuración de la biblioteca:

    pkcs11-tool --module=/opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so -I
    

    Este mandato imprime información sobre el fabricante y la biblioteca, por ejemplo:

    Cryptoki version 2.40
    Manufacturer     IBM ...
    Library          GREP11 PKCS11 client ...
    

5. Inicializar la biblioteca Hyper Protect Crypto Services PKCS #11

  1. Ejecute el mandato siguiente desde una línea de mandatos del sistema host:

    docker exec -it oradb bash
    

    Este shell se puede utilizar para ejecutar los mandatos como usuario oracle para los pasos siguientes.

  2. Para inicializar una señal, ejecute los mandatos siguientes y sustituya <your_api_key> por la clave de API que ha creado.

    pkcs11-tool  --module /opt/oracle/extapi/64/hsm/ibm/pkcs11-grep11.so --init-token --label dbtoken --so-pin=<your_api_key>
    

    Este mandato imprime el siguiente mensaje de estado, por ejemplo:

    Using slot 0 with a present token (0x0)
    Token successfully initialized
    

Configure el TDE de Oracle Database y cifre los datos

Ahora vamos a asumir el rol del administrador de la base de datos.

  1. Actualice el archivo 'sqlnet.ora' en el directorio '$ORACLE_HOME/network/admin' añadiendo la línea:

    encryption_wallet_location=(source=(method=hsm))
    

    Para ello, puede ejecutar por ejemplo el mandato siguiente:

    echo "encryption_wallet_location=(source=(method=hsm))" >> $ORACLE_HOME/network/admin/sqlnet.ora
    

    Asegúrese de que el archivo 'sqlnet.ora' no contiene otro valor para encryption_wallet_location.

  2. Abra el almacén de claves con el siguiente mandato. Sustituya <your_api_key> por la clave de API que ha creado:

    export ORACLE_SID=<your SID, e.g. ORCLCDB>
    sqlplus / as sysdba
    SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<your_api_key>" CONTAINER=ALL;
    
  3. Cree las claves maestras con el siguiente mandato. Sustituya <your_api_key> por la clave de API que ha creado:

    SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "<your_api_key>" WITH BACKUP CONTAINER=ALL;
    
  4. crear un espacio de tabla cifrado con el mandato siguiente:

    SQL> CREATE TABLESPACE encrypted_ts DATAFILE 'tbs1_data.dbf' SIZE 128K AUTOEXTEND ON NEXT 64K ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
    
  5. Para verificar la configuración, puede crear una tabla en el espacio de tabla cifrado e insertar algunos datos de prueba:

    SQL> CREATE TABLE tde_ts_test (id    NUMBER(10), data  VARCHAR2(50)) TABLESPACE encrypted_ts;
    SQL> INSERT INTO tde_ts_test VALUES (1, 'This is a secret!');
    SQL> COMMIT;
    SQL> SELECT * FROM TDE_TS_TEST;
    
  6. También puede crear una tabla con una columna cifrada e insertar algunos datos de prueba:

    SQL> CREATE USER C##test IDENTIFIED BY test;
    SQL> GRANT UNLIMITED TABLESPACE TO C##test;
    SQL> CREATE TABLE C##test.tde_test (id NUMBER(10), data VARCHAR2(50) ENCRYPT);
    SQL> INSERT INTO C##test.tde_test VALUES (1, 'This is also a secret!');
    SQL> COMMIT;
    SQL> SELECT * FROM C##test.tde_test;
    
    # Verify encrypted tablespace and encrypted column
    SQL> SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES;
    SQL> SELECT * FROM dba_encrypted_columns ;
    

Próximos pasos

Sus datos confidenciales ahora se almacenan de forma segura en tablas cifradas y columnas cifradas. Y la clave de cifrado maestra de TDE 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 Oracle Database TDE con Hyper Protect Crypto Services.