Logo
数据安全的最佳实践

数据安全的最佳实践 #

适用场景 #

数据加密 #

数据加密是对信息进行保护的一种可靠方法,它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息安全的作用。 数据加密适用于对数据资产具有安全要求的企业级应用,如以下两种常见的业务场景:

  1. 新业务,需要对入库数据进行加密处理。

为了减少应用侧的复杂度,也能适应将来的加密需求变化,使用 SphereEx-DBPlusEngine 提供的数据层加密来实现加密功能。这样,加密规则对业务应用透明,加密需求变化时也不需要对应用进行改造,利于实现一套灵活的系统架构。

  1. 存量业务,已有明文数据。

对于已经在线上运行的系统,如何在对新增数据加密的同时,完成对存量数据的加密处理,是一项非常棘手的任务。基于 SphereEx-DBPlusEngine 提供的加密引擎和加密迁移方案,能够完整、安全、透明、低成本的完成数据改造,快速让存量业务满足企业和法律法规的安全要求。

全局权限 #

SphereEx-DBPlusEngine 提供了多种级别的用户权限管理能力,可分别为用户设置库级、表级、列级的操作权限,满足细粒度安全管理要求。 全局权限功能适用于以下应用场景:

  1. 需要限制登录主机的。

通过限制用户的登录主机,保证其只能通过可信的地址连接到 SphereEx-DBPlusEngine,拒绝非法地址的访问,极大程度的保障数据库系统的接入安全。

  1. 需要按用户管理权限的。

通过为每一位数据库用户分别设置库、表、列的操作权限,进行细粒度的权限管理。

  1. 需要按角色管理权限的。

当用户可以按照角色进行分类时,通过对角色进行授权,让角色下的每一个用户具备相同的操作权限。通过这种方式,既实现了细粒度的权限控制,又同时简化了管理流程,避免对多个用户进行重复的授权操作。

需要注意的是,全局权限管理能力适用于 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 能够自动在数据插入时进行加密,也可以在数据查询时自动解密,对业务开发没有影响。

前提条件 #

  1. 具备一套可用的 ZooKeeper,作为治理中心;
  2. 至少一个可访问的数据存储节点,如一个 MySQL 数据库 demo_ds

操作步骤 #

  1. 安装 SphereEx-DBPlusEngine Proxy,并配置为“集群模式”;
  2. 配置 global.yaml 中的 AUTHORITY 规则,将 privilege.type 设置为 SphereEx:PERMITTE,并设置 root 用户的初始密码;
  3. 启动 SphereEx-DBPlusEngine Proxy;
  4. 使用 root 用户登录到 SphereEx-DBPlusEngine Proxy;
mysql -h ${host} -P ${port} -u root -p
  1. 创建逻辑库 encrypt_db
mysql> CREATE DATABASE encrypt_db;
Query OK, 0 rows affected (0.20 sec)

mysql> USE encrypt_db;
Database changed
mysql>
  1. 添加 MySQL 存储节点 demo_dsencrypt_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)
  1. 为业务表 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)
  1. 创建表 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)
  1. 创建用户 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)
  1. 部署完成,登录 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 #

  1. SphereEx-DBPlusEngine 提供的全局权限,与物理 DB 权限的关系是什么?

SphereEx-DBPlusEngine 的全局权限,是从逻辑层面对分布式数据库的接入用户进行权限控制,限制的是接入 DBPlusEngine 的用户对逻辑库、逻辑表以及逻辑列的访问权限。

DB 权限限制的是实际的物理连接中用户对 DB 的操作,其中一些对象如表名、列名是经过 DBPlusEngine 改写的,可能和业务 SQL 中的对象名称不一致(如分片表名、加密列名)。

另外,由于 DBPlusEngine 是分布式数据库,底层会接入多个物理 DB,各个物理 DB 的用户和权限可能不同,但 DBPlusEngine 对最终用户提供统一的认证和权限校验,以实现更好的体验。

  1. 物理 DB 应提供怎样的授权?

用户需要通过 DBPlusEngine 来操作业务数据,因此在添加存储资源时,应该使用具备足够权限的连接用户。

  1. DBPlusEngine 的权限配置如何备份?

DBPlusEngine 的用户和授权信息存储在治理中心,可以通过治理中心的持久化方式进行备份和恢复。 未来 DBPlusEngine 也会提供 DistSQL 语句进行针对性的导出和导入,方便用户操作。