[译文]Percona 版 MySQL 中的数据脱敏——以社区版价格提供企业版功能



数据脱敏是隐藏敏感信息的便捷工具。Percona 版 MySQL 是一个免费的、完全兼容的、增强的、开源软件,可以替代任意版本 MySQL 数据库。它提供了卓越的性能、可扩展性高、包括数据脱敏在内的工具。使用 Percona 版 MySQL ,您可以免费获得企业版功能。

那么数据脱敏是如何工作的呢?服务端隐藏输出,因此不显示敏感数据。正如您将在后面示例中看到的的,有许多选项可以满足您数据脱敏的需求。

安装

安装很简单,只需从 MySQL 客户端程序加载共享对象库即可,只需安装插件 data_masking SONAME ‘data_masking.so’ :

stoker@testbox:~/Downloads$ mysql -u root -
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 22
Server version: 8.0.30-22 Percona Server (GPL), Release '22', Revision '7e301439b65'

Copyright (c) 2009-2022 Percona LLC and/or its affiliates
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> INSTALL PLUGIN data_masking SONAME 'data_masking.so';
Query OK, 0 rows affected (0.04 sec)

mysql> 

基本用法

我们将首先查看 MASK_INNER() 和 MASK_OUTER() 函数。首先,我们需要一些数据来处理。下面将创建一个两列表并用一些数据填充它。

mysql> create table sensative_data (id int, hushhush bigint);
Query OK, 0 rows affected (1.25 sec)

mysql> insert into sensative_data values (1,1234567890),(2,0987654321);
Query OK, 2 rows affected (0.20 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>

注意对第二行数据,将去掉第一个零,存储的是“987654321” 而不是“0987654321”。这就是为什么您偶尔会在期望 INT()的地方看到 CHAR() 数据类型。

MASK_INNER() 函数将使用您选择的字符或者使用的默认的字符(#)对内部字符进行脱敏。MASK_OUTER() 对两端数据进行脱敏加密。

mysql> SELECT id, 
       hushhush as 'Original', 
       MASK_INNER(convert(hushhush using binary),2,3) as 'Inner', 
       MASK_OUTER(convert(hushhush using binary),3,3) as 'Outer' 
FROM sensative_data;
+------+------------+------------+------------+
| id   | Original   | Inner      | Outer      |
+------+------------+------------+------------+
|    1 | 1234567890 | 12XXXXX890 | XXX4567XXX |
|    2 | 987654321  | 98XXXX321  | XXX654XXX  |
+------+------------+------------+------------+
2 rows in set (0.00 sec)

mysql> 

COVERT() 函数用于确保多字节字符集不会压倒接收函数。

SSN 号码

社会安全号码(SSN)不应该被用作通用标识符,尽管它们是这样使用的。SSN有一个特殊的数据掩码。同样,我们需要一些示例数据,请注意,如果掩码无法使用11个字符,则会出现问题。

mysql> create table employee (id int, name char(15), ssn char(11));
Query OK, 0 rows affected (1.33 sec)
 
mysql> create table employee (id int, name char(15), ssn char(11));
Query OK, 0 rows affected (1.33 sec)
 
mysql> insert into employee values (1,"Moe",123-12-1234), (2,"Larry",22-222-2222),(3,'Curly',99-999-9999);
Query OK, 3 rows affected (0.14 sec)
Records: 3  Duplicates: 0  Warnings: 0

MASK_SSN() 与前面的数据掩码类似,只是它返回最后四个数字。

mysql> select id, 
              name, 
              mask_outer(name,1,1,'#') as 'masked', 
              mask_ssn(ssn) as 'Masked SSN' 
        from employee;
+------+-------+--------+-------------+
| id   | name  | masked | Masked SSN  |
+------+-------+--------+-------------+
|    1 | Moe   | #o#    | XXX-XX-1234 |
|    2 | Larry | #arr#  | XXX-XX-2222 |
|    3 | Curly | #url#  | XXX-XX-9999 |
+------+-------+--------+-------------+
3 rows in set (0.01 sec)

信用卡号码

信用卡号码有自己的脱敏函数。信用卡号码本身,即主账号或者PAN,通常被脱敏,只返回最后四位数字。为了了解这是如何实现的,我们将员工表增加一个新列,以容纳16位的信用卡。

SQL > alter table employee add column cc char(16);
Query OK, 0 rows affected (1.6026 sec)
Records: 0 Duplicates: 0 Warnings: 0
SQL > update employee set cc = "1234123412341234";
Query OK, 3 rows affected (0.0969 sec)

Rows matched: 3 Changed: 3 Warnings: 0

现在我们可以尝试 MASK_CC()

SQL > select mask_pan(cc) from employee;
+------------------+
| mask_pan(cc) |
+------------------+
| XXXXXXXXXXXX1234 |
| XXXXXXXXXXXX1234 |
| XXXXXXXXXXXX1234 |
+------------------+
3 rows in set (0.0011 sec)
SQL >

用视图脱敏

您可能会问,当敏感数据可以访问基础表时,如何屏蔽敏感数据。保护原始数据的传统方法是使用视图。视图可以让使用它的人有不同的权限。最重要的是,即使用户对数据访问受到限制,也可以将视图视为表。您可以将视图与掩码结合起来保护数据。诀窍在于您必须设置、使用和维护视图的使用。

要创建一个没有权限但可以看到脱敏数据的用户,我们需要从一个“裸”账户开始。账户 “nopriv” 是在没有授权的情况下设置的,如果我们尝试使用此账户访问架构中的敏感数据,则将失败。

stoker@testbox:~$ mysql -u nopriv -p test
Enter password: 
ERROR 1044 (42000): Access denied for user 'nopriv'@'%' to database 'test'
stoker@testbox:~$ mysql -u nopriv -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 10
Server version: 8.0.30-22 Percona Server (GPL), Release '22', Revision '7e301439b65'

Copyright (c) 2009-2022 Percona LLC and/or its affiliates
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> select * from test.employee;
ERROR 1142 (42000): SELECT command denied to user 'nopriv'@'localhost' for table 'employee'
mysql> 

现在,作为 “root” 或者类似的特权账户,我们可以在正在使用的 schema 中创建一个视图。

SQL > create view e1_cc as 
          SELECT id, 
                 name, 
                 mask_pan(cc) 
           from employee;
Query OK, 0 rows affected (0.1664 sec)
SQL > select * from e1_cc;
+----+-------+------------------+
| id | name  | mask_pan(cc)     |
+----+-------+------------------+
|  1 | Moe   | XXXXXXXXXXXX1234 |
|  2 | Larry | XXXXXXXXXXXX1234 |
|  3 | Curly | XXXXXXXXXXXX1234 |
+----+-------+------------------+
3 rows in set (0.0028 sec)
SQL > 

现在,作为“root” 或者类似的特权账户,我们可以在正在使用的 schema 中创建一个视图。

SQL > create view e1_cc as 
          SELECT id, 
                 name, 
                 mask_pan(cc) 
           from employee;
Query OK, 0 rows affected (0.1664 sec)
SQL > select * from e1_cc;
+----+-------+------------------+
| id | name  | mask_pan(cc)     |
+----+-------+------------------+
|  1 | Moe   | XXXXXXXXXXXX1234 |
|  2 | Larry | XXXXXXXXXXXX1234 |
|  3 | Curly | XXXXXXXXXXXX1234 |
+----+-------+------------------+
3 rows in set (0.0028 sec)
SQL > 

现在,我们可以对我们创建的视图进行非特权访问。请记住从特权账户执行此操作!

SQL> GRANT SELECT ON test.e1_cc TO 'nopriv'@'%';

现在,我们必须登出我们的非特权账户并再次登陆,以使权限生效。现在,您可以作为非特权用户从敏感雇员表中获取脱敏数据。此账户无法查看表中实际数据,但可以通过视图获取允许的数据。这可能非常方便。

SQL > select * from e1_cc;
+----+-------+------------------+
| id | name  | mask_pan(cc)     |
+----+-------+------------------+
|  1 | Moe   | XXXXXXXXXXXX1234 |
|  2 | Larry | XXXXXXXXXXXX1234 |
|  3 | Curly | XXXXXXXXXXXX1234 |
+----+-------+------------------+
3 rows in set (0.0028 sec)

总结

数据脱敏是一种保护敏感数据的强大技术。Percona 通过免费的开源 Percona 版 MySQL 软件提供了这一功能。如果您希望在 Oracle 的企业版 或者 MariaDB 的 MaxScale 中使用数据脱敏,则需要向其供应商购买订阅。


原文始发于微信公众号(Mwkk):[译文]Percona 版 MySQL 中的数据脱敏——以社区版价格提供企业版功能

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100517.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!