Protezione dei dati in SAP con l'API DLP

Questo documento descrive un'architettura di riferimento per proteggere i dati aziendali sensibili in SAP utilizzando l'API Cloud Data Loss Prevention (DLP) con l'edizione SAP BTP dell'SDK ABAP per Google Cloud.

È essenziale proteggere i dati aziendali sensibili, come le informazioni che consentono l'identificazione personale (PII), archiviati in SAP. La condivisione di dati aziendali sensibili di SAP con persone o sistemi sbagliati può danneggiare la reputazione della tua azienda e comportare perdite finanziarie. L'API DLP offre un modo efficace e flessibile per aggiungere un livello di protezione per i dati sensibili. Questa API può rilevare, classificare e anonimizzare le informazioni sensibili prima che vengano archiviate in SAP o trasmesse da SAP. Ti aiuta a identificare e proteggere in modo proattivo le informazioni riservate, riducendo il rischio di violazioni dei dati e garantendo la conformità alle normative sulla privacy.

Il pubblico di destinazione di questo documento include sviluppatori ABAP, architetti di soluzioni SAP e architetti cloud le cui responsabilità includono la sicurezza dei dati, l'elaborazione dei dati o l'analisi dei dati. Questo documento presuppone che tu abbia familiarità con il trattamento dei dati e la privacy dei dati, Sensitive Data Protection e i relativi concetti, come infoType e i relativi rilevatori.

Architettura

Il seguente diagramma mostra un'architettura di riferimento per una soluzione DLP, che include componenti di un ambiente ABAP SAP BTP e Google Cloud.

Soluzione DLP per la protezione dei dati in SAP

Questa architettura della soluzione DLP include i seguenti componenti:

Componente Sottosistema Dettagli
1 Origine di input Agisce come punto di contatto per i dati.
2 Assistenza clienti Una classe ABAP che interagisce con tutti gli altri componenti. Riceve i dati di origine, li invia all'API DLP tramite l'SDK ABAP per Google Cloud per l'elaborazione e li archivia nel datastore SAP.
3 ABAP SDK for Google Cloud La versione SAP BTP dell'SDK ABAP per Google Cloud per accedere all'API DLP.
4 DLP API L'API DLP fornisce vari metodi di trasformazione per l'anonimizzazione delle PII.
5 Datastore di destinazione Un sistema SAP ERP, in esecuzione sul cloud o on-premise, in cui vengono archiviati i dati dopo l'elaborazione e l'anonimizzazione delle PII.

Prodotti utilizzati

Questa architettura di riferimento utilizza i seguenti prodotti Google Cloud:

Caso d'uso

Questa sezione fornisce esempi di casi d'uso per i quali puoi utilizzare l'API DLP per proteggere i dati aziendali sensibili in SAP.

Conformità alle normative sulla privacy dei dati

Spesso le organizzazioni sono tenute ad anonimizzare i dati sensibili. Esistono molte norme governative, come il GDPR e il DPDP, che richiedono che le PII non vengano memorizzate in determinate condizioni.

Costo

Per una stima del costo delle risorse Google Cloud utilizzate dall'API DLP, consulta la stima precalcolata nel Calcolatore prezzi di Google Cloud.

Design alternativo

Sebbene questo documento si concentri sull'edizione SAP BTP dell'SDK ABAP per Google Cloud, puoi ottenere risultati simili utilizzando l'edizione on-premise o qualsiasi versione cloud dell'SDK ABAP per Google Cloud. In questa configurazione, puoi archiviare i dati sensibili (PII) trattati e anonimizzati nel tuo sistema SAP on-premise.

Deployment

Questa sezione mostra come implementare una soluzione che protegga i dati sensibili durante la creazione di un partner commerciale (persona) nel sistema SAP. In base alla configurazione impostata dalla tua organizzazione, questa soluzione può oscurare, eliminare l'identità o anonimizzare i dati.

Prima di iniziare

Prima di implementare una soluzione basata su questa architettura di riferimento, assicurati di aver completato i seguenti prerequisiti:

Implementare un servizio client per l'anonimizzazione delle PII

L'input dell'origine dati viene elaborato in un servizio client che implementi nel tuo ambiente ABAP di SAP BTP. Questo servizio client può essere costituito dai seguenti componenti secondari:

  • Configurazione delle regole: memorizza le regole aziendali che devono essere applicate per diversi tipi di campi pertinenti per le PII.
  • Modulo proxy DLP: chiama l'API DLP tramite la versione SAP BTP dell'ABAP SDK per Google Cloud.

Configurazione della regola

Nell'ambiente SAP BTP ABAP, crei una tabella di configurazione per mantenere le regole di trasformazione da applicare per diversi tipi di campi pertinenti per le PII. In un ambiente di produzione, puoi utilizzare uno strumento come SAP Fiori per gestire i dati in questa tabella.

Puoi implementare le seguenti regole di esempio:

  • Qualsiasi campo con un indirizzo email deve essere sostituito con un valore fittizio.
  • Qualsiasi campo con un numero di telefono deve essere mascherato.
  • Qualsiasi campo con commenti, note o osservazioni non deve contenere informazioni relative all'indirizzo email.
  • Qualsiasi campo con i dati del conto bancario deve essere tokenizzato utilizzando un metodo di anonimizzazione basato su crittografia.

Di seguito è riportata la definizione di una tabella di configurazione di esempio:

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;
}

L'esempio seguente mostra le regole di trasformazione di esempio:

   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' )
    ).

Modulo proxy DLP

Puoi creare un sottocomponente dedicato denominato Modulo proxy DLP. Questo modulo può essere una classe ABAP o un servizio REST. La sua funzione principale è anonimizzare le PII utilizzando le regole di trasformazione che hai definito in precedenza.

Il modulo proxy DLP utilizza il metodo DEIDENTIFY_CONTENT della classe /GOOG/CL_DLP_V2 nell'edizione SAP BTP di ABAP SDK for Google Cloud.

Le seguenti sezioni mostrano implementazioni di esempio di come utilizzare il modulo proxy DLP per l'anonimizzazione delle PII in vari scenari.

Sostituzione: sostituisce un valore sensibile rilevato con un valore surrogato specificato

Per sostituire un ID email rilevato con un valore generico:

  1. Crea un oggetto client per la classe /GOOG/CL_DLP_V2.

  2. Utilizza la tabella di configurazione per determinare il tipo di trasformazione da applicare.

  3. Per mascherare gli ID email, sostituiscili con il valore di sostituzione, ad esempio EMAIL_ID@EXAMPLE.COM.

  4. Chiama l'API DLP.

  5. Utilizza il metodo DEIDENTIFY_CONTENT con tutti i parametri pertinenti, incluso il valore di sostituzione, e restituisce l'output al servizio client.

Il seguente esempio di codice illustra i passaggi precedenti:

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.

Sostituisci quanto segue:

  • CLIENT_KEY: la chiave client configurata per l'autenticazione.
  • REPLACEMENT_VALUE: il valore sostitutivo, ad esempio EMAIL_ID@EXAMPLE.COM.
Oscuramento: elimina tutto o parte di un valore sensibile rilevato

Per eliminare tutto o parte di un valore sensibile rilevato:

  1. Crea un oggetto client per la classe /GOOG/CL_DLP_V2.

  2. Utilizza la tabella di configurazione per determinare il tipo di trasformazione da applicare.

  3. Specifica se eliminare tutto o parte di un valore sensibile rilevato.

  4. Chiama l'API DLP.

  5. Utilizza il metodo DEIDENTIFY_CONTENT con tutti i parametri pertinenti e restituisce l'output al servizio client.

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.

Sostituisci CLIENT_KEY con la chiave client configurata per l'autenticazione.

Mascheramento: sostituisce un numero di caratteri di un valore sensibile con un carattere specificato, ad esempio un hash (#) o un asterisco (*)

Per sostituire i valori con un carattere specificato:

  1. Crea un oggetto client per la classe /GOOG/CL_DLP_V2.

  2. Utilizza la tabella di configurazione per determinare il tipo di trasformazione da applicare.

  3. Imposta il carattere di mascheramento e il numero di caratteri da mascherare in base alla tabella di configurazione.

  4. Chiama l'API DLP.

  5. Utilizza il metodo DEIDENTIFY_CONTENT con tutti i parametri pertinenti, incluso il valore di sostituzione, e restituisce l'output al servizio clienti.

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.

Sostituisci CLIENT_KEY con la chiave client configurata per l'autenticazione.

Tokenizzazione basata sulla crittografia: cripta il valore originale dei dati sensibili utilizzando una chiave crittografica

Per la tokenizzazione basata su crittografia, devi creare una chiave crittografica e una chiave con wrapping. Questa guida utilizza la crittografia con protezione del formato. Questo metodo crea un token con la stessa lunghezza e gli stessi caratteri del valore di input originale.

Per anonimizzare il valore dei dati sensibili utilizzando la mappatura dell'hash criptato:

  1. Crea un oggetto client per la classe /GOOG/CL_DLP_V2.

  2. Utilizza la tabella di configurazione per determinare il tipo di trasformazione da applicare.

  3. Imposta la chiave crittografica e la chiave con wrapping create in precedenza.

  4. Chiama l'API DLP.

  5. Utilizza il metodo DEIDENTIFY_CONTENT con tutti i parametri pertinenti per la crittografia e restituisce l'output al servizio client.

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.

Sostituisci quanto segue:

  • CLIENT_KEY: la chiave client configurata per l'autenticazione.
  • CRYPTO_KEY_NAME: il nome della chiave di crittografia.
  • WRAPPED_KEY_NAME: il nome della chiave con wrapping.

Trasmettere i dati di input al servizio client

Trasmetti i dati dal sistema di origine dell'input al servizio client. Puoi trasmettere i dati utilizzando una chiamata API, un'applicazione UI frontend, un file locale, un'applicazione di terze parti o qualsiasi altra origine.

Per informazioni sulla creazione di un'app SAP Fiori, consulta Creare un'app SAP Fiori utilizzando il modello di programmazione delle applicazioni RESTful ABAP.

Chiama il modulo proxy DLP

Chiama il modulo proxy DLP dal servizio client, che riceve l'input dell'origine.

Il seguente esempio di codice illustra come chiamare il modulo proxy DLP dal servizio client:

 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.

Memorizza i dati nel sistema SAP ERP

Dopo aver anonimizzato i campi pertinenti, nel servizio client, implementa la logica per salvare i dati nello spazio di archiviazione di destinazione. Può trattarsi di un servizio Cloud Storage o del tuo sistema SAP on-premise.

Passaggi successivi

Collaboratori

Autore: Sanchita Mohta | SAP Application Engineer

Altro collaboratore: Vikash Kumar | Technical Writer