Protection des données dans SAP avec l'API DLP

Ce document décrit une architecture de référence pour protéger les données d'entreprise sensibles dans SAP à l'aide de l'API Cloud Data Loss Prevention (DLP) avec l'édition SAP BTP du SDK ABAP pour Google Cloud.

Il est essentiel de protéger les données d'entreprise sensibles, telles que les informations permettant d'identifier personnellement l'utilisateur, que vous stockez dans SAP. Partager des données d'entreprise sensibles de SAP avec les mauvaises personnes ou les mauvais systèmes peut nuire à la réputation de votre entreprise et entraîner des pertes financières. L'API DLP offre un moyen efficace et flexible d'ajouter une couche de protection aux données sensibles. Cette API peut découvrir, classer et anonymiser des informations sensibles avant qu'elles ne soient stockées dans SAP ou transmises depuis SAP. Il vous aide à identifier et à protéger de manière proactive les informations confidentielles, ce qui réduit le risque de violation des données et garantit le respect des réglementations sur la confidentialité.

Ce document s'adresse aux développeurs ABAP, aux architectes de solutions SAP et aux architectes cloud dont les responsabilités couvrent la sécurité des données, leur traitement et leur analyse. Dans ce document, nous partons du principe que vous connaissez bien le traitement et la confidentialité des données, la protection des données sensibles et les concepts associés, tels que les infoTypes et les détecteurs d'infoTypes.

Architecture

Le schéma suivant illustre une architecture de référence pour une solution de DLP, qui comprend des composants d'un environnement ABAP SAP BTP et de Google Cloud.

Solution de protection contre la perte de données pour la protection des données dans SAP

Cette architecture de solution de DLP comprend les composants suivants:

Composant Sous-système Détails
1 Source d'entrée Sert de point d'entrée pour les données.
2 Service client Classe ABAP qui interagit avec tous les autres composants. Il reçoit les données sources, les envoie à l'API DLP via le SDK ABAP pour Google Cloud pour traitement, puis stocke les données traitées dans le datastore SAP.
3 SDK ABAP pour Google Cloud L'édition SAP BTP du SDK ABAP pour Google Cloud pour accéder à l'API DLP
4 API DLP L'API DLP fournit diverses méthodes de transformation pour anonymiser les informations personnelles.
5 Datastore cible Système ERP SAP, exécuté dans le cloud ou sur site, dans lequel les données sont stockées une fois les informations personnelles traitées et anonymisées.

Produits utilisés

Cette architecture de référence utilise les produits Google Cloud suivants :

Cas d'utilisation

Cette section fournit des exemples de cas d'utilisation pour lesquels vous pouvez utiliser l'API DLP pour protéger les données d'entreprise sensibles dans SAP.

Respecter les réglementations sur la confidentialité des données

Les organisations sont souvent tenues de rendre anonymes les données sensibles. De nombreuses réglementations gouvernementales, telles que le RGPD et le DPDP, exigent que les informations personnelles ne soient pas stockées dans certaines conditions.

Coût

Pour obtenir une estimation du coût des ressources Google Cloud utilisées par l'API DLP, consultez l'estimation précalculée dans le simulateur de coût Google Cloud.

Alternative de conception

Bien que ce document se concentre sur l'édition SAP BTP du SDK ABAP pour Google Cloud, vous pouvez obtenir des résultats similaires en utilisant l'édition sur site ou toute édition cloud du SDK ABAP pour Google Cloud. Dans cette configuration, vous pouvez stocker les données sensibles (PII) traitées et anonymisées dans votre système SAP sur site.

Déploiement

Cette section explique comment déployer une solution qui protège les données sensibles lors de la création d'un partenaire commercial (personne) dans votre système SAP. En fonction de la configuration définie par votre organisation, cette solution peut masquer, dépersonnaliser ou anonymiser les données.

Avant de commencer

Avant d'implémenter une solution basée sur cette architecture de référence, assurez-vous d'avoir rempli les conditions préalables suivantes:

Implémenter un service client pour l'anonymisation des informations personnelles

Les entrées de la source de données sont traitées dans un service client que vous implémentez dans votre environnement ABAP SAP BTP. Ce service client peut se composer des sous-composants suivants:

  • Configuration des règles: stocke les règles métier qui doivent être appliquées pour différents types de champs pertinents pour les informations permettant d'identifier personnellement l'utilisateur.
  • Module de proxy DLP: appelle l'API DLP via l'édition SAP BTP du SDK ABAP pour Google Cloud.

Configuration de la règle

Dans votre environnement SAP BTP ABAP, vous créez une table de configuration pour gérer les règles de transformation qui doivent être appliquées aux différents types de champs pertinents pour les informations personnelles. Dans un environnement de production, vous pouvez utiliser un outil tel que SAP Fiori pour gérer les données de cette table.

Vous pouvez implémenter les exemples de règles suivants:

  • Tout champ contenant une adresse e-mail doit être remplacé par une valeur fictive.
  • Tout champ contenant un numéro de téléphone doit être masqué.
  • Les champs contenant des commentaires, des notes ou des remarques ne doivent pas contenir d'informations liées à une adresse e-mail.
  • Tout champ contenant des coordonnées bancaires doit être tokenisé à l'aide d'une méthode de désidentification basée sur la cryptographie.

Voici la définition d'un exemple de table de configuration:

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'exemple suivant montre les exemples de règles de transformation:

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

Module proxy DLP

Vous pouvez créer un sous-composant dédié nommé "module proxy DLP". Ce module peut être une classe ABAP ou un service REST. Sa fonction principale est d'anonymiser les informations d'identification personnelle à l'aide des règles de transformation que vous avez définies précédemment.

Le module proxy de la protection contre la perte de données utilise la méthode DEIDENTIFY_CONTENT de la classe /GOOG/CL_DLP_V2 dans l'édition SAP BTP du SDK ABAP pour Google Cloud.

Les sections suivantes présentent des exemples d'implémentations de l'utilisation du module de proxy DLP pour l'anonymisation des informations personnelles dans différents scénarios.

Remplacement: remplace une valeur sensible détectée par une valeur de substitution spécifiée

Pour remplacer un ID d'e-mail détecté par une valeur générique, procédez comme suit:

  1. Créez un objet client pour la classe /GOOG/CL_DLP_V2.

  2. Utilisez le tableau de configuration pour déterminer le type de transformation à appliquer.

  3. Pour masquer les ID de messagerie, remplacez-les par la valeur de remplacement, par exemple EMAIL_ID@EXAMPLE.COM.

  4. Appelez l'API DLP.

  5. Utilisez la méthode DEIDENTIFY_CONTENT avec tous les paramètres pertinents, y compris la valeur de remplacement, et renvoyez la sortie au service client.

L'exemple de code suivant illustre les étapes précédentes:

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.

Remplacez les éléments suivants :

  • CLIENT_KEY: clé client configurée pour l'authentification.
  • REPLACEMENT_VALUE: valeur de remplacement, telle que EMAIL_ID@EXAMPLE.COM.
Occultation: supprime tout ou partie d'une valeur sensible détectée

Pour supprimer tout ou partie d'une valeur sensible détectée, procédez comme suit:

  1. Créez un objet client pour la classe /GOOG/CL_DLP_V2.

  2. Utilisez le tableau de configuration pour déterminer le type de transformation à appliquer.

  3. Indiquez si vous souhaitez supprimer tout ou partie d'une valeur sensible détectée.

  4. Appelez l'API DLP.

  5. Utilisez la méthode DEIDENTIFY_CONTENT avec tous les paramètres pertinents et renvoyez la sortie au service 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.

Remplacez CLIENT_KEY par la clé client configurée pour l'authentification.

Masquage: remplace un certain nombre de caractères d'une valeur sensible par un caractère spécifié, tel qu'un dièse (#) ou un astérisque (*).

Pour remplacer des valeurs par un caractère spécifié, procédez comme suit:

  1. Créez un objet client pour la classe /GOOG/CL_DLP_V2.

  2. Utilisez le tableau de configuration pour déterminer le type de transformation à appliquer.

  3. Définissez le caractère de masquage et le nombre de caractères à masquer en fonction du tableau de configuration.

  4. Appelez l'API DLP.

  5. Utilisez la méthode DEIDENTIFY_CONTENT avec tous les paramètres pertinents, y compris la valeur de remplacement, et renvoyez la sortie au service client.

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.

Remplacez CLIENT_KEY par la clé client configurée pour l'authentification.

Tokenisation par chiffrement: chiffre la valeur des données sensibles d'origine à l'aide d'une clé cryptographique.

Pour la tokenisation basée sur la cryptographie, vous devez créer une clé cryptographique et une clé encapsulée. Ce guide utilise le chiffrement préservant le format. Cette méthode crée un jeton de même longueur et de même caractère que la valeur d'entrée d'origine.

Pour désidentifier la valeur de données sensibles à l'aide du mappage de hachage cryptographique, procédez comme suit:

  1. Créez un objet client pour la classe /GOOG/CL_DLP_V2.

  2. Utilisez le tableau de configuration pour déterminer le type de transformation à appliquer.

  3. Définissez la clé de chiffrement et la clé encapsulée créées précédemment.

  4. Appelez l'API DLP.

  5. Utilisez la méthode DEIDENTIFY_CONTENT avec tous les paramètres pertinents pour le chiffrement cryptographique et renvoyez la sortie au service 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.

Remplacez les éléments suivants :

  • CLIENT_KEY: clé client configurée pour l'authentification.
  • CRYPTO_KEY_NAME: nom de la clé cryptographique.
  • WRAPPED_KEY_NAME: nom de la clé encapsulée.

Transmettre les données d'entrée au service client

Transmettez les données de votre système source d'entrée au service client. Vous pouvez transmettre des données à l'aide d'un appel d'API, d'une application d'UI frontale, d'un fichier local, d'une application tierce ou de toute autre source.

Pour en savoir plus sur la création d'une application SAP Fiori, consultez Créer une application SAP Fiori à l'aide du modèle de programmation d'applications RESTful ABAP.

Appeler le module de proxy DLP

Appelez le module proxy DLP à partir du service client, qui reçoit l'entrée source.

L'exemple de code suivant montre comment appeler le module de proxy DLP à partir du service 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.

Stocker des données dans le système ERP SAP

Une fois les champs pertinents anonymisés, implémentez la logique permettant d'enregistrer les données dans le stockage cible dans le service client. Il peut s'agir d'un service Cloud Storage ou de votre système SAP sur site.

Étape suivante

  • Pour déployer l'exemple de solution expliqué dans ce guide avec un minimum d'efforts, utilisez l'exemple de code fourni sur GitHub.

  • Découvrez l'ensemble des méthodes de transformation disponibles dans l'API DLP pour trouver celle qui répond le mieux à vos besoins métier spécifiques.

  • Pour en savoir plus sur le SDK ABAP pour Google Cloud, consultez la page Présentation du SDK ABAP pour Google Cloud.

  • Procédez comme suit si vous avez besoin d'aide pour résoudre les problèmes liés au SDK ABAP pour Google Cloud:

Contributeurs

Auteur : Sanchita Mohta | SAP Application Engineer

Autre contributeur : Vikash Kumar | Rédacteur technique