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.
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:
Você tem uma conta e um projeto do Google Cloud.
O faturamento está ativado para o projeto. Para informações sobre como confirmar se o faturamento está ativado para o projeto, consulte Verificar o status de faturamento dos projetos.
A edição SAP BTP do ABAP SDK for Google Cloud está instalada e configurada.
A autenticação para acessar as APIs do Google Cloud está configurada. Para saber como configurar a autenticação, consulte Configurar a autenticação para a edição SAP BTP do SDK do ABAP para Google Cloud.
A API DLP está ativada no seu projeto do Google Cloud.
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 de regras: armazena regras de negócios que precisam ser aplicadas a diferentes tipos de campos relevantes de PII.
- Módulo de proxy do DLP: chama a API DLP pela edição SAP BTP do ABAP SDK for Google Cloud.
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:
Crie um objeto cliente para a classe
/GOOG/CL_DLP_V2
.Use a tabela de configuração para determinar o tipo de transformação a ser aplicada.
Para mascarar os IDs de e-mail, substitua-os pelo valor de substituição, como
EMAIL_ID@EXAMPLE.COM
.Chame a API DLP.
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, comoEMAIL_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:
Crie um objeto cliente para a classe
/GOOG/CL_DLP_V2
.Use a tabela de configuração para determinar o tipo de transformação a ser aplicada.
Especifique se você quer excluir todo ou parte de um valor sensível detectado.
Chame a API DLP.
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:
Crie um objeto cliente para a classe
/GOOG/CL_DLP_V2
.Use a tabela de configuração para determinar o tipo de transformação a ser aplicado.
Defina o caractere de mascaramento e o número de caracteres a mascarar de acordo com a tabela de configuração.
Chame a API DLP.
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:
Crie um objeto cliente para a classe
/GOOG/CL_DLP_V2
.Use a tabela de configuração para determinar o tipo de transformação a ser aplicado.
Defina a chave criptográfica e a chave encapsulada criada anteriormente.
Chame a API DLP.
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
Para implantar a solução de exemplo explicada neste guia com o mínimo de esforço, use o exemplo de código fornecido no GitHub.
Conheça todos os métodos de transformação disponíveis na API DLP para encontrar o melhor para suas necessidades de negócios específicas.
Para saber mais sobre o SDK do ABAP para Google Cloud, consulte Visão geral do SDK do ABAP para Google Cloud.
Se você precisar de ajuda para resolver problemas com o SDK ABAP para Google Cloud, faça o seguinte:
- Consulte o guia de solução de problemas do ABAP SDK for Google Cloud.
- Faça suas perguntas e discuta o SDK ABAP para Google Cloud com a comunidade nos Fóruns do Cloud.
- Colete todas as informações de diagnóstico disponíveis e entre em contato com o Cloud Customer Care. Para mais informações sobre como entrar em contato com o atendimento ao cliente, consulte Como receber suporte para o SAP no Google Cloud.
Colaboradores
Autor: Sanchita Mohta | Engenheiro de aplicativos SAP
Outro colaborador: Vikash Kumar | Redator técnico