基本概念
数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。
数据库审计是数据库安全技术之一,数据库安全技术主要包括:
- 数据库漏扫
- 数据库加密
- 数据库防火墙
- 数据脱敏
- 数据库安全审计系统
概括起来主要表现在以下三个层面:
- 管理风险:主要表现为人员的职责、流程有待完善,内部员工的日常操作有待规范,第三方维护人员的操作监控失效等等,离职员工的后门,致使安全事件发生时,无法追溯并定位真实的操作者。SQL审核是保证数据库DDL 和 DML 安全使用、SQL变更可追溯、降低线上数据事故概率的重要手段。
- 技术风险:Oracle, SQL Server是一个庞大而复杂的系统,安全漏洞如溢出, 注入层出不穷,每一次的CPU(Critical Patch Update)都疲于奔命, 而企业和政府处于稳定性考虑,往往对补丁的跟进非常延后,更何况通过应用层的注入攻击使得数据库处于一个无辜受害的状态。
- 审计层面:现有的依赖于数据库日志文件的审计方法,存在诸多的弊端,比如:数据库审计功能的开启会影响数据库本身的性能、数据库日志文件本身存在被篡改的风险,难于体现审计信息的有效性和公正性。此外,对于审计数据的挖掘和迅速定位也是任何审计系统必须面对和解决的一个核心问题之一。
行业产品现状
- 企业产品
就国内而言,做数据库审计产品的公司越来越多,比如:安华金和、天融信、安恒、绿盟、Themis宜信公司等等。
- 云平台数据库审计
阿里云、AWS等都有自己的数据库审计平台。
- 开源类
本文即将介绍的Yearning。
开源数据库审计平台Yearning
简介
Yearning是一个轻量级的Web端的MySQL SQL语句审核平台,提供查询审计,SQL审核,SQL回滚,自定义工作流等多种功能。Yearning的前端是基于Vue.js构建的,它还提供SQL语法高亮、自动补全和智能提示、可视化等。
Yearning自身包含了一套通常适用的审核规范,基本上能满足日常需要,同时规范了日常开发需求所涉及到的SQL变动,在Yearning平台的辅助下,日常的SQL变动也更加贴近SQL使用的规范化、标准化的要求,同时100%基于GO语言研发的Yearning也可以通过自定义二次开发(遵循AGPL协议)增加一些符合自己审核策略。
Yearning的安装十分简单,它只依赖一个mysql数据库用于存储工单的数据。官方提供了安装手册用于在linux上安装Yearning。除此之外,Yearning还支持容器化部署,安装包内置了Dockerfile,方便快捷。同时Yearning还支持二次开发,二次开发的同学可以自己构建发布。
主要功能Feature
- SQL查询
- 查询工单
- 导出
- 自动补全,智能提示
- 查询语句审计
- SQL审核
- 流程化工单
- SQL语句检测与执行
- SQL回滚
- 历史审核记录
- 推送
- E-mail工单推送
- 钉钉webhook机器人工单推送
- 用户权限及管理
- 角色划分
- 基于用户的细粒度权限
- 注册
- 其他
- todoList
- LDAP登录
- 动态审核规则配置
- AutoTask自动执行
兼容性与依赖
- Yearning 不依赖于任何第三方SQL审核工具作为审核引擎,内部已自己实现审核/回滚相关逻辑。
- 仅依赖Mysql数据库。mysql版本必须5.7及以上版本
- Yearning日志仅输出error级别,没有日志即可认为无运行错误!
- Yearning 的前端管理界面基于1080p分辨率开发仅支持1080p及以上显示器访问
- Yearning目前只支持MySQL。
- Yearning SQL审核平台目前兼容99%的Mysql 标准SQL语法。已知不支持的语句类型有:
- 复杂的查询语句(多表,多函数,非必现。并不是所有复杂语句不支持)
- create table like 语句
- 视图语句
- 外键相关语句
部分功能展示
1. 登陆界面
2. 用户模块
2.1 Dashboard
dashboard主要展示Yearning各项数据包括用户数/数据源数/工单数/查询数以及其他图表。个人信息栏内用户可以修改密码/邮箱/真实姓名,同时可以查看该用户权限以及申请权限
2.2 我的工单
展示用户提交的工单信息,对于执行失败/驳回的工单点击详细信息后可以重新修改sql并提交,对于执行成功的工单可以查看回滚语句并且快速提交SQL。
2.3 提交工单(DDL&DML审核)
提交DDL/DML相关SQL语句的执行审核,需要指定SQL语句内容(DDL或DML语句)、SQL执行的数据库,执行时间/频率、工单审核人等信息。此处的SQL编辑器支持语法高亮、自动补全等。等审核人审核通过后,该DDL/DML语句才可按配置定时执行。
2.4 查询数据库
当用户需要查询/导出数据时,需要提交查询审核申请单,填写好查询说明、查询条件预估所需的查询时间等信息,待审核人审核通过后,用户方可进入查询页面进行查询。
在查询页面期间,用户所提交的查询语句均会进行审计记录,且仅支持查询语句,不可使用非查询语句。
3. 审核模块
3.1 工单审核
管理员审核用户提交的工单(DDL/DML语句执行申请),管理员可以通过或者驳回用户的工单请求,如果审核通过,由执行人(Yearning中的角色种类之一)来点击执行按钮。
3.2 查询审核
管理员审核用户查询请求。
3.3 权限审核
管理员用户的权限审核
4. 管理模块
4.1 用户管理
创建/修改/删除用户。创建用户时需要指定用户角色(操作人/执行人/管理员等)以及部门等其他信息。
4.2 数据库管理
添加/修改/删除数据源。可以通过数据库地址(本地或公网访问地址)、端口号以及数据库的账号密码来关联不同的数据库,包括:本地的MySQL数据库;部署在公网服务器的MySQL数据库;阿里云、AWS等云平台的MySQL数据库等,都可以添加到Yearning的数据源之中。
关联之后,可以使用Yearning来对他们进行统一的管理。
4.3 权限管理
创建/修改权限组。Yearning中通过权限组的方式来进行权限控制,将不同的用户加入到不同的权限组之中,来赋予不同用户不同的权限。具体参见本文后续的Yearning中的权限设计章节
5. 通知模块
Yearning还支持进行消息推送。在设置中配置消息推送渠道,支持钉钉机器人/邮件;还支持OpenLDAP平台。
6. 内置SQL审核规则
Yearning内置了多种常见场景的SQL审核规则,管理员开启对应的规则后,用户提交的工单(SQL语句)会先经过内置审核规则的过滤,内置规则判定通过后,才会到达人工审核的流程。以此方式可以大大减少人工审核的工作量。
除了使用Yearning提供的内置审核规则之外,100%基于GO语言研发的Yearning也可以通过自定义二次开发(遵循AGPL协议)增加一些符合自己审核策略。
下表展示了Yearning中原生支持的内置的审核规则
规则类型 |
规则描述 |
规则类型 |
规则描述 |
DDL |
强制表必须拥有表注释 |
DML |
Insert最大插入行数上限 |
DDL |
强制表字段必须拥有列注释 |
DML |
允许update/insert 语句使用limit关键字 |
DDL |
强制非timestamp类型字段必须为NOT NULL |
DML |
不允许隐式转换 |
DDL |
强制非text,blob,json,timestamp类型字段必须拥有默认值 |
DML |
检查Insert语句中插入的字段名是否存在 |
DDL |
强制float/double类型变更为decimal类型 |
DML |
强制DML语句必须拥有where条件 |
DDL |
强制自增列初始值为1 |
DML |
禁止DML语句使用Order by子句 |
DDL |
强制主键名称为ID |
DML |
禁止DML语句使用Select子句 |
DDL |
强制主键为自增列 |
DML |
DML最大影响行数 |
DDL |
强制主键必须使用无符号标志unsigned |
Pt-osc |
开启Pt-poc |
DDL |
开启索引名称规范(索引名必须以idx_为开头 |
Pt-osc |
pt-osc可执行文件路径,精确到文件本身。 如: /usr/bin/pt-online-schema-change |
DDL |
开启mysql关键词检查 |
Pt-osc |
当表体积大于该值且开启pt-osc时,该表DDL语句将使用pt-osc进行变更 单位:M |
DDL |
允许跨库表迁移 |
Pt-osc |
--chunk-time 当需要复制的块大于设置的chunk_size时则不复制 |
DDL |
允许删除表 |
Pt-osc |
--no-drop-new-table 如果复制原始表失败,则删除新表 |
DDL |
允许删除库 |
Pt-osc |
--no-drop-old-table 重命名后删除原始表。在原表被成功重命名以让新表取而代之之后,如果没有错误,pt-osc将在默认情况下删除原表。如果有任何错误,pt-osc将保留原始表 |
DDL |
允许主键类型为非int/bigint |
Pt-osc |
--no-check-replication-filters 如果在任何服务器上设置了replication filter 则中止。pt-osc将查找replication filter的服务器选项,如binlog_ignore_db和replicate_do_db。如果它找到任何这样的filter,它将终止并产生一个错误。 |
DDL |
允许索引名为空 |
Pt-osc |
--no-check-alter 解析指定的——alter并尝试警告可能的意外行为。 |
DDL |
允许单个工单提交多条DDL语句 |
Pt-osc |
--no-check-unique-key-change 不检查唯一索引 |
DDL |
允许字段进行类型转换(不同字段之间的转换或长度从长变短。如:int -> bigint,int(50) -> int(20)) |
Pt-osc |
--print 打印OSC执行的SQL语句。 |
DDL |
允许使用after/first |
Pt-osc |
--alter-foreign-keys-method 当pt-osc重命名原始表以让新表取而代之时,外键“跟随”已重命名的表,并且必须更改外键以引用新表。 |
DDL |
允许创建视图 |
Pt-osc |
--set-vars lock_wait_timeout= 锁定等待时间 单位:秒 |
DDL |
允许创建分区表 |
Pt-osc |
--chunk-time 动态调整块的⼤⼩避免每个数据副本花费很长时间执行。 |
DDL |
允许添加bit,enum,set类型字段 |
Pt-osc |
--sleep |
DDL |
create/alter 表或字段时允许的Collate范围。多个请使用逗号进行分割 |
Pt-osc |
--max-lag 复制最大延迟时间.单位:秒 |
DDL |
create/alter 表或字段时允许的Charset范围。多个请使用逗号进行分割 |
Pt-osc |
--check-interval 检查间隔时间。 |
DDL |
建表必须拥有的字段,多个字段请用逗号分隔 |
Pt-osc |
--max-load Threads_connected: 最大线程连接数 |
DDL |
单个索引指定字段上限 |
Pt-osc |
--max-load Threads_running: 最大线程运行数 |
DDL |
单个表最多允许几个索引 |
Pt-osc |
--critical-load Threads_connected 关键线程连接数 |
DDL |
DDL最大影响行数 |
Pt-osc |
--critical-load Threads_running: 关键线程运行数 |
DDL |
char字段最大长度 |
Pt-osc |
--recursion-method 发现副本的首选递归方法。 |
DDL |
表名最大长度限制 |
7. AutoTask自动执行任务
用户可通过该功能设置自动执行任务,在任务配置中设置任务SQL语句的类型(Insert/Update/Delete)、任务的目标数据库、表格以及最大影响行数等条件。当提交的DML语句符合配置的任务条件时,将会自动执行,无需审核人审核。该功能仅限DML语句使用,需要慎重使用!
Yearning中的权限设计
1. 理念
Yearning自2.1.7版本之后采用权限组的方式进行权限授权,权限最低下放至数据源。
Yearning中用户先以角色的形式分为三大类,分别为 提交人/操作人/超级管理员。其中超级管理员角色为可见管理页面角色, 提交人/操作人为非可见管理页面角色。通过角色Yearning在细粒度权限划分之前先将用户分类。使管理类权限不会出现在使用者细粒度权限划分中
可根据每个用户的实际需求配置相应ddl/dml/查询数据源。每一类权限相互独立互不干扰。
2. 权限种类
在Yearning中权限共分为2大类
- 角色权限
- 细粒度权限
角色权限: 提交人/操作人/超级管理员 该权限主要用来划定各用户权限边界并规定功能入口
细粒度权限: DML/DDL/查询的数据源访问权限,查询上级审核人
3. 如何分配权限
角色权限:超级管理员在新建用户时可自行设置对应角色。LDAP用户登录默认第一次登录均为提交人角色。可在登录后由超级管理员修改角色(必须在赋权之前确定好用户的角色)
细粒度权限: 超级管理员建立权限组并将单个或多个权限组赋予用户,使用户继承权限组的细粒度权限。
总结
Yearning是一款比较流行且成熟的开源MySQL SQL审计平台,它的定位是面向中小型企业/组织/个人的轻量级平台。它可以帮助开发者快速的完成SQL语句的语法的审核、检测、执行和回滚等操作。
Yearning自身包含了一套通常适用的审核规范,基本上能满足日常需要,同时规范了日常开发需求所涉及到的SQL变动,在Yearning平台的辅助下,日常的SQL变动也更加贴近SQL使用的规范化、标准化的要求,同时100%基于GO语言研发的Yearning也可以通过自定义二次开发(遵循AGPL协议)增加一些符合自己审核策略,但是它的审核引擎Juno不是开源的。同时基于Vue.js开发的前端平台,提供了SQL语法高亮、自动补全和智能提示、可视化等用户体验较好的交互形式,也为它增色不少。
审核规则这一块的逻辑全部都是在JS中传递和处理的,使得它在面对大规模数据场景时,性能会遇到瓶颈。除此之外,只支持MySQL的限制,也让人觉得多少有点美中不足。