一 关于 Yearninig

Mysql 的 SQL 语句审核平台。

提供查询审计,SQL 审核,SQL 回滚,自定义工作流等多种功能。

后端逻辑采用 Go 语言实现。

前端界面采用 vue.js 框架实现。

官网:http://yearning.io/

使用文档:https://guide.yearning.io/

二 添加 Mysql 库

# 创建database
create database Yearning CHARACTER SET UTF8mb4 COLLATE utf8mb4_general_ci;

三 安装

下载地址:https://github.com/cookieY/Yearning/releases

1 目录结构

  • # README
  • conf.toml
  • docker-compose.yml
  • Dockerfile
  • Yearning

2 步骤

上传、解压压缩包文件,本次下载的压缩文件名为:Yearning-2.3.3.2-linux-amd64.zip

# 将压缩包Yearning-2.3.3.2-linux-amd64.zip上传至linux服务器
# 跳转Yearning目录
cd /opt/Yearning-2.3.3.2/
# 解压
unzip Yearning-2.3.3.2-linux-amd64.zip

2.1 直接启动

  • 修改配置文件:
# 修改配置文件(vim conf.toml)
[Mysql]
# mysql database
Db = "Yearning"
# mysql数据库地址
Host = "127.0.0.1"
# mysql端口号
Port = "3306"
# mysql用户密码
Password = "root"
# mysql用户名
User = "root"

[General] #数据库加解密key,只可更改一次。
SecretKey = "dbcjqheupqjsuwsm"
  • 初始化并启动 Yearning(非首次启动无需初始化):
# 初始化mysql库
./Yearning install
# 启动
./Yearning run

2.2 使用 docker 启动

# 修改docker-compose.yml(vim docker-compose.yml)
version: '3'
services:
yearning:
image: test/yearning:latest
build:
context: .
dockerfile: Dockerfile
environment:
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_ADDR: 127.0.0.1:3306
MYSQL_DB: Yearning
ports:
- 8000:8000
restart: always

# 使用docker启动
docker-compose up
# 若希望后台启动,则加-d
docker-compose up -d

2.3 打开 Yearning

地址:ip:8000

默认用户:admin Yearning_admin

3 关于 SecretKey

SecretKey 是 token/数据库密码加密/解密的 salt。

建议所有用户在初次安装 Yearning 之前将 SecretKey 更改(不更改将存在安全风险)

格式: 大小写字母均可, 长度必须为 16 位 如长度不是 16 位将会导致无法新建数据源

特别注意:

**此 key 仅可在初次安装时更改!之后不可再次更改!如再次更改会导致之前已存放的数据源密码无法解密,最终导致无法获取相关数据源信息
**

四 功能

1 提交员

1.1 首页

1.1.1 修改个人信息

  • 修改邮箱

  • 修改姓名

1.1.2 修改用户密码

1.1.3 查看用户权限

1.1.4 查看统计信息

  • 用户数量、数据源数量、工单数、查询总数
  • 高频库/top 10
  • DDL/DML 次数统计

1.2 我的工单

  • 当前用户提交的工单列表
  • 某个工单的详细信息
    • 工单信息(提交时的具体信息、当前的执行状态)
    • 流程步骤(审批步骤)
    • 流程记录(审批信息)
    • SQL 审核(提交的 SQL 语句、SQL 语句的执行结果)

1.3 工单提交

  • 提交 DDL 类型工单
  • 提交 DML 类型工单

提交工单步骤:

  1. 填写工单基本信息

    选择环境、连接名、库名、审核人、是否备份,以及填写说明后,即可选择进入下一步。

  2. 填写 SQL 语句

    填写 SQL,可美化 SQL,可校验 SQL,校验 SQL 为必要操作,校验通过后才可以提交,若校验不通过,可进行原因查询,直至校验通过。

  3. 确认工单并提交

    确认无误后,即可进行提交,即点击检测语句校测通过后(错误等级为 0),提交工单会变为可点击状态。

1.4 SQL 查询

选择环境、审核人,填写查询说明后,即可进行提交,若管理员开启了查询审核,需要等待审核人进行审核,若未开启,则直接进入查询页面。

查询连接时长由管理员设置,若连接时间过期,则需要重新发起查询申请。

2 操作员

操作员拥有提交员的所有权限,除以上权限外,还有审核、查询记录功能。

2.1 审核

2.1.1 工单

工单处,可对工单进行审核,同样需要先校验 SQL 语句,若校验通过后才可以流转到下个节点,也可以选择驳回。

若为最后一个执行节点,则 SQL 语句校验通过后可以手动执行 SQL 语句。

2.1.2 查询

查看查询连接记录,若开启了查询审核,则可在该处对查询进行审核。

2.2 记录

2.2.1 工单记录

可查询工单的执行记录,以及工单的详细信息。

2.2.2 查询记录

可查看查询的执行记录,以及查询的详细信息,包括查询数据源、数据库、SQL 语句、SQL 执行耗时,以及 SQL 的执行次序。

3 管理员

管理员拥有的权限组中有数据源的读写权限,则也可以发起工单、查询。

若权限组中审核人选择了管理员,则管理员也拥有操作员的审批权限。

3.1 管理

3.1.1 用户

可以新增用户、修改用户密码、给用户分配权限、删除用户、查询用户的详细信息。

其中 admin 用户(默认用户)初始时只有超级管理员角色,可以为 admin 用户配置其他角色组。

角色只有提交人、操作人两种,其中操作人拥有审核、执行权限以及提交人的所有权限,提交人只能提交工单或提交查询。

3.1.2 数据库

可以添加数据库信息。

  1. 保存前可以进行连接测试,连接成功后再进行保存。
  2. 数据源名称需唯一。

3.1.3 权限组

添加权限组,可为每个权限组配置响应的操作权限。

3.1.4 流程模板

为每个环境创建自己的审核流程,第一阶段默认为提交,可以添加审核、执行流程,且最后一阶段只能为执行。

  1. 中间审核人最多支持 5 层。
  2. 仅允许拥有一个执行阶段,即最后一个阶段只能为执行阶段。
  3. 如对现有流程进行修改,需将目前该流程下所有工单流转完成,否则可能导致流程错乱。
  4. 在使用之前需要先配置好流程模板,否则提交人在提交工单时无法选择数据库。

3.1.5 审核规则

可以开启 SQL 语句的审核规则,Yearning 中已内置不少规则。

3.1.6 自动任务

可以开启的定时任务,即开启定时任务后,提交 DML 工单时若选择了定时执行时间,则在到达约定时间时可以自行执行。

仅测试,若开启了定时任务,则 DML 工单将不在途径审核流程,在提交员提交后,操作员无法审核,且到达约定时间时任务被自行执行,故该功能目前暂无实用性。

3.1.7 设置

可以进行 LDAP 设置,登录支持 LDAP 登录。

可以设置消息推送,支持 webhook 推送、email 推送。

还拥有进阶设置:

  1. 查询最大 limit 限制,防止大量全表查询。
  2. 自定义环境。
  3. 排除数据库,即设置了排除的数据库(mysql 的 dabatase),则该 database 将不允许被连接查询、执行 SQL 语句。
  4. 脱敏字段设置(根据字段名设置),查询时脱敏字段值会被隐藏。
  5. 设置是否开启查询审核、查询导出,以及设置查询连接时长,超过该时长后需要重新提交查询。
  6. 设置是否允许注册,若开启后,用户可自行注册,而不用超级管理员进行用户创建。
  7. 删除指定日期前的工单记录、查询记录。

3.2 公告

可以实时发布全员可见的公告(markdown 格式)

五 建议

  1. 这里 Yearning 官方建议读写库做分离,保证不影响线上环境的运行。

  2. 建议为每个项目分配对应的数据库用户,且该用户只有该项目所需要连接的 database 的权限,因为做权限管理时,将数据源与权限组做关联,则该权限组拥有该数据源配置的用户所拥有的所有 db 的权限。

  3. 针对读写权限分离,这里有两个方案:

    1. 分别创建拥有读写操作权限的数据库用户与拥有只读权限的数据库用户,添加数据源时添加两个数据源(读写、只读)
    2. 创建一个拥有读写操作权限的数据库用户,在添加权限组时,区分 DDL、DML、DQL 权限,这里建议为每个项目创建至少三个权限组,将 DDL、DML、DQL 三个权限做拆分,三个权限组分别拥有不同的权限,即 DDL 权限组、DML 权限组、DQL 权限组,若 DDL 不通过该流程,则至少创建两个权限组。