SQL审核平台
以往我们一般是采用云哪儿网开源的inception或集成的平台来使用,如SQLAdvisior,因鉴于inception已闭源。最新的archery采用goinception,Archery是的分支项目,定位于SQL审核查询平台,旨在提升DBA的工作效率,支持主流数据库的SQL上线和查询,同时支持丰富的MySQL运维功能,所有功能都兼容手机端操作
功能清单
查询 | 审核 | 执行 | 备份 | 数据字典 | 慢日志 | 会话管理 | 账号管理 | 参数管理 | 数据归档 | |
---|---|---|---|---|---|---|---|---|---|---|
MySQL | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
MsSQL | √ | × | √ | × | × | × | × | × | × | × |
Redis | √ | × | √ | × | × | × | × | × | × | × |
PgSQL | √ | × | √ | × | × | × | × | × | × | × |
Oracle | √ | × | √ | × | × | × | × | × | × | × |
MongoDB | √ | × | × | × | × | × |
SQL审核
MySQL实例
基于Inception/goInception实现,集成审核、执行、备份
非MySQL实例
支持提交和执行工单,依托工作流实现流程化管理
审核执行分离
审批和执行可以分配给不同的用户进行操作
SQL工单自动审批、高危语句驳回
- 支持正则判断工单是否需要人工审批,开启自动审批后,不在正则范围内的SQL语句无需审批,系统自动审核
- 自主控制SQL是否自动驳回,可自主配置对inception审核驳回的场景,支持警告驳回和异常驳回
快速上线其他实例
在工单详情可快速提交相同SQL内容到其他实例,可适用于test>beta>ga等多套环境维护的需求
定时执行
工单审核通过后可以选择定时执行或者立即执行
SQL查询
多类型数据库支持
- MySQL 表级授权、脱敏查询
- MsSQL 库级授权、脱敏查询
- Redis 库级授权
- PostgreSQL 库级授权
- Oracle 库级授权
授权管理
- 工作流控制SQL查询授权,支持库表级别的权限限制,以及授权时间,查询结果集的限制
- 支持部分语句的动态查询脱敏(有限的功能)
- 支持前台管理用户权限,对用户权限进行修改和维护
- 支持查询导出、查询日志审计
页面体验¶
- 库、表、字段补全提示
- 多结果级展示
- 表结构查看
SQL优化
慢日志管理
基于PT收集慢日志,需要单独部署
SQL语句优化
基于SQLAdvisor|SOAR|SQLTuning的全方位优化建议
实例管理
会话管理
- 支持查看和批量终止会话
- 支持查看事物、锁信息
数据库管理
管理实例数据库,支持添加
账号管理
管理实例账号,支持增加、授权、删除
参数配置
可修改实例动态参数并记录修改历史
工具插件
PTArchiver
支持使用pt-archiver归档MySQL数据,支持直接添加配置和由用户申请归档
Binlog2SQL
将Binlog2SQL模块可视化,从MySQL binlog解析出你要的SQL
SchemaSync
对比不同数据库的Schema信息,输出修改语句和回滚语句,SchemaSync不仅限于表结构,它可以处理的对象还有:视图、事件、存储过程、函数、触发器、外键
资源(项目)组
支持自定义资源(项目)组,管理资源组和关联对象,资源组成员之间审批流程、实例配置、消息通知等资源隔离
权限(角色)组
权限可以分配给用户,也可以分配给权限组,支持对大多数操作进行限制,独立控制用户的审核、执行等操作权限
工作流
工作流审批流程支持多层级多用户,并且隔离资源组,不同资源组不同的工单类型可以配置不同的审批层级
配置管理
系统配置项、工作流审批流程可在前端页面动态修改,无需重启服务实时生效
消息通知
支持钉钉、企业微信、邮件通知,及时知晓工单状态变化
可视化
使用pyecharts实现工单、查询维度的可视化统计
功能导图
部署
启动
#git clone https://github.com/hhyo/Archery.git
[root@dba docker-compose]# pwd
/data/Archery/src/docker-compose
[root@dba docker-compose]# ll
total 16
drwxr-xr-x 5 root root 4096 Aug 29 18:46 archery
-rw-r--r-- 1 root root 1447 Aug 29 17:10 docker-compose.yml
drwxr-xr-x 2 root root 4096 Aug 29 17:10 inception
drwxr-xr-x 3 root root 4096 Aug 29 20:26 mysql
#启动
docker-compose -f docker-compose.yml up -d
[root@dba docker-compose]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9530cc53ca8 hanchuanchuan/goinception "/usr/local/bin/dumb…" 2 hours ago Up 2 hours 4000/tcp goinception
769075bd914e mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 4 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
c4ff9b9b11cc hhyo/inception "/bin/sh -c 'nohup /…" 2 hours ago Up 2 hours 6669/tcp inception
c8949256236a redis:5 "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp redis
7ea1a1ab865f hhyo/archery:1.7.12 "dockerize -wait tcp…" 2 hours ago Up 5 minutes 0.0.0.0:9123->9123/tcp archery
fa7fd94fa862 portainer/portainer "/portainer" 5 days ago Up 5 days 0.0.0.0:8060->9000/tcp portainer
542abc6074be 276a1d8eca40
#表结构初始化
[root@dba ~]# docker exec -ti archery /bin/bash
[root@7ea1a1ab865f archery]# cd /opt/archery
[root@7ea1a1ab865f archery]# source /opt/venv4archery/bin/activate
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py makemigrations sql
Migrations for 'sql':
sql/migrations/0001_initial.py
- Create model SlowQuery
- Create model SlowQueryHistory
- Create model ArchiveConfig
- Create model CloudAccessKey
-.............................
- Create model InstanceAccount
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, django_q, sessions, sql
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
...............................
#数据初始化
python3 manage.py dbshell<sql/fixtures/auth_group.sql
python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql
#创建管理用户
(venv4archery) [root@7ea1a1ab865f archery]# python3 manage.py createsuperuser
用户名: andyxi
电子邮件地址: 13549858@qq.com
Password:
Password (again):
Superuser created successfully.
#宿主机中重启服务
[root@dba ~]# docker restart archery
archery
#日志查看和问题排查
[root@dba ~]# docker logs archery -f --tail=10
logs/archery.log收集所有的静态文件到STATIC_ROOT
启动Django Q cluster
启动服务
[2020-08-29 20:42:52 +0800] [26] [INFO] Starting gunicorn 20.0.4
[2020-08-29 20:42:52 +0800] [26] [INFO] Listening at: http://127.0.0.1:8888 (26)
[2020-08-29 20:42:52 +0800] [26] [INFO] Using worker: gevent
[2020-08-29 20:42:52 +0800] [29] [INFO] Booting worker with pid: 29
[2020-08-29 20:42:52 +0800] [30] [INFO] Booting worker with pid: 30
[2020-08-29 20:42:52 +0800] [31] [INFO] Booting worker with pid: 31
[2020-08-29 20:42:52 +0800] [32] [INFO] Booting worker with pid: 32
访问
http://127.0.0.1:9123/(我的是cloud外网)
修改配置项
系统配置
Inception配置
INCEPTION
是否启用Inception替换goInception,开启后需要配置Inception的连接信息,备份库的配置地址可复用,将会使用Inception来替代goInception对MySQL进行审核和执行
GO_INCEPTION_HOST
goInception的连接地址,用于MySQL审核执行,docker-compose启动的请配置为容器名,比如goinception,参考文档:https://github.com/hanchuanchuan/goInception
GO_INCEPTION_PORT
goInception的连接端口,默认4000
INCEPTION_HOST
Inception连接HOST,用于SQL查询语法解析,docker-compose启动的请配置为容器名,比如inception,参考文档 :https://github.com/hhyo/inception
INCEPTION_PORT
Inception连接端口,即Inception配置文件inc.cnf内的port
REMOTE_BACKUP_HOST
goInception/Inception的备份库链接HOST,用于页面展示回滚语句 - goInception和配置文件config.toml内的backup_host保持一致 - Inception和配置文件inc.cnf内的inception_remote_backup_host保持一致,具体说明可参考Inception 备份功能说明
REMOTE_BACKUP_PORT
goInception/Inception的备份库链接端口 - goInception和配置文件config.toml内的backup_port保持一致 - Inception和配置文件inc.cnf内的inception_remote_backup_port保持一致
REMOTE_BACKUP_USER
goInception/Inception的备份库链接用户 - goInception和配置文件config.toml内的backup_user保持一致 - Inception和配置文件inc.cnf内的inception_remote_system_user保持一致
-- 建议赋予用户权限 GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'
REMOTE_BACKUP_PASSWORD
goInception/Inception的备份库链接用户 - goInception和配置文件config.toml内的backup_password保持一致 - Inception和配置文件inc.cnf内的inception_remote_system_password保持一致
需要注意的是,该配置信息,仅仅用于archery从备份库查询回滚语句使用,该配置信息不会被goInception服务使用,goInception连接备份库使用的数据库连接信息应在其自身的config.toml中配置。
SQL上线
CRITICAL_DDL_REGEX
高危SQL语句正则判断条件,用于控制禁止提交的语句,匹配的语句会禁止提交,例如^truncate|^rename|^delete
则会禁止提交清空表、修改表名、删除操作的SQL语句,前端展现如下
AUTO_REVIEW_WRONG
用于控制自动驳回的等级,驳回的工单不会通知审核人,会系统直接审核不通过。1表示SQL上线审核出现警告信息就驳回,2和空表示出现错误才驳回,其他设置表示不驳回,审核规则请参考Inception所支持的参数变量,前端展现如下
ENABLE_BACKUP_SWITCH
是否开启备份选项,未开启时提交SQL工单,将不会显示是否备份选择项,系统会强制备份
AUTO_REVIEW
是否开启SQL上线自动审批,开启自动审批后,当提交的SQL语句不匹配AUTO_REVIEW_REGEX规则,并且update语句的总影响行数低于MAX_UPDATE_ROWS时,系统则会自动审批通过,前端展现如下
AUTO_REVIEW_REGEX
正则条件,用于过滤部分需要人工审核的语句,开启自动审批后,当工单中存在匹配的语句时则需要人工审批,例如^create
则表示建表语句需要人工审批
MAX_UPDATE_ROWS
自动审批允许工单最大更新行数,系统会遍历工单内所有update语句,使用explain预估影响行数,当影响函数超过该值时则工单需要人工审批
MANNUAL
是否开启SQL上线手工执行确认,开启后在审核通过的工单详情中会出现手工确认按钮,可以仅仅依靠Archery走工单流程,DBA线下手动执行语句并且确认执行结束
SQL查询
QUERY_CHECK
相关issues: https://github.com/hhyo/Archery/issues/145
是否开启SQL查询脱敏的Inception检测,平台的SQL查询功能依靠Inception的语法树打印来解析查询语句中包含的库、表、字段信息,从而进行数据脱敏
- 开启QUERY_CHECK后,如果遇到Inception无法解析的语句,则会直接抛出错误信息,禁止查询
- 关闭QUERY_CHECK后,如果遇到Inception无法解析的语句,系统不再进行数据脱敏,会有数据泄露的风险,请谨慎选择
- 动态脱敏不支持的语法:嵌套子查询、部分非单字段函数,如
concat(phone,',')、max(id+num)
DATA_MASKING
是否开启动态脱敏,会利用inception语法树打印,结合后台设置的脱敏字段和脱敏规则,对查询数据进行脱敏。遇到无法解析的语句是报错还是返回未脱敏的数据同样由QUERY_CHECK参数控制 * 正常脱敏: * 开启QUERY_CHECK后执行不支持语句
* 关闭QUERY_CHECK后执行不支持语句
MAX_EXECUTION_TIME
在线查询超时时间阈值,单位秒,默认60,超时的语句会被终止并返回提示信息,目前仅支持MySQL
ADMIN_QUERY_LIMIT
超级管理员的查询限制行数,超级管理员查询数据时不做权限校验,仅由该参数设置最大行数
SQL优化
SQLADVISOR_PATH
SQLAdvisor的可执行文件路径,路径需要完整,docker镜像内已经集成 * 1.4.0以前的docker版本配置成/opt/sqladvisor
* 1.4.0以以后的docker版本配置成/opt/archery/src/plugins/sqladvisor
SOAR_PATH
SOAR的可执行文件路径,路径需要完整,docker镜像内已经集成,docker镜像内已经集成 * 1.4.0以前的docker版本配置成/opt/soar
* 1.4.0以以后的docker版本配置成/opt/archery/src/plugins/soar
SOAR_TEST_DSN
参考SOAR文档:命令行参数配置DSN
通知
ARCHERY_BASE_URL
系统首页地址, 用于钉钉和邮件发送链接使用,如https://archery.xx.com/
DDL_NOTIFY_AUTH_GROUP
DDL工单通知权限组名,对应权限组管理页面的名称,为空则不通知,仅DDL工单执行完毕时会进行通知
MAIL
是否开启邮件通知
MAIL_SSL
是否使用SSL连接
MAIL_SMTP_SERVER
邮件SMTP服务地址,可参考各邮箱对应的设置帮助,例如QQ邮箱的如何使用IMAP服务?
MAIL_SMTP_PORT
邮件SMTP服务端口
MAIL_SMTP_USER
邮件用户名
MAIL_SMTP_PASSWORD
邮件密码,一般为生成的授权码
DING
是否开启钉钉通知,开启后需要配置资源组的机器人webhook连接,资源组内的所有通知都会通过机器人推送
DING_TO_PERSON
是否开启钉钉个人通知,使用微应用+工作通知实现
企业微信
参考企业微信接入开发文档,配置成功后消息会通过企业微信通知
其他配置
阿里云认证信息
实例关联RDS实例ID后,会调用RDS接口获取慢日志、进程、表空间,其中进程和表空间的获取需要管理权限的key
INDEX_PATH_URL
系统首页路径,默认是SQL工单页面
BINLOG2SQL
BINLOG2SQL调用路径,用于实现binlog2sql解析的功能,docker镜像内已经集成 * docker部署请配置为/opt/archery/src/plugins/binlog2sql/binlog2sql.py
DEFAULT_AUTH_GROUP
默认权限组名,新用户首次登录自动关联, 老用户请手动配置
DEFAULT_RESOURCE_GROUP
默认资源组名,新用户首次登录自动关联, 老用户请手动配置
LOCK_TIME_THRESHOLD
账户登录失败锁定时间(秒)
LOCK_CNT_THRESHOLD
账户登录失败几次锁账户
SIGN_UP_ENABLED
是否开启注册功能,关闭后将无法自主注册用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示