数据脱敏是隐藏敏感信息的便捷工具。Percona 版 MySQL 是一个免费的、完全兼容的、增强的、开源软件,可以替代任意版本 MySQL 数据库。它提供了卓越的性能、可扩展性高、包括数据脱敏在内的工具。使用 Percona 版 MySQL ,您可以免费获得企业版功能。
那么数据脱敏是如何工作的呢?服务端隐藏输出,因此不显示敏感数据。正如您将在后面示例中看到的的,有许多选项可以满足您数据脱敏的需求。
安装
安装很简单,只需从 MySQL 客户端程序加载共享对象库即可,只需安装插件 data_masking SONAME ‘data_masking.so’ :
stoker@testbox:~/Downloads$ mysql -u root -p
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