使用 DLP 代理与 Cloud SQL 进行交互

本教程演示了如何使用通过 Cloud Data Loss Prevention (Cloud DLP) 传递查询结果,以便对返回的结果进行标记化或去标识化处理的代理。此代理在本教程中用于演示目的,不用于生产目的。

本教程适用于有兴趣了解如何使用 Cloud DLP 对存储在 Cloud SQL 中的数据进行标记化和去标识化处理的数据库管理员、安全专业人员和云架构师。本教程假定您熟悉 Cloud Shell 和 Cloud SQL。

在每个组织中,存储的数据量越来越大,其中许多数据可被视为敏感数据。并非所有访问此存储数据的人员在针对数据库运行查询时都需要查看敏感数据。

本教程介绍了一种方法,让您能够允许用户访问包含敏感数据的 Cloud SQL 数据库,但禁止在查看查询结果时查看这些敏感数据。

下图显示了本教程的部署架构。

用户可在其中访问 Cloud SQL 数据库的部署架构。

在本教程中,您将设置一个 DLP 代理充当 Cloud SQL 与简单 SQL 客户端之间的接口。

目标

  • 创建数据库并使用示例敏感数据来填充表。
  • 创建 Cloud DLP 模板。
  • 下载 DLP 代理服务器和客户端 JAR 文件。
  • 配置 DLP 代理,以连接到 Cloud SQL 实例数据库并使用 Cloud DLP 模板。
  • 测试代理功能。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用所需的 API。

    启用 API

创建 Cloud SQL for MySQL 数据库

在本部分,您将创建一个 Cloud SQL 实例,创建一个 Cloud SQL for MySQL 数据库,并添加一些示例敏感数据。

  1. 在 Cloud Console 中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Cloud Console 的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Cloud SDK 的 Shell 环境,其中包括 gcloud 命令行工具以及已为当前项目设置的值。该会话可能需要几秒钟时间来完成初始化。

  2. 本教程中的所有命令都在 Cloud Shell 中运行。
  3. 将完成本教程所需的文件从 Google 的公共 Cloud Storage 存储分区复制到名为 gcp-dlp-tutorial 的文件夹:
    mkdir gcp-dlp-proxy-tutorial
    gsutil cp  gs://solutions-public-assets/dlp-cloudsql-proxy/*.* gcp-dlp-proxy-tutorial
    
  4. 设置 Cloud 项目:
    gcloud config set project project-id
    

    替换以下内容:

    • project-id:您的 Cloud 项目 ID。
  5. 将目录更改为您将教程文件复制到的文件夹:
    cd  gcp-dlp-proxy-tutorial
    
  6. 要查看区域列表,请运行以下命令:
    gcloud compute zones list
    

    如需详细了解区域,请参阅地理位置和地区

  7. 选择一个区域以创建 Cloud SQL 实例,并将该区域导出为环境变量:
    export ZONE=zone
    

    替换以下内容:

    • zone:您选择用于创建 Cloud SQL 实例的区域。
  8. 创建名为 dlp-test-instance 的 Cloud SQL for MySQL 实例:
    gcloud sql instances create dlp-test-instance  --zone  $ZONE
    

    如果输出如下所示的内容,则实例创建完毕:

    Creating Cloud SQL instance...done.
    Created [https://www.googleapis.com/sql/v1beta4/projects/[PROJECT_ID]/instances/dlp-test-instance].
    NAME               DATABASE_VERSION  LOCATION  TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    dlp-test-instance  MYSQL_5_7         [ZONE]    db-n1-standard-1  35.195.26.16     -                RUNNABLE
    
  9. root@% MYSQL 用户设置密码。
    gcloud sql users set-password root \
      --host=% --instance=dlp-test-instance \
      --password=password
    

    替换以下内容:

    • password:安全系数高的密码。

    输出显示以下内容:

    Updating Cloud SQL user...done.
    
  10. 在实例中创建名为 dlp-test-db 的数据库:
    gcloud sql databases create  dlp-test-db --instance dlp-test-instance
    

    输出内容类似如下:

    Creating Cloud SQL database...done.
    Created database [dlp-test-db].
    instance: dlp-test-instance
    name: dlp-test-db
    project: project-id
    
  11. 创建名为 dlptester 的数据库用户:
    gcloud sql users create dlptester \
      --host=% --instance=dlp-test-instance --password=password-database
    

    替换以下内容:

    • password-database:替换为安全系数高的密码。请记下该密码,因为您需要在本教程的后面部分用到它。

    输出显示以下内容:

    Creating Cloud SQL user...done.
    Created user [dlptester].
    
  12. 连接到 Cloud SQL for MySQL 实例:
    gcloud sql connect dlp-test-instance  --user=dlptester
    

    出现提示时,输入 password-database

  13. 在 MySQL 提示符处,创建一个名为 TEST_DATA 的表,并在表中填充几行示例敏感数据:
    source create_test_data.sql
    
  14. 在 MySQL 提示符处,运行查询以显示测试数据已加载到表中:
    select * from TEST_DATA LIMIT 10;
    

    查询结果如下所示:

    MySQL [dlp-test-db]> select * from TEST_DATA LIMIT 10;
    +------+---------------------+--------------+-------------+--------+
    | id   | email               | phone        | ssn         | metric |
    +------+---------------------+--------------+-------------+--------+
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    +------+---------------------+--------------+-------------+--------+
    8 rows in set (0.00 sec)
    
  15. 退出 MySQL 客户端:
    exit
    

创建 Cloud DLP 模板

在本部分,您将创建两个 Cloud DLP 模板。一个是检查模板,用于检查 TEST_DATA 表中的数据是否有 InfoType 定义的敏感数据。第二个模板是去标识化模板,用于对 InfoType 定义的敏感数据进行标记化处理。

创建检查模板

  1. 在 Cloud Console 中,转到 Cloud DLP 页面。

    转到 CLOUD DLP

  2. 点击创建,然后选择模板

  3. 模板 ID 字段中,输入 inspect-template-1

  4. 点击继续

  5. InfoType 设置为 EMAIL_ADDRESSPHONE_NUMBERUS_SOCIAL_SECURITY_NUMBER

  6. 点击创建

创建去标识化模板

在本部分,您将创建一个名为 de-identify-template-1 的去标识化模板;根据配置,该模板会将敏感信息替换为使用加密哈希生成的代理值。如需了解详情,请参阅 Cloud DLP 文档的 cryptoHashConfig 部分

  1. 转到 API Explorer

  2. 父级字段中,将 [YOUR-PROJECT] 替换为您的 Cloud 项目 ID。

  3. 选择执行,然后在出现提示时再次选择执行

    您将收到 200 响应和如下所示的输出:

    {
      "name": "projects/YOUR-PROJECT-ID/deidentifyTemplates/de-identify-template-1",
      "createTime": "2019-10-15T12:46:51.944253Z",
      "updateTime": "2019-10-15T12:46:51.944253Z",
      "deidentifyConfig": {
        "infoTypeTransformations": {
          "transformations": [
            {
              "infoTypes": [
                {
                  "name": "PHONE_NUMBER"
                },
                {
                  "name": "US_SOCIAL_SECURITY_NUMBER"
                },
                {
                  "name": "EMAIL_ADDRESS"
                }
              ],
              "primitiveTransformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "transient": {
                      "name": "abc"
                    }
                  },
                  "surrogateInfoType": {
                    "name": "S1"
                  }
    
  4. 要验证您的去标识化模板是否已成功保存,请返回 API Explorer 进行调用以列出模板。

  5. 父级字段中,输入 projects/project-id

  6. 选择执行,然后在出现提示时再次选择执行

    输出内容如下所示,且包含您创建的模板:

    API Explorer 的输出。

配置和使用 DLP 代理

在本部分,您将配置 DLP 代理,使用客户端连接到该代理,并测试查询结果是否由 Cloud DLP 处理。

  1. 在 Cloud Shell 中,转到您将教程文件复制到的文件夹所在的目录:

    cd  ~/gcp-dlp-proxy-tutorial
    
  2. 修改 DLP 代理服务器配置文件:

    nano config.json
    
  3. 修改以下行,将占位符替换为反映您的配置的值

    "db_instance": "project_id:region:instance_name",
    "db_dbname": "dbase_name",
    "projectID": "project_id",
    "audit_template": "inspect_template",
     "deidentify_template": "deidentify_template",
    

    替换以下内容:

    • project_id:您的 Cloud 项目 ID。
    • region:与创建 Cloud SQL 实例的区域相对应的地区名称。例如,如果您的实例是在 us-central1-a 区域中创建的,则地区为 us-central1.
    • instance_name:您的 Cloud SQL 实例名称,例如 dlp-test-instance
    • dbase_name:您的数据库名称,例如 dlp-test-db
    • inspect_template:您的检查模板名称,例如 inspect-template-1
    • inspect_template:您的去标识化模板名称,例如 de-identify-template-1
  4. 要启动 DLP 代理,请将终端输出定向到 log.txt 文件,从而在后台运行代理:

    java -jar dlp-cloudsql-proxy-server.jar database_userpassword-databaselog.txt 2>&1 &
    

    替换以下内容:

    • database_user:数据库用户的用户名。
    • password-database:您之前创建的数据库用户的密码。
  5. 要检查 DLP 代理是否正在运行,请检查相关进程是否正在运行:

    ps -ax | grep dlp-cloudsql-proxy-server.jar
    

    运行 DLP 代理的进程显示在输出中:

    1233 pts/1    Sl     0:08 java -jar dlP-cloudsql-proxy-Server.jar dlptester XXXXXXXX
    1266 pts/1    S+     0:00 grep --color=auto dlp-cloud sql-proxy-Server
    

    如果您未看到该进程正在运行,请检查 log.txt 文件是否存在错误消息。

  6. 启动提供的简单客户端,以连接到端口 5000 上的 DLP 代理:

    java -jar dlp-sql-proxy-client-0.1.0.jar 5000
    
  7. 从客户端运行一个简单查询。此命令可能需要一些时间,因为 Cloud DLP 需要先处理这些数据,然后才能将其返回给您。

    select * from TEST_DATA LIMIT 10;
    

    输出包含查询结果中替换为加密哈希代理值的手机号码、电子邮件地址和 SSN 值。将这些内容与之前未使用该代理时返回的结果进行比较。

    Connected to SQL Proxy
    Enter query here (enter "quit" to disconnect):
    select * from TEST_DATA LIMIT 10;
    id: 1
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 5
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 2
    phone: S1(40):AfiaKlOYHAzgWGtrkpvaCWUY1e2yvMaK7IQvM/M=
    metric: 8
    email: S1(48):ASF7UBFuZ/xUzXJjD1Ap745xcGmKpTjw+IwIBB/F/OX53w==
    ssn: S1(40):AWYXh7U8PhNUZu+fXLuLFS0KCMmcM5uKH17rig==
    
    id: 3
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 8
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 4
    phone: S1(40):AXFnPkf620wIBXxW0uuBXSVERzRzvhdgbCdaYIw=
    metric: 1
    email: S1(48):AZgs1pfjEPLL6sDAcIZWuCZhC/saw/rQrujxAFy/O60uIA==
    ssn: S1(40):AatdICHDpwCc19ELEjCS8zAmeSVvx/1KB5/S2Q==
    
    End of query results
    
  8. 退出客户端:

    quit
    
  9. 终止 DLP 代理服务器:

    killall java
    
  10. log.txt 文件写入终端以显示 DLP 代理的输出:

    cat  log.txt
    

    审核阶段的输出显示在文件末尾,与您之前配置的 3 个 InfoType 相匹配:

    RunCommand
    DLP Result
    DLP Findings:
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
    
    Got DLP Result
    Sensitive information found
    write log: 1503994
    Logged Main.Query: 1503994
    

清理

若要避免产生费用,最简单的方法是删除您为本教程创建的 Cloud 项目。或者,您也可以删除各个资源。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤