Proteção de dados no SAP com a API DLP

Este documento descreve uma arquitetura de referência para proteger dados corporativos confidenciais no SAP usando a API Cloud Data Loss Prevention (DLP) com a edição SAP BTP do SDK do ABAP para Google Cloud.

É essencial proteger os dados confidenciais da empresa, como informações de identificação pessoal (PII) armazenadas no SAP. O compartilhamento de dados corporativos sensíveis do SAP com as pessoas ou sistemas errados pode prejudicar a reputação da sua empresa e causar perdas financeiras. A API DLP oferece uma maneira flexível e eficiente de adicionar uma camada de proteção a dados sensíveis. Essa API pode descobrir, classificar e desidentificar informações sensíveis antes que elas sejam armazenadas ou transmitidas do SAP. Ele ajuda a identificar e proteger proativamente informações confidenciais, reduzindo o risco de violações de dados e garantindo a conformidade com os regulamentos de privacidade.

O público-alvo deste documento inclui desenvolvedores ABAP, arquitetos de soluções SAP e arquitetos de nuvem com responsabilidades que incluem segurança de dados, processamento ou análise de dados. Este documento pressupõe que você já conhece o processamento e a privacidade de dados, a Proteção de dados sensíveis e os conceitos relacionados, como InfoTypes e detectores de infoType.

Arquitetura

O diagrama a seguir mostra uma arquitetura de referência para uma solução de DLP, que abrange componentes de um ambiente SAP BTP ABAP e do Google Cloud.

Solução de DLP para proteção de dados no SAP

Esta arquitetura de solução de DLP inclui os seguintes componentes:

Componente Subsistema Detalhes
1 Origem da entrada Atua como ponto de entrada de dados.
2 Atendimento ao cliente Uma classe ABAP que interage com todos os outros componentes. Ele recebe os dados de origem, os envia para a API DLP pelo SDK ABAP para Google Cloud para processamento e armazena os dados processados no repositório de dados do SAP.
3 SDK do ABAP para Google Cloud A edição SAP BTP do SDK ABAP for Google Cloud para acessar a API DLP.
4 API DLP A API DLP oferece vários métodos de transformação para desidentificação de PII.
5 Datastore de destino Um sistema ERP do SAP, executado na nuvem ou localmente, em que os dados são armazenados depois que as PIIs são processadas e desidentificadas.

Produtos usados

Esta arquitetura de referência usa os seguintes produtos do Google Cloud:

Caso de uso

Esta seção apresenta exemplos de casos de uso em que é possível usar a API DLP para proteger dados corporativos sensíveis no SAP.

Obedecer às regulamentações de privacidade de dados

Muitas vezes, as organizações precisam desidentificar dados sensíveis. Há muitas políticas governamentais, como o GDPR e o DPDP, que exigem que os PIIs não sejam armazenados sob determinadas condições.

Custo

Para uma estimativa do custo dos recursos do Google Cloud usados pela API DLP, consulte a estimativa pré-calculada na Calculadora de preços do Google Cloud.

Alternativa de design

Embora este documento se concentre na edição SAP BTP do ABAP SDK for Google Cloud, você pode alcançar resultados semelhantes usando o ABAP SDK for Google Cloud no local ou em qualquer edição na nuvem. Nessa configuração, é possível armazenar os dados sensíveis (PII) processados e desidentificados no sistema SAP local.

Implantação

Esta seção mostra como implantar uma solução que protege dados sensíveis durante a criação de um parceiro comercial (pessoa) no sistema SAP. Com base na configuração definida pela sua organização, essa solução pode editar, remover a identificação ou anonimizar dados.

Antes de começar

Antes de implementar uma solução baseada nesta arquitetura de referência, verifique se você concluiu os seguintes pré-requisitos:

Implementar um serviço de cliente para a desidentificação de PII

A entrada da fonte de dados é processada em um serviço de cliente implementado no ambiente ABAP do SAP BTP. Esse serviço de cliente pode consistir nos seguintes subcomponentes:

Configuração da regra

No ambiente ABAP do SAP BTP, você cria uma tabela de configuração para manter as regras de transformação que precisam ser aplicadas a diferentes tipos de campos relevantes de PII. Em um ambiente de produção, é possível usar uma ferramenta como o SAP Fiori para manter os dados nessa tabela.

Você pode implementar as seguintes regras de exemplo:

  • Qualquer campo com um endereço de e-mail precisa ser substituído por um valor fictício.
  • Qualquer campo com um número de telefone precisa ser mascarado.
  • Nenhum campo com comentários, notas ou observações pode conter informações relacionadas ao endereço de e-mail.
  • Qualquer campo com detalhes da conta bancária precisa ser tokenizado usando o método de desidentificação criptográfico.

Confira a seguir a definição de uma tabela de exemplo:

define table zgoog_dlp_config {
 key client         : abap.clnt not null;
 key keyword        : abap.char(60) not null;
 key infotype       : abap.char(60) not null;
 surrogate_infotype : abap.char(60);
 common_alphabhet   : abap.char(20);
 masking_char       : abap.char(1);
 number_to_mask     : int4;
}

O exemplo a seguir mostra as regras de transformação:

   lt_dlp_config = VALUE #(
      ( client = sy-mandt keyword  = 'EMAIL' infotype = 'EMAIL_ADDRESS'  )
      ( client = sy-mandt keyword  = 'PHONE NUMBER' infotype = 'PHONE_NUMBER' number_to_mask = 5 masking_char = '*' )
      ( client = sy-mandt keyword  = 'REMARKS' infotype = 'EMAIL_ADDRESS'  )
      ( client = sy-mandt keyword  = 'REMARKS' infotype = 'PHONE_NUMBER'  )
      ( client = sy-mandt keyword  = 'BANK ACCOUNT' infotype = 'FINANCIAL_ACCOUNT_NUMBER' surrogate_infotype = 'ACCOUNT' common_alphabhet = 'ALPHA_NUMERIC' )
    ).

Módulo de proxy da DLP

É possível criar um subcomponente dedicado chamado de módulo de proxy do DLP. Esse módulo pode ser uma classe ABAP ou um serviço REST. A principal função dele é desidentificar PII usando as regras de transformação definidas anteriormente.

O módulo de proxy do DLP usa o método DEIDENTIFY_CONTENT da classe /GOOG/CL_DLP_V2 na edição SAP BTP do SDK ABAP para Google Cloud.

As seções a seguir mostram exemplos de implementações de como usar o módulo de proxy do DLP para desidentificação de PII em vários cenários.

Substituição: substitui um valor confidencial detectado por um valor alternativo especificado.

Para substituir um ID de e-mail detectado por um valor genérico, siga estas etapas:

  1. Crie um objeto cliente para a classe /GOOG/CL_DLP_V2.

  2. Use a tabela de configuração para determinar o tipo de transformação a ser aplicada.

  3. Para mascarar os IDs de e-mail, substitua-os pelo valor de substituição, como EMAIL_ID@EXAMPLE.COM.

  4. Chame a API DLP.

  5. Use o método DEIDENTIFY_CONTENT com todos os parâmetros relevantes, incluindo o valor de substituição, e retorne a saída para o serviço do cliente.

O exemplo de código a seguir ilustra as etapas anteriores:

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100.

TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
   "As a developer, you need to read the configuration
    DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
        "Populate the input parameters to DLP API for replacement
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.ls_transformations-primitive_transformation-replace_config-new_value-string_value  = 'REPLACEMENT_VALUE'.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
        TRY.
            lo_client->deidentify_content(
               EXPORTING
                   iv_p_projects_id = lv_p_projects_id
                   is_input         = ls_input
               IMPORTING
                   es_output        = DATA(ls_output)
                   ev_ret_code      = DATA(lv_ret_code)
                   ev_err_text      = DATA(lv_err_text)
                ).
        CATCH /goog/cx_sdk INTO DATA(lx_sdk_exception).
             ev_message = lx_sdk_exception->get_text( ).
        ENDTRY.
        IF lo_client->is_success( lv_ret_code ).
             ev_message = lv_err_text.
        ELSE.
            ev_output_value = ls_output-item-value.
        ENDIF.
    CATCH cx_sy_itab_line_not_found INTO DATA(lx_not_found).
        ev_output_value = iv_input_value.
    ENDTRY.
"Close the http client
lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

Substitua:

  • CLIENT_KEY: a chave do cliente configurada para autenticação.
  • REPLACEMENT_VALUE: o valor de substituição, como EMAIL_ID@EXAMPLE.COM.
Redação: exclui todo valor sensível detectado ou parte dele.

Para excluir todo ou parte de um valor sensível detectado, siga estas etapas:

  1. Crie um objeto cliente para a classe /GOOG/CL_DLP_V2.

  2. Use a tabela de configuração para determinar o tipo de transformação a ser aplicada.

  3. Especifique se você quer excluir todo ou parte de um valor sensível detectado.

  4. Chame a API DLP.

  5. Use o método DEIDENTIFY_CONTENT com todos os parâmetros relevantes e retorne a saída para o serviço do cliente.

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100,
 lo_redact          TYPE REF TO data.

   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
        "Read the configuration
DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
        "Populate the input parameters to DLP API for redaction
CREATE DATA lo_redact TYPE REF TO string.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_transformations-info_types.
        ls_transformations-primitive_transformation-redact_config = lo_redact.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
        TRY.
lo_client->deidentify_content(
                        EXPORTING
                                iv_p_projects_id = lv_p_projects_id
                            is_input         = ls_input
                        IMPORTING
                            es_output        = DATA(ls_output)
                            ev_ret_code      = DATA(lv_ret_code)
                            ev_err_text      = DATA(lv_err_text)
                 ).
CATCH /goog/cx_sdk INTO lx_sdk_exception.
              ev_message = lx_sdk_exception->get_text( ).
        ENDTRY.
     IF lo_client->is_success( lv_ret_code ).
           ev_message = lv_err_text.
        ELSE.
          ev_output_value = ls_output-item-value.
        ENDIF.
  CATCH cx_sy_itab_line_not_found INTO lx_not_found.
      ev_output_value = iv_input_value.
  ENDTRY.

  "Close the http client
     lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

Substitua CLIENT_KEY pela chave do cliente configurada para autenticação.

Mascaramento: substitui alguns caracteres de um valor confidencial por um caractere especificado, como um hash (#) ou um asterisco (*).

Para substituir valores por um caractere específico, siga estas etapas:

  1. Crie um objeto cliente para a classe /GOOG/CL_DLP_V2.

  2. Use a tabela de configuração para determinar o tipo de transformação a ser aplicado.

  3. Defina o caractere de mascaramento e o número de caracteres a mascarar de acordo com a tabela de configuração.

  4. Chame a API DLP.

  5. Use o método DEIDENTIFY_CONTENT com todos os parâmetros relevantes, incluindo o valor de substituição, e retorne a saída para o serviço de cliente.

DATA:    ls_input           TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations TYPE /goog/cl_dlp_v2=>ty_100.
TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into mt_dlp_config
   TRY.
"Read the configuration
        DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
    "Populate the input parameters to DLP API for masking
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
ls_transformations-primitive_transformation-character_mask_config-number_to_mask =  ls_dlp_config-number_to_mask.
ls_transformations-primitive_transformation-character_mask_config-masking_character = ls_dlp_config-masking_char.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
        "Call DLP API client stub
         TRY.
                   lo_client->deidentify_content(
                       EXPORTING
                         iv_p_projects_id = lv_p_projects_id
                         is_input         = ls_input
                       IMPORTING
                         es_output        = DATA(ls_output)
                         ev_ret_code      = DATA(lv_ret_code)
                         ev_err_text      = DATA(lv_err_text)
                     ).
              CATCH /goog/cx_sdk INTO lx_sdk_exception.
                   ev_message = lx_sdk_exception->get_text( ).
              ENDTRY.
              IF lo_client->is_success( lv_ret_code ).
                 ev_message = lv_err_text.
              ELSE.
                 ev_output_value = ls_output-item-value.
              ENDIF.
      CATCH cx_sy_itab_line_not_found INTO lx_not_found.
         ev_output_value = iv_input_value.
      ENDTRY.
   "Close the http client
     lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

Substitua CLIENT_KEY pela chave do cliente configurada para autenticação.

Tokenização baseada em criptografia: criptografa o valor original dos dados sensíveis usando uma chave criptográfica.

Para a tokenização criptográfica, é necessário criar uma chave criptográfica e uma chave envolta. Este guia usa a criptografia com preservação de formato. Esse método cria um token com o mesmo comprimento e caracteres do valor de entrada original.

Para desidentificar o valor de dados sensíveis usando o mapeamento de hash criptográfico, siga estas etapas:

  1. Crie um objeto cliente para a classe /GOOG/CL_DLP_V2.

  2. Use a tabela de configuração para determinar o tipo de transformação a ser aplicado.

  3. Defina a chave criptográfica e a chave encapsulada criada anteriormente.

  4. Chame a API DLP.

  5. Use o método DEIDENTIFY_CONTENT com todos os parâmetros relevantes para criptografia criptográfica e retorne a saída para o serviço do cliente.

DATA:    ls_input               TYPE /goog/cl_dlp_v2=>ty_055,
         ls_transformations     TYPE /goog/cl_dlp_v2=>ty_100,
         ls_kms_wrapped_key     TYPE /goog/cl_dlp_v2=>ty_123,
         ls_crypto_key          TYPE /goog/cl_dlp_v2=>ty_040,
         ls_crypto_hash_config  TYPE /goog/cl_dlp_v2=>ty_039.

TRY.
   DATA(lo_client) = NEW /goog/cl_dlp_v2( iv_key_name = 'CLIENT_KEY' ).
   DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).

   "As a developer, you need to read the configuration into lt_dlp_config
   "As a developer, you need to populate the crypto key name and wrapped key

   ls_kms_wrapped_key-crypto_key_name = 'CRYPTO_KEY_NAME'. "Crypto_key_name.
   ls_kms_wrapped_key-wrapped_key = 'WRAPPED_KEY_NAME'. "Wrapped_key.
   ls_crypto_key-kms_wrapped = ls_kms_wrapped_key.
   ls_crypto_hash_config-crypto_key = ls_crypto_key.
   TRY.
"Read the configuration
        DATA(ls_dlp_config) = mt_dlp_config[ keyword = iv_input_type ].
    "Populate the input parameters to DLP API for cryptographic encryption
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_input-inspect_config-info_types.
INSERT VALUE #( name = ls_dlp_config-infotype ) INTO TABLE ls_transformations-info_types.             ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-crypto_key-kms_wrapped = ls_kms_wrapped_key.             ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-surrogate_info_type-name = ls_dlp_config-surrogate_infotype.          ls_transformations-primitive_transformation-crypto_replace_ffx_fpe_config-common_alphabet = ls_dlp_config-common_alphabhet.
INSERT ls_transformations INTO TABLE ls_input-deidentify_config-info_type_transformations-transformations.
        ls_input-item-value = iv_input_value.
    "Add the info type identification string to map the subsequent value to relevant infotype
CONCATENATE 'Bank Account' ls_input-item-value INTO ls_input-item-value SEPARATED BY space.
"Call DLP API client stub
TRY.
                lo_client->deidentify_content(
                        EXPORTING
                            iv_p_projects_id = lv_p_projects_id
                            is_input         = ls_input
                        IMPORTING
                            es_output        = DATA(ls_output)
                            ev_ret_code      = DATA(lv_ret_code)
                            ev_err_text      = DATA(lv_err_text)
                 ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk_exception).
                        ev_message = lx_sdk_exception->get_text( ).
                ENDTRY.
         IF lo_client->is_success( lv_ret_code ).
            ev_message = lv_err_text.
         ELSE.
"Removing the info type identification string added earlier and keeping only the encrypted value
    REPLACE ALL OCCURRENCES OF SUBSTRING 'Bank Account' IN ls_output-item-value WITH ''.
    REPLACE ALL OCCURRENCES OF SUBSTRING 'ACCOUNT(10):' IN ls_output-item-value WITH ''.
        ev_output_value  = ls_output-item-value.
        ENDIF.
      CATCH cx_sy_itab_line_not_found INTO lx_not_found.
         ev_output_value = iv_input_value.
      ENDTRY.
 "Close the http client
   lo_client->close_http_client( ).
CATCH /goog/cx_sdk INTO DATA(lx_sdk).
   ev_message = lx_sdk->get_text(  ).
ENDTRY.

Substitua:

  • CLIENT_KEY: a chave do cliente configurada para autenticação.
  • CRYPTO_KEY_NAME: o nome da chave criptográfica.
  • WRAPPED_KEY_NAME: o nome da chave encapsulada.

Transmitir os dados de entrada para o serviço do cliente

Transmitir dados do sistema de origem de entrada para o serviço do cliente. É possível transmitir dados usando uma chamada de API, um aplicativo UI do front-end, um arquivo local, um aplicativo de terceiros ou qualquer outra origem.

Para informações sobre como criar um app SAP Fiori, consulte Criar um app SAP Fiori usando o modelo de programação de aplicativos RESTful ABAP.

Chamar o módulo de proxy do DLP

Chame o módulo de proxy do DLP do serviço de cliente, que recebe a entrada de origem.

O exemplo de código a seguir ilustra como chamar o módulo de proxy do DLP do serviço de cliente:

 DATA : lv_input  TYPE string,
            lv_output TYPE String.

"As a developer, you need to populate input data into relevant fields
"Redaction: Deletes all or part of a detected sensitive value
" - Remarks
lv_input = lv_email_address.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'EMAIL'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_email_address-email_address = lv_output.

"Masking: Replaces a number of characters of a sensitive value with a specified surrogate character, such as a hash (#) or asterisk (*).
" - Phone Number
lv_input = lv_phone_number.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value = lv_input iv_input_type = 'PHONE NUMBER'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_phone_number-phone_number = lv_output.

"Replacement: Replaces a detected sensitive value with a specified surrogate value.
" - Email ID
lv_input = lv_address_comm_remarks.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'REMARKS'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_email_address-address_comm_remarks = lv_output.

"Crypto-based tokenization: Encrypts the original sensitive data value by using a cryptographic key. Sensitive Data Protection supports several types of tokenization,
"including transformations that can be reversed, or "re-identified."
" - Bank account number
lv_input = lv_bank_account.
zgoog_cl_dlp_proxy=>call_dlp( EXPORTING iv_input_value  = lv_input iv_input_type = 'BANK ACCOUNT'
                              IMPORTING ev_output_value = lv_output ev_message = ev_message ).
ls_bupa_bank_details-bank_account = lv_output.

Armazenar dados no sistema SAP ERP

Depois que os campos relevantes forem desidentificados, no serviço de cliente, implemente a lógica para salvar os dados no armazenamento de destino. Pode ser um serviço do Cloud Storage ou seu sistema SAP local.

A seguir

Colaboradores

Autor: Sanchita Mohta | Engenheiro de aplicativos SAP

Outro colaborador: Vikash Kumar | Redator técnico