Usando Hyper Protect Crypto Services PKCS #11 para a criptografia nativa do IBM Db2

A criptografia nativa do IBM Db2® protege os arquivos do banco de dados de chave e as imagens backup do banco de dados contra o acesso inapropriado enquanto eles são armazenados na mídia de armazenamento externo. O sistema de banco de dados criptografa e decriptografa dados automaticamente quando ele é usado por usuários e aplicativos autorizados. Geralmente, os usuários do banco de dados não precisam estar cientes da criptografia nativa e os aplicativos clientes de banco de dados não precisam ser adaptados especificamente.

A criptografia nativa do Db2 usa uma hierarquia de chave de duas camadas: os dados são criptografados com uma chave de criptografia de dados (DEK). O DEK é criptografado com uma chave mestra e é armazenado em forma criptografada com o banco de dados ou a imagem de backup. Um DEK exclusivo é gerado por DB2 para cada banco de dados criptografado e para cada backup criptografado.

Uma chave mestra é usada para criptografar um DEK. Cada banco de dados criptografado é associado a uma chave mestra por vez.

Uma questão importante ao planejar a criptografia nativa do Db2 é onde você mantém a chave mestra e como você a protege.

Objetivos

Este tutorial mostra como é possível manter o controle completo e exclusivo de suas chaves mestras armazenando-as nos IBM Cloud® Hyper Protect Crypto Services. Para esse propósito, é necessário usar o recurso de integração do PKCS n.º 11 do Hyper Protect Crypto Services.

Com este tutorial, você implementará a configuração que está representada na ilustração a seguir.

IBM Db2 criptografia padrão com a API PKCS #11 padrão
Figura 1. Criptografia padrão do IBM DB2 com a API PKCS #11 padrão

Nesta configuração, o Db2 chamará operações para gerenciar as chaves mestras na biblioteca PKCS n.º 11 dos Hyper Protect Crypto Services. A biblioteca PKCS n.º 11 dos Hyper Protect Crypto Services interage com a sua instância dos Hyper Protect Crypto Services, que fornece o melhor da tecnologia de classe para armazenamento e gerenciamento de suas chaves mestras.

Antes de Iniciar

Para concluir este tutorial, é necessário atender aos pré-requisitos a seguir:

Fluxo de tarefas

Para concluir esta solução, vamos prosseguir pelas etapas a seguir:

  1. Inicialize sua instância Hyper Protect Crypto Services
  2. Configure a biblioteca do PCKS n° 11 do Hyper Protect Crypto Services
  3. Configurar o Db2 e configurar a criptografia nativa do Db2

Inicialize a sua instância do Hyper Protect Crypto Services

  1. Para este tutorial, é necessário inicializar uma instância do Hyper Protect Crypto Services primeiro.

    Anote o ID de sua instância do Hyper Protect Crypto Services e o endereço de terminal EP11. Essas informações serão necessárias para as etapas subsequentes.

  2. Crie uma função do IAM customizada Discover HPCS. Esta função fornece uma permissão muito limitada para descobrir a sua instância do Hyper Protect Crypto Services, que é exigida pela biblioteca PKCS #11 . Esta função não tem permissões para usar, criar ou gerenciar chaves ou keystores EP11.

    1. Na UI, acesse Gerenciar > Acesso (IAM) e selecione Funções e, em seguida, clique em Criar.
    2. Digite o nome Discover HPCS para a sua função.
    3. Insira um ID para a função. Este ID é usado no CRN, que é usado ao designar acesso usando a API. O ID da função deve começar com uma letra maiúscula e usar apenas caracteres alfanuméricos, por exemplo, DiscoverHPCS.
    4. Opcional: insira uma descrição sucinta e útil que ajude os usuários que estão designando acesso a saber qual o nível de acesso que a atribuição de função concede a um usuário. Essa descrição também é mostrada na UI quando um usuário designa acesso ao serviço.
    5. Na lista de serviços, selecione Hyper Protect Crypto Services
    6. Selecione Incluir para a ação hs-crypto.discovery.listservers e, em seguida, clique em Criar.
  3. Siga as instruções em Configurando os tipos de usuário da API PKCS #11 para configurar os IDs de serviço e as chaves de API para usuário normal e usuário anônimo.

    Não configure o tipo de usuário S.O. que é mencionado nas instruções. Também, ao contrário das instruções, não atribua ao ID de serviço de usuário anônimo a função customizada Key operator, mas atribua a função customizada Discover HPCS em vez disso.

    Com essa configuração, o usuário anônimo tem apenas permissões muito limitadas em sua instância do Hyper Protect Crypto Services e não pode usar, criar ou gerenciar chaves ou keystores EP11.

  4. Salve o valor das chaves API para usuário normal e usuário anônimo para as etapas subsequentes.

  5. Siga as instruções para criar um keystore EP11 privado e anote o ID do keystore para as etapas subsequentes.

Configurar a biblioteca PKCS n.º 11 dos Hyper Protect Crypto Services

1. Executar o contêiner do Db2 Community Edition

  1. Use o comando a seguir para executar o contêiner do 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. Execute o comando a seguir por meio de uma linha de comandos em seu sistema host:

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

Esse shell será usado para executar os comandos como root para as etapas subsequentes.

2. Criar o arquivo de configuração do PKCS n.º 11 dos Hyper Protect Crypto Services

Agora, crie um arquivo de configuração para o recurso PKCS n.º 11 dos Hyper Protect Crypto Services. O arquivo de configuração é denominado grep11client.yaml.

Adapte o modelo de arquivo a seguir e nomeie o arquivo grep11client.yaml:

  • Substitua <instance_ID> pelo ID de sua instância do Hyper Protect Crypto Services
  • Substitua <EP11_endpoint_URL> e <EP11_endpoint_port_number> pelos respectivos parâmetros do endereço de terminal EP11 de sua instância do Hyper Protect Crypto Services
  • Substitua <private_keystore_id> pelo ID do keystore privado que você criou anteriormente
  • Substitua <anonymous_user_api_key> pela respectiva chave de API do usuário 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. Instale a biblioteca do PKCS n.º 11 do Hyper Protect Crypto Services

  1. Faça download da biblioteca PKCS #11 mais recente.

  2. Copie o arquivo de configuração criado anteriormente grep11client.yaml e a biblioteca PKCS #11 pkcs11-grep11-<platform>.so.<version> para o seu contêiner DB2.

  3. Execute os comandos a seguir como root para instalar a biblioteca PKCS n.º 11 dos Hyper Protect Crypto Services em sua configuração do 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 a criptografia nativa do Db2

Agora, vamos configurar a criptografia nativa do Db2. Para isso, certifique-se de que você tem todos os privilégios de administrador do banco de dados.

  1. Crie o arquivo /pkcs11/keystore.conf com o conteúdo a seguir:

    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. Execute os comandos a seguir como root para atualizar a propriedade e as permissões do arquivo /pkcs11/keystore.conf:

    chown -R db2inst1:db2iadm1 /pkcs11/keystore.conf
    chmod ug+rw /pkcs11/keystore.conf
    
  3. Para criar um arquivo stash de senha, execute os comandos a seguir e substitua <normal_user_api_key> pela chave de API do usuários normal que você criou.

    su - db2inst1
    db2credman -stash -password "<normal_user_api_key>" -to /pkcs11/pkcs11_pw.sth
    
  4. Para atualizar a configuração do Db2, execute o comando a seguir como usuário db2inst1:

    db2 update dbm cfg using keystore_location /pkcs11/keystore.conf  keystore_type pkcs11
    
  5. Para configurar a variável de ambiente DB2_DEK_MAC_TYPE, execute os comandos a seguir como usuário db2inst1 e reinicie o DB2:

    db2 terminate
    db2stop
    export DB2_DEK_MAC_TYPE=HMAC
    db2start
    

    Você precisa especificar a variável de ambiente DB2_DEK_MAC_TYPE=HMAC antes de iniciar o Db2. Se você usar o Db2 no Windows, será necessário configurar a variável de perfil do Db2 usando o comando a seguir:

    db2set -g DB2_DEK_MAC_TYPE=HMAC
    
  6. Para criar um banco de dados criptografado, execute os comandos a seguir:

    db2 create db cryptdb1 encrypt
    

    Este comando imprime as informações a seguir:

    DB20000I  The CREATE DATABASE command completed successfully.
    
  7. Para testar o banco de dados criptografado, execute os comandos a seguir:

    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 comando imprime as informações a seguir:

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

Próximas etapas

Seus dados sensíveis agora são armazenados com segurança no armazenamento criptografado. E a chave mestra é mantida nos Hyper Protect Crypto Services de uma maneira altamente segura e à prova de violação.

Neste tutorial, você aprendeu a configurar a criptografia nativa do Db2 com os Hyper Protect Crypto Services.