数据安全的最佳实践 #
适用场景 #
数据加密 #
数据加密是对信息进行保护的一种可靠方法,它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息安全的作用。 数据加密适用于对数据资产具有安全要求的企业级应用,如以下两种常见的业务场景:
- 新业务,需要对入库数据进行加密处理。
为了减少应用侧的复杂度,也能适应将来的加密需求变化,使用 SphereEx-DBPlusEngine 提供的数据层加密来实现加密功能。这样,加密规则对业务应用透明,加密需求变化时也不需要对应用进行改造,利于实现一套灵活的系统架构。
- 存量业务,已有明文数据。
对于已经在线上运行的系统,如何在对新增数据加密的同时,完成对存量数据的加密处理,是一项非常棘手的任务。基于 SphereEx-DBPlusEngine 提供的加密引擎和加密迁移方案,能够完整、安全、透明、低成本的完成数据改造,快速让存量业务满足企业和法律法规的安全要求。
全局权限 #
SphereEx-DBPlusEngine 提供了多种级别的用户权限管理能力,可分别为用户设置库级、表级、列级的操作权限,满足细粒度安全管理要求。 全局权限功能适用于以下应用场景:
- 需要限制登录主机的。
通过限制用户的登录主机,保证其只能通过可信的地址连接到 SphereEx-DBPlusEngine,拒绝非法地址的访问,极大程度的保障数据库系统的接入安全。
- 需要按用户管理权限的。
通过为每一位数据库用户分别设置库、表、列的操作权限,进行细粒度的权限管理。
- 需要按角色管理权限的。
当用户可以按照角色进行分类时,通过对角色进行授权,让角色下的每一个用户具备相同的操作权限。通过这种方式,既实现了细粒度的权限控制,又同时简化了管理流程,避免对多个用户进行重复的授权操作。
需要注意的是,全局权限管理能力适用于 SphereEx-DBPlusEngine Proxy,Driver 不具备该特性。
系统规划 #
部署一个全新的数据加密和权限管理场景,满足以下要求:
- 对用户表
t_user
的身份证号字段id_number
进行加密; - 新建一个用户 enc,只能对
t_user
进行 INSERT、SELECT 操作。
选择加密算法 #
SphereEx-DBPlusEngine 支持多种加密算法,包括 MD5、AES、RC4、SM3、SM4 等等,也可以根据业务需要接入自定义的算法。
本次业务选择常用的 AES 算法对身份证号进行加密。
选择权限控制器 #
SphereEx-DBPlusEngine 目前提供了三种安全级别的权限控制器,分别是:
- ALL_PERMITTED:为所有用户授予所有权限,不进行安全拦截;
- DATABASE_PERMITTED:限制用户访问逻辑库的权限,逻辑库级别数据隔离;
- Enterprise:由 SphereEx 提供的企业级权限控制,可以限制用户对库、表、列的操作权限。
由于本次应用需要仅对 enc 用户授予指定表的部分权限,因此选择使用 Enterprise。
对开发的影响 #
SphereEx-DBPlusEngine 能够自动在数据插入时进行加密,也可以在数据查询时自动解密,对业务开发没有影响。
前提条件 #
- 具备一套可用的 ZooKeeper,作为治理中心;
- 至少一个可访问的数据存储节点,如一个 MySQL 数据库
demo_ds
。
操作步骤 #
- 安装 SphereEx-DBPlusEngine Proxy,并配置为“集群模式”;
- 配置 global.yaml 中的
AUTHORITY
规则,将 privilege.type 设置为SphereEx:PERMITTE
,并设置root
用户的初始密码; - 启动 SphereEx-DBPlusEngine Proxy;
- 使用 root 用户登录到 SphereEx-DBPlusEngine Proxy;
mysql -h ${host} -P ${port} -u root -p
- 创建逻辑库
encrypt_db
;
mysql> CREATE DATABASE encrypt_db;
Query OK, 0 rows affected (0.20 sec)
mysql> USE encrypt_db;
Database changed
mysql>
- 添加 MySQL 存储节点
demo_ds
到encrypt_db
中;
mysql> REGISTER STORAGE UNIT ds_0 (
-> HOST="${demo_ds_host}",
-> PORT=${demo_ds_port},
-> DB="demo_ds",
-> USER="${demo_ds_user}",
-> PASSWORD="${demo_ds_password}"
-> );
Query OK, 0 rows affected (0.10 sec)
- 为业务表
t_user
创建加密规则,对id_number
字段进行加密;
mysql> CREATE ENCRYPT RULE t_user (
-> COLUMNS(
-> (NAME=id_number,CIPHER=id_number,TYPE(NAME="AES",PROPERTIES("aes-key-value"="123456abc")))
-> ), QUERY_WITH_CIPHER_COLUMN=false);
Query OK, 0 rows affected (0.46 sec)
- 创建表
t_user
;
mysql> CREATE TABLE `t_user` (
-> `id` int(11) NOT NULL,
-> `name` varchar(32) NOT NULL,
-> `id_number` varchar(128) NOT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.21 sec)
- 创建用户 enc,并授予 t_user 表的 INSERT 和 SELECT 权限;
mysql> CREATE DIST USER 'enc'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.15 sec)
mysql> GRANT DIST SELECT,INSERT ON encrypt_db.t_user TO 'enc'@'%';
Query OK, 0 rows affected (0.02 sec)
- 部署完成,登录 enc 用户进行验证:
-- Connect
mysql -h ${host} -P ${port} -u enc -p
-- USE db
mysql> USE encrypt_db;
Database changed
-- INSERT
mysql> INSERT INTO t_user values(1,'张三','110111************');
Query OK, 1 row affected (0.08 sec)
-- SELECT
mysql> SELECT * FROM t_user;
+----+-------+--------------------------+
| id | name | id_number |
+----+-------+--------------------------+
| 1 | name1 | 2H385oL4Y16CB5ec41FaHQ== |
+----+-------+--------------------------+
1 row in set (0.00 sec)
-- UPDATE
mysql> UPDATE t_user set name = '张三丰' WHERE id = 1;
ERROR 1997 (C1997): Runtime exception: [SQL checking failed. Error message: Access denied for operation [UPDATE] of subject encrypt_db.t_user:name.]
配置示例 #
global.yaml
mode:
type: Cluster
repository:
type: ZooKeeper
props:
namespace: governance_ds
server-lists: localhost:2181
retryIntervalMilliseconds: 500
timeToLiveSeconds: 60
maxRetries: 3
operationTimeoutMilliseconds: 500
authority:
users:
- user: root@%
password: root
- user: sharding
password: sharding
privilege:
type: Enterprise
FAQ #
- SphereEx-DBPlusEngine 提供的全局权限,与物理 DB 权限的关系是什么?
SphereEx-DBPlusEngine 的全局权限,是从逻辑层面对分布式数据库的接入用户进行权限控制,限制的是接入 DBPlusEngine 的用户对逻辑库、逻辑表以及逻辑列的访问权限。
DB 权限限制的是实际的物理连接中用户对 DB 的操作,其中一些对象如表名、列名是经过 DBPlusEngine 改写的,可能和业务 SQL 中的对象名称不一致(如分片表名、加密列名)。
另外,由于 DBPlusEngine 是分布式数据库,底层会接入多个物理 DB,各个物理 DB 的用户和权限可能不同,但 DBPlusEngine 对最终用户提供统一的认证和权限校验,以实现更好的体验。
- 物理 DB 应提供怎样的授权?
用户需要通过 DBPlusEngine 来操作业务数据,因此在添加存储资源时,应该使用具备足够权限的连接用户。
- DBPlusEngine 的权限配置如何备份?
DBPlusEngine 的用户和授权信息存储在治理中心,可以通过治理中心的持久化方式进行备份和恢复。 未来 DBPlusEngine 也会提供 DistSQL 语句进行针对性的导出和导入,方便用户操作。