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

使用gsql操作密态数据库实验

由迪 2024-03-26
201

原作者:罗海鸥

密态数据库核心是加解密都放在客户端,解决数据库上云后数据安全问题,自MogDB 1.1.0版本开始引入。

本次实验环境(一套MogDB主备系统)

解释[omm@luo129 ~]$ gs_om -t status --detail
[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
current_az      : AZ_ALL

[  Datanode State   ]

    node  node_ip         port      instance                       state
----------------------------------------------------------------------------------------
1  luo    192.168.109.128 26000      6001 /opt/mogdb/testdb/data   P Primary Normal
2  luo129 192.168.109.129 26000      6002 /opt/mogdb/testdb/data   S Standby Normal


MogDB=# \du
                                                              List of roles
 Role name |                                                    Attributes                                                    | Member of
-----------+------------------------------------------------------------------------------------------------------------------+-----------
 luo       | Sysadmin                                                                                                         | {}
 omm       | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, UseFT | {}

第一步登录数据库:(一定加上-C参数)

解释[omm@luo ~]$ gsql -C
gsql ((MogDB 5.0.2 build 245a39c2) compiled at 2023-09-21 16:30:30 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=#
MogDB=#

第二步创建客户端主密钥CMK和列加密密钥CEK:

解释MogDB=#
MogDB=# CREATE CLIENT MASTER KEY ImgCMK1ABC WITH (KEY_STORE = localkms, KEY_PATH = "key_path_value1a", ALGORITHM = RSA_2048);
CREATE CLIENT MASTER KEY
MogDB=# CREATE CLIENT MASTER KEY ImgCMKABC WITH (KEY_STORE = localkms, KEY_PATH = "key_path_value2a", ALGORITHM = RSA_2048);
CREATE CLIENT MASTER KEY
MogDB=#  CREATE COLUMN ENCRYPTION KEY ImgCEK1ABC WITH VALUES (CLIENT_MASTER_KEY = ImgCMK1ABC, ALGORITHM  = AEAD_AES_256_CBC_HMAC_SHA256);
CREATE COLUMN ENCRYPTION KEY
MogDB=#  CREATE COLUMN ENCRYPTION KEY ImgCEKABC WITH VALUES (CLIENT_MASTER_KEY = ImgCMKABC, ALGORITHM  = AEAD_AES_256_CBC_HMAC_SHA256);
CREATE COLUMN ENCRYPTION KEY

查询存储密钥信息的系统表:(imgcmk是之前实验创建的,忽略就行)

解释MogDB=# SELECT * FROM gs_client_global_keys;
 global_key_name | key_namespace | key_owner | key_acl |        create_date
-----------------+---------------+-----------+---------+----------------------------
 imgcmk          |          2200 |        10 |         | 2023-11-27 17:04:53.857207
 imgcmk1abc      |          2200 |        10 |         | 2023-11-30 16:22:12.404601
 imgcmkabc       |          2200 |        10 |         | 2023-11-30 16:22:18.733278
(3 rows)


MogDB=# SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner  FROM gs_column_keys;
 column_key_name | column_key_distributed_id | global_key_id | key_owner
-----------------+---------------------------+---------------+-----------
 imgcek          |                3618369306 |         16861 |        10
 imgcek1abc      |                3715701679 |         25032 |        10
 imgcekabc       |                2140732266 |         25036 |        10
(3 rows)

第三步创建加密表:

解释MogDB=# CREATE TABLE test_creditcard(id    int, name         text encrypted with (column_encryption_key = ImgCEKABC, encryption_type = DETERMINISTIC),credit_card  varchar(19) encrypted with (column_encryption_key = ImgCEK1ABC, encryption_type = DETERMINISTIC));
CREATE TABLE
MogDB=#
MogDB=# \d+ test_creditcard
                            Table "public.test_creditcard"
   Column    |       Type        | Modifiers  | Storage  | Stats target | Description
-------------+-------------------+------------+----------+--------------+-------------
 id          | integer           |            | plain    |              |
 name        | text              |  encrypted | extended |              |
 credit_card | character varying |  encrypted | extended |              |
Has OIDs: no
Options: orientation=row, compression=no

第四步往加密表中写入数据:

MogDB=# INSERT INTO test_creditcard VALUES (1,'joe','6217986500001288393'),(2, 'joy','6219985678349800033');
INSERT 0 2

测试是否加密:

本地客户端带-C参数(未加密)

解释MogDB=# select * from test_creditcard ;
 id | name |     credit_card
----+------+---------------------
  1 | joe  | 6217986500001288393
  2 | joy  | 6219985678349800033
(2 rows)

本地客户端不带-C参数(加密)

解释MogDB=# select * from test_creditcard ;
 id |                                                                         name
      |                                                                                     credit_card

----+------------------------------------------------------------------------------------------------------------------------------------------------
------+----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------
  1 | \x016afb987f2e7780ef5c09c9deff4f5dbeb2dd283721532a7ea619953212101a47c52d481b31000000598d919367066801d596f5f7ec8b68e30d7fb4e406b9b5aca13f01c77f7
62585 | \x01af1b79dd8ac6dee8f181611e3ae50de3a356eab0929f79546c888b35d7c26fde172cd8fc31000000affb1ac0dc10ae9df376796f72c968092a41489e4a15a43ab555356b3
007c5a1b1b7e7d141b4620b6073ea8386417c6c
  2 | \x016afb987ff28325c00f4024903dac4a6d45f8c2c025d94057bbebcab46e6dca573e8b311531000000fa58b436cdaeda2d7607c36c5c63cd9566904fe78e92e2455620218e51e
92736 | \x01af1b79dd7cbd7d564ac1ee1587f6a4e3e7386b2493788613faaf7f8c43fd16b6d827bc9931000000fae8d65716358d2566d8ea5ad7b372733a5cbe010ddf76de356360fdb
81502e5f9e7bbbe8e150dbd8e4db4c80706789c
(2 rows)

测试远程登录是否可以看到解密后的数据:(远程客户端无法查看加密列的数据)

解释[omm@luo129 ~]$ gsql -r  -h 192.168.109.128 -U luo
Password for user luo:
gsql ((MogDB 5.0.2 build 245a39c2) compiled at 2023-09-21 16:30:30 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=> select * from test_creditcard ;
 id |                                                                         name
      |                                                                                     credit_card

----+------------------------------------------------------------------------------------------------------------------------------------------------
------+----------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------
  1 | \x016afb987f2e7780ef5c09c9deff4f5dbeb2dd283721532a7ea619953212101a47c52d481b31000000598d919367066801d596f5f7ec8b68e30d7fb4e406b9b5aca13f01c77f7
62585 | \x01af1b79dd8ac6dee8f181611e3ae50de3a356eab0929f79546c888b35d7c26fde172cd8fc31000000affb1ac0dc10ae9df376796f72c968092a41489e4a15a43ab555356b3
007c5a1b1b7e7d141b4620b6073ea8386417c6c
  2 | \x016afb987ff28325c00f4024903dac4a6d45f8c2c025d94057bbebcab46e6dca573e8b311531000000fa58b436cdaeda2d7607c36c5c63cd9566904fe78e92e2455620218e51e
92736 | \x01af1b79dd7cbd7d564ac1ee1587f6a4e3e7386b2493788613faaf7f8c43fd16b6d827bc9931000000fae8d65716358d2566d8ea5ad7b372733a5cbe010ddf76de356360fdb
81502e5f9e7bbbe8e150dbd8e4db4c80706789c
(2 rows)

MogDB=> \q
[omm@luo129 ~]$ gsql -r  -h 192.168.109.128 -U luo -C
Password for user luo:
gsql ((MogDB 5.0.2 build 245a39c2) compiled at 2023-09-21 16:30:30 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=> select * from test_creditcard ;
ERROR(CLIENT): failed to decrypt column encryption key
MogDB=> select id from test_creditcard ;
 id
----
  1
  2
(2 rows)

备库本地登录也无法访问加密列

解释[omm@luo129 ~]$ gsql -r -C
gsql ((MogDB 5.0.2 build 245a39c2) compiled at 2023-09-21 16:30:30 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=# select * from test_creditcard ;
ERROR(CLIENT): failed to decrypt column encryption key
MogDB=#
MogDB=#
MogDB=#
MogDB=# select id from test_creditcard ;
 id
----
  1
  2
(2 rows)

解决办法:拷贝主库/opt/mogdb/testdb/app/etc/localkms目录内容放到备库相同目录

解释[omm@luo ~]$  cd /opt/mogdb/testdb/app/etc/localkms
[omm@luo localkms]$ ll
total 32
-rw------- 1 omm omm 1752 Nov 30 16:22 key_path_value1a.priv
-rw------- 1 omm omm   84 Nov 30 16:22 key_path_value1a.priv.rand
-rw------- 1 omm omm  536 Nov 30 16:22 key_path_value1a.pub
-rw------- 1 omm omm   84 Nov 30 16:22 key_path_value1a.pub.rand
-rw------- 1 omm omm 1752 Nov 30 16:22 key_path_value2a.priv
-rw------- 1 omm omm   84 Nov 30 16:22 key_path_value2a.priv.rand
-rw------- 1 omm omm  536 Nov 30 16:22 key_path_value2a.pub
-rw------- 1 omm omm   84 Nov 30 16:22 key_path_value2a.pub.rand
[omm@luo localkms]$ scp * 192.168.109.129:`pwd`
key_path_value1a.priv                                                                                              100% 1752   337.5KB/s   00:00
key_path_value1a.priv.rand                                                                                         100%   84    10.6KB/s   00:00
key_path_value1a.pub                                                                                               100%  536   112.5KB/s   00:00
key_path_value1a.pub.rand                                                                                          100%   84    13.0KB/s   00:00
key_path_value2a.priv                                                                                              100% 1752   211.4KB/s   00:00
key_path_value2a.priv.rand                                                                                         100%   84    12.8KB/s   00:00
key_path_value2a.pub                                                                                               100%  536    83.3KB/s   00:00
key_path_value2a.pub.rand                                                                                          100%   84    14.5KB/s   00:00
[omm@luo localkms]$

在备库进行测试(可以访问加密列)

解释[omm@luo129 ~]$  cd /opt/mogdb/testdb/app/etc/localkms
[omm@luo129 localkms]$
[omm@luo129 localkms]$ ll
total 32
-rw------- 1 omm omm 1752 Nov 30 17:15 key_path_value1a.priv
-rw------- 1 omm omm   84 Nov 30 17:15 key_path_value1a.priv.rand
-rw------- 1 omm omm  536 Nov 30 17:15 key_path_value1a.pub
-rw------- 1 omm omm   84 Nov 30 17:15 key_path_value1a.pub.rand
-rw------- 1 omm omm 1752 Nov 30 17:15 key_path_value2a.priv
-rw------- 1 omm omm   84 Nov 30 17:15 key_path_value2a.priv.rand
-rw------- 1 omm omm  536 Nov 30 17:15 key_path_value2a.pub
-rw------- 1 omm omm   84 Nov 30 17:15 key_path_value2a.pub.rand
[omm@luo129 localkms]$
[omm@luo129 localkms]$ gsql -r -C
gsql ((MogDB 5.0.2 build 245a39c2) compiled at 2023-09-21 16:30:30 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=# select * from test_creditcard ;
 id | name |     credit_card
----+------+---------------------
  1 | joe  | 6217986500001288393
  2 | joy  | 6219985678349800033
(2 rows)

当然这一特性也存在一定局限性,比如只能进行等值查询。

解释MogDB=# select * from test_creditcard ;
 id | name |     credit_card
----+------+---------------------
  1 | joe  | 6217986500001288393
  2 | joy  | 6219985678349800033
(2 rows)
MogDB=# select * from test_creditcard where credit_card >0;
ERROR(CLIENT): operator is not allowed on datatype of this column
MogDB=#
MogDB=# select * from test_creditcard where credit_card like '621798650000128%';
ERROR(CLIENT): operator is not allowed on datatype of this column
MogDB=#

获取更多信息请访问MogDB官网https://docs.mogdb.io/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论