暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

应用实践|PolarDB&全密态数据库:隐私防泄漏运维实操

PolarDB 2024-08-06
236
本文介绍将全密态数据库用于个人隐私保护的最佳实践。

场景说明

以某保险公司业务场景为例,保险公司投保人员信息表(person)如下,记录了用户隐私数据,现需对这些隐私数据进行加密:

姓名(name)

手机号(phone)

身份证号(ID)

银行卡号(debit_card)

家庭住址(address)

淘小宝

13900001111

111222190002309999

6225888888888888

杭州市ABC路888号

钉三多

13900002222

111222190002308888

6225666666666666

杭州市DEF路666号

备注:上表中数据仅为示例。

保险公司投保人员信息表中,投保人员敏感信息在离开手机端时,被数据部门加密保护。销售部门、应用服务以及数据库侧只能看到密文数据,无法泄露投保人员隐私数据。
  • 用户可以通过保险公司手机APP,对数据进行加密后,写入或者更新个人信息。
  • 保险公司销售部门直接连接查询数据库,仅能看到数据密文,看不到明文内容

前提条件

  • 需要了解并掌握全密态数据库的基本使用,参考

    • https://help.aliyun.com/zh/polardb/polardb-for-postgresql/product-overview

  • 已下载并配置全密态数据库提供的客户端SDK或JDBC,更多信息请参见

    • https://help.aliyun.com/zh/polardb/polardb-for-postgresql/client-usage-instructions

  • 已下载EncDB Tool工具,该工具主要用于辅助完成用户主密钥导入、证书(公私钥对)注册、BCL签发和撤销等操作。

  • EncDB Tool工具基于传入参数,生成可直接在数据库中执行的SQL命令。您可以将EncDB Tool工具下载并解压后,使用./genEncdbSQLCommand.sh --help
    命令查看更多解释。

    • 工具地址:https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20221031/yuxx/EncDB-Tool.tar.gz

    • BCL的更多信息参考:https://help.aliyun.com/zh/polardb/polardb-for-postgresql/authorize-multi-user-access


准备工作

本操作以CentOS环境为例进行命令配置。

密码套件配置

1、配置密码套件变量

    cipher_suite=RSA_WITH_AES_128_CBC_SHA256

    2、生成文件模板。

      ./generateSampleKeyAndBCLs.sh -c ${cipher_suite}

      备注:本示例基于文件模板,通过如下命令在sample目录下生成后续示例所需要的配置文件,其中包括用户密钥文件、授权文件等。

      初始化数据库

      1、创建数据库

        CREATE DATABASE demo;

        备注:本文以demo为例,您可以根据实际情况命名数据库,请注意在后续命令中进行同步修改。

        2、在数据库下创建全密态数据库扩展

          CREATE EXTENSION encdb;

          3、获取全密态数据库集群公钥证书并写入到本地文件中。

            SELECT encode(db_process_msg_api('{"request_type":0,"version":"1.2.8"}'),'escape')::json->'server_info'->'public_key'

            备注:

              • 本文以本地文件default_enclave_public_key.pem为例进行演示,您可以根据实际情况命名本地文件,请注意在后续命令中进行同步修改。

              • 公钥证书内容不包含头尾""。

            4、转换为标准公钥证书文件格式
            执行以下命令将\\n
            替换为
            换行符(\n):
              sed -i 's/\\\\n/\n/g' default_enclave_public_key.pem

              执行以下命令去除所有空行:

                sed -i '/^[ ]*$/d' default_enclave_public_key.pem


                隐私保护流程示例

                保险公司数据部门准备投保人员信息

                  -------- 创建用户 --------
                  -- 数据部门,对用户数据负责
                  CREATE USER ins_data;
                  -- 销售部门
                  CREATE USER ins_sale;


                  -------- 创建表 --------
                  -- 为数据部门创建投保人员信息表
                  CREATE TABLE person (
                  name enc_text,
                  phone enc_text,
                  ID enc_text,
                  debit_card enc_text,
                  address enc_text
                  );
                  -- 授权数据部门访问数据表
                  GRANT ALL ON person TO ins_data;


                  注册保险公司数据部门用户

                    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_data.bin -e default_enclave_public_key.pem -c ${cipher_suite}


                    # 获取数据部门账号MEKID,可以通过SQL查询获得:SELECT encdb_get_current_mek_id();
                    # 本文以178079820457738240为例
                    mekid_data=178079820457738240


                    ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_data} --mek sample/default_mek_data.bin --puk sample/usr_puk_data.pem --pri sample/usr_pri_data.pem -c ${cipher_suite}

                    备注:EncDB Tool工具将会基于传入的参数自动生成SQL语句,您需要将生成的SQL在数据库中执行。

                    保险公司数据部门为投保信息表创建加密密钥

                    说明:

                    • 以下命令需使用ins_data用户执行;

                    • 命令中的encdb.dek_xxx()和encdb.keyname_xxx()为类型转换函数;

                      -- 创建dek,记录groupid,例如 b6785611-0c49-4f13-87a9-13f151de9b4d
                      SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));


                      -- 此处仅为示例,同步给所有列,即共用一个dek
                      SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','phone'),encdb.keyname_generate('ins_data','demo','public','person','name'));
                      SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','ID'),encdb.keyname_generate('ins_data','demo','public','person','name'));
                      SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','debit_card'),encdb.keyname_generate('ins_data','demo','public','person','name'));
                      SELECT encdb.dek_copy_keyname(encdb.keyname_generate('ins_data','demo','public','person','address'),encdb.keyname_generate('ins_data','demo','public','person','name'));


                      正常情况下,不允许用户直接通过SQL加密数据(不安全),用户需要明确授权该行为。

                          (1)、编辑BCL内容,将目标dek的授权范围(包括groupid)更新到BCL中。

                        ./setGroupIdBCL.sh -d b6785611-0c49-4f13-87a9-13f151de9b4d

                        说明本示例中的b6785611-0c49-4f13-87a9-13f151de9b4d仅为示例,实际取值请从如下命令中获取:

                          SELECT encdb.dek_generate(encdb.keyname_generate('ins_data','demo','public','person','name'));

                          (2)、签发BCL

                            ./genEncdbSQLCommand.sh -r BCL_ISSUE --subject_sign --spriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}
                            ./genEncdbSQLCommand.sh -r BCL_ISSUE --issuer_sign --ipriv sample/usr_pri_data.pem --spuk sample/usr_puk_data.pem --ipuk sample/usr_puk_data.pem --bcl sample/bcl_for_data_insert.txt -c ${cipher_suite}


                            保险公司数据部门写入数据

                            说明:以下命令需使用ins_data用户执行

                              INSERT INTO person VALUES(encdb.enc_text_encrypt('淘小宝',encdb.keyname_generate('ins_data','demo','public','person','name')),
                              encdb.enc_text_encrypt('13900001111',encdb.keyname_generate('ins_data','demo','public','person','phone')),
                              encdb.enc_text_encrypt('111222190002309999',encdb.keyname_generate('ins_data','demo','public','person','ID')),
                              encdb.enc_text_encrypt('6225888888888888',encdb.keyname_generate('ins_data','demo','public','person','debit_card')),
                              encdb.enc_text_encrypt('杭州市ABC路888号',encdb.keyname_generate('ins_data','demo','public','person','address')));
                              INSERT INTO person VALUES(encdb.enc_text_encrypt('钉三多',encdb.keyname_generate('ins_data','demo','public','person','name')),
                              encdb.enc_text_encrypt('13900002222',encdb.keyname_generate('ins_data','demo','public','person','phone')),
                              encdb.enc_text_encrypt('111222190002308888',encdb.keyname_generate('ins_data','demo','public','person','ID')),
                              encdb.enc_text_encrypt('6225666666666666',encdb.keyname_generate('ins_data','demo','public','person','debit_card')),
                              encdb.enc_text_encrypt('杭州市DEF路666',encdb.keyname_generate('ins_data','demo','public','person','address')));

                              保险公司数据部门查询数据

                              直接查看信息表,查询结果均为密文:

                                SELECT name,phone FROM person;
                                name | phone
                                --------------------------------------------------------------------------+--------------------------------------------------------------------------
                                \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c
                                \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890
                                (2 行记录)

                                使用 ins_data 用户执行如下命令,查询结果为明文:

                                  SELECT encdb.decrypt(name) FROM person WHERE name LIKE encdb.enc_text_encrypt('淘%',encdb.keyname_generate('ins_data','demo','public','person','name'));
                                  decrypt
                                  ---------
                                  淘小宝
                                  (1 row)


                                  保险公司销售部门查询数据测试

                                  1、注册保险公司销售部门账号。

                                    ./genEncdbSQLCommand.sh -r MEK_PROVISION --mek sample/default_mek_sale.bin -e default_enclave_public_key.pem -c ${cipher_suite}


                                    # 获取销售部门账号MEKID,可以通过SQL查询获得:SELECT encdb_get_current_mek_id();
                                    # 本文以2715553450389700608为例
                                    mekid_sale=2715553450389700608


                                    ./genEncdbSQLCommand.sh -r BCL_REGISTER --mekid ${mekid_sale} --mek sample/default_mek_sale.bin --puk sample/usr_puk_sale.pem --pri sample/usr_pri_sale.pem -c ${cipher_suite}

                                    备注:EncDB Tool工具将会基于传入的参数自动生成SQL语句,您需要将生成的SQL在数据库中执行。

                                    2、保险公司销售部门查询数据(销售部门未得到数据部门授权,无法查看数据内容,投保人员隐私数据得到保护

                                    直接查看信息表,查询结果均为密文

                                      SELECT name,phone FROM person;
                                      name | phone
                                      --------------------------------------------------------------------------+--------------------------------------------------------------------------
                                      \xdf4901df087c6a3e0325175bb76942c684191a8dda2a8d0c35f295dc1e30eaeaa0c0e3 | \x315102ea5ab8a659066ab672e6dfbfd89a3a2b360bf6efe3787931e00f61af05f7408c
                                      \xed4903dfd1bda1a89ad6aa7e8905c0e6305e15db4bc9ce2d2cfac9e25094d2a3ed367d | \xd75bb76942c682a8d0c35f295dc5ab8a659066ab672e6de00f61af0a1a89ad6aa7e890
                                      (2 行记录)

                                      说明如果出现ERROR: permission denied for table person的错误时,执行GRANT SELECT ON person TO ins_sale;授权访问表。

                                      使用ins_sale用户执行如下命令,提示未进行BCL授权

                                        SELECT encdb.decrypt(name) FROM person;
                                        WARNING: -- encdb -- -- Untrusted log -- 4 - src/core/untrusted/src/encdb_untrusted_enclave.cpp,256,encdb_ecall: Select BCL (subject_mekid: 2715553450389700608, issuer_mekid: 178079820457738240) from table fail - returned 0xfa030000
                                        ERROR: encdb_ext_enc_text_decrypt: enc_text decrypt errno:fa030000




                                        文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                        评论