En este documento, se describe una arquitectura de referencia para proteger los datos empresariales sensibles en SAP con la API de Cloud Data Loss Prevention (DLP) con la edición SAP BTP del SDK de ABAP para Google Cloud.
Es fundamental proteger los datos sensibles de la empresa, como la información de identificación personal (PII) que almacenas en SAP. Compartir datos empresariales sensibles de SAP con las personas o los sistemas equivocados puede dañar la reputación de tu empresa y generar pérdidas financieras. La API de DLP proporciona una forma potente y flexible de agregar una capa de protección para los datos sensibles. Esta API puede descubrir, clasificar y desidentificar información sensible antes de que se almacene en SAP o se transmita desde allí. Te ayuda a identificar y proteger de forma proactiva la información confidencial, lo que reduce el riesgo de violaciones de la seguridad de los datos y garantiza el cumplimiento de las reglamentaciones de privacidad.
El público previsto para este documento incluye desarrolladores de ABAP, arquitectos de soluciones de SAP y arquitectos de nube cuyas responsabilidades incluyen la seguridad de los datos, el procesamiento o el análisis de datos. En este documento, se supone que estás familiarizado con el procesamiento y la privacidad de los datos, la Protección de Datos Sensibles y los conceptos relacionados, como los Infotipos y Infotipo infotipos.
Arquitectura
En el siguiente diagrama, se muestra una arquitectura de referencia para una solución de DLP, que abarca componentes de un entorno de ABAP de SAP BTP y Google Cloud.
Esta arquitectura de la solución de DLP incluye los siguientes componentes:
Componente | Subsistema | Detalles |
---|---|---|
1 | Fuente de entrada | Actúa como punto de entrada para los datos. |
2 | Atención al cliente | Una clase ABAP que interactúa con todos los demás componentes. Recibe los datos de origen, envía datos a la API de DLP a través del SDK de ABAP para Google Cloud para su procesamiento y almacena los datos procesados en el almacén de datos de SAP. |
3 | SDK ABAP para Google Cloud | La edición SAP BTP del SDK de ABAP para Google Cloud para acceder a la API de DLP |
4 | API de DLP | La API de DLP proporciona varios métodos de transformación para la desidentificación de la PII. |
5 | Datastore de destino | Un sistema de ERP de SAP, que se ejecuta en la nube o de forma local, en el que se almacenan los datos después de que se procesa y desidentifica la PII. |
Productos usados
En esta arquitectura de referencia, se usan los siguientes productos de Google Cloud:
Caso de uso
En esta sección, se proporcionan ejemplos de casos de uso para los que puedes usar la API de DLP para proteger datos empresariales sensibles en SAP.
Cumplimiento de las reglamentaciones de privacidad de los datos
A menudo, las organizaciones deben desidentificar los datos sensibles. Existen muchas políticas gubernamentales, como el RGPD y el DPDP, que exigen que la PII no se almacene en determinadas condiciones.
Costo
Para obtener una estimación del costo de los recursos de Google Cloud que usa la API de DLP, consulta la estimación calculada previamente en la calculadora de precios de Google Cloud.
Alternativa de diseño
Si bien este documento se enfoca en la edición SAP BTP del SDK de ABAP para Google Cloud, puedes obtener resultados similares con las ediciones locales o en la nube del SDK de ABAP para Google Cloud. En esta configuración, puedes almacenar los datos sensibles (PII) procesados y desidentificados dentro de tu sistema SAP local.
Implementación
En esta sección, se muestra cómo implementar una solución que proteja los datos sensibles durante la creación de un socio comercial (persona) en tu sistema SAP. Según la configuración que establezca tu organización, esta solución puede ocultar, deidentificar o anonimizar los datos.
Antes de comenzar
Antes de implementar una solución basada en esta arquitectura de referencia, asegúrate de que completaste los siguientes requisitos previos:
Tienes una cuenta y un proyecto de Google Cloud.
La facturación está habilitada en tu proyecto. Para obtener información sobre cómo confirmar que tienes habilitada la facturación en un proyecto, consulta Verifica el estado de facturación de tus proyectos.
Se instala y configura la edición SAP BTP del SDK de ABAP para Google Cloud.
Se configuró la autenticación para acceder a las APIs de Google Cloud. Si deseas obtener información para configurar la autenticación, consulta Configura la autenticación para la edición SAP BTP del SDK de ABAP para Google Cloud.
La API de DLP está habilitada en tu proyecto de Google Cloud.
Implementa un servicio de cliente para la desidentificación de PII
La entrada de la fuente de datos se procesa en un servicio cliente que implementas en tu entorno de ABAP de SAP BTP. Este servicio de cliente puede constar de los siguientes subcomponentes:
- Configuración de reglas: Almacena las reglas empresariales que se deben aplicar para diferentes tipos de campos relevantes de PII.
- Módulo de proxy de DLP: Llama a la API de DLP a través de la edición SAP BTP del SDK de ABAP para Google Cloud.
Configuración de la regla
En tu entorno de ABAP de SAP BTP, creas una tabla de configuración para mantener las reglas de transformación que se deben aplicar para diferentes tipos de campos relevantes de PII. En un entorno de producción, puedes usar una herramienta como SAP Fiori para mantener los datos en esta tabla.
Puedes implementar las siguientes reglas de muestra:
- Cualquier campo con una dirección de correo electrónico debe reemplazarse por un valor ficticio.
- Cualquier campo con un número de teléfono debe estar enmascarado.
- Los campos con comentarios, notas o observaciones no deben contener información relacionada con la dirección de correo electrónico.
- Cualquier campo con detalles de la cuenta bancaria debe ser tokenizado mediante un método de desidentificación basado en criptografía.
A continuación, se muestra la definición de una tabla de configuración de muestra:
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;
}
En el siguiente ejemplo, se muestran las reglas de transformación de muestra:
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 de DLP
Puedes crear un subcomponente dedicado llamado módulo de proxy de DLP. Este módulo puede ser una clase ABAP o un servicio REST. Su función principal es desidentificar la PII con las reglas de transformación que definiste antes.
El módulo de proxy de DLP usa el método DEIDENTIFY_CONTENT
de la clase /GOOG/CL_DLP_V2
dentro de la edición SAP BTP del SDK de ABAP para Google Cloud.
En las siguientes secciones, se muestran implementaciones de ejemplo de cómo usar el módulo de proxy de DLP para la desidentificación de PII en varias situaciones.
Reemplazo: Reemplaza un valor sensible detectado por un valor subrogado especificado.
Para reemplazar un ID de correo electrónico detectado por un valor genérico, sigue estos pasos:
Crea un objeto cliente para la clase
/GOOG/CL_DLP_V2
.Usa la tabla de configuración para determinar el tipo de transformación que se debe aplicar.
Para enmascarar los IDs de correo electrónico, sustitúyelos por el valor de reemplazo, como
EMAIL_ID@EXAMPLE.COM
.Llama a la API de DLP.
Usa el método
DEIDENTIFY_CONTENT
con todos los parámetros relevantes, incluido el valor de reemplazo, y muestra el resultado al servicio de cliente.
En la siguiente muestra de código, se ilustran los pasos 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.
Reemplaza lo siguiente:
CLIENT_KEY
: Es la clave del cliente configurada para la autenticación.REPLACEMENT_VALUE
: Es el valor de reemplazo, comoEMAIL_ID@EXAMPLE.COM
.
Ocultamiento: Borra de forma parcial o completa un valor sensible detectado.
Para borrar todo o parte de un valor sensible detectado, sigue estos pasos:
Crea un objeto cliente para la clase
/GOOG/CL_DLP_V2
.Usa la tabla de configuración para determinar el tipo de transformación que se debe aplicar.
Especifica si quieres borrar todo o una parte de un valor sensible detectado.
Llama a la API de DLP.
Usa el método
DEIDENTIFY_CONTENT
con todos los parámetros relevantes y muestra el resultado al servicio de 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.
Reemplaza CLIENT_KEY
por la clave de cliente configurada para la autenticación.
Enmascaramiento: Reemplaza una cantidad de caracteres de un valor sensible por un carácter especificado, como un hash (#) o un asterisco (*).
Para reemplazar valores por un carácter especificado, sigue estos pasos:
Crea un objeto cliente para la clase
/GOOG/CL_DLP_V2
.Usa la tabla de configuración para determinar el tipo de transformación que se debe aplicar.
Establece el carácter de enmascaramiento y la cantidad de caracteres que se enmascararán según la tabla de configuración.
Llama a la API de DLP.
Usa el método
DEIDENTIFY_CONTENT
con todos los parámetros relevantes, incluido el valor de reemplazo, y muestra el resultado al servicio de atención al 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.
Reemplaza CLIENT_KEY
por la clave de cliente configurada para la autenticación.
Asignación de tokens basada en criptografía: Encripta el valor original de los datos sensibles mediante el uso de una clave criptográfica.
Para la tokenización basada en criptografía, debes crear una clave criptográfica y una clave adjunta. En esta guía, se usa la encriptación de preservación de formato. Con este método, se crea un token que tiene la misma longitud y los mismos caracteres que el valor de entrada original.
Para desidentificar el valor de los datos sensibles mediante la asignación de hash criptográfico, sigue estos pasos:
Crea un objeto cliente para la clase
/GOOG/CL_DLP_V2
.Usa la tabla de configuración para determinar el tipo de transformación que se debe aplicar.
Establece la clave criptográfica y la clave unida que creaste antes.
Llama a la API de DLP.
Usa el método
DEIDENTIFY_CONTENT
con todos los parámetros relevantes para la encriptación criptográfica y devuelve el resultado al servicio de 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.
Reemplaza lo siguiente:
CLIENT_KEY
: Es la clave del cliente configurada para la autenticación.CRYPTO_KEY_NAME
: Es el nombre de la clave criptográfica.WRAPPED_KEY_NAME
: Es el nombre de la clave unida.
Transmite los datos de entrada al servicio de cliente
Transmite datos desde tu sistema de fuente de entrada al servicio cliente. Puedes transmitir datos mediante una llamada a la API, una aplicación de IU del frontend, un archivo local, una aplicación de terceros o cualquier otra fuente.
Para obtener información sobre cómo compilar una app de SAP Fiori, consulta Cómo compilar una app de SAP Fiori con el modelo de programación de aplicaciones RESTful de ABAP.
Llama al módulo de proxy de DLP
Llama al módulo de proxy de DLP desde el servicio de cliente, que recibe la entrada de origen.
En la siguiente muestra de código, se muestra cómo llamar al módulo de proxy de DLP desde el servicio 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.
Almacena datos en el sistema ERP de SAP
Después de que se hayan desidentificado los campos relevantes, en el servicio de cliente, implementa la lógica para guardar los datos en el almacenamiento de destino. Puede ser un servicio de Cloud Storage o tu sistema SAP local.
¿Qué sigue?
Para implementar la solución de ejemplo que se explica en esta guía con el mínimo esfuerzo, usa la muestra de código que se proporciona en GitHub.
Explora la gama completa de métodos de transformación disponibles en la API de DLP para encontrar la mejor opción para tus necesidades comerciales específicas.
Para obtener información sobre el SDK de ABAP para Google Cloud, consulta Descripción general del SDK de ABAP para Google Cloud.
Si necesitas ayuda para resolver problemas con el SDK de ABAP para Google Cloud, haz lo siguiente:
- Consulta la guía de solución de problemas del SDK de ABAP para Google Cloud.
- Haz tus preguntas y analiza el SDK de ABAP para Google Cloud con la comunidad en Cloud Forums.
- Recopila toda la información de diagnóstico disponible y comunícate con el servicio de Atención al cliente de Cloud. Si deseas obtener más información para comunicarte con el equipo de Atención al cliente, consulta Obtén asistencia para SAP en Google Cloud.
Colaboradores
Autor: Sanchita Mohta | Ingeniero de aplicaciones de SAP
Otro colaborador: Vikash Kumar | Escritor técnico