sql审核平台Archery的安装和使用
# sql审核平台Archery的安装和使用
本文介绍sql审核平台Archery的安装和使用。支持对不规范的sql给出改进措施,在线查询数据库数据、sql审核、回滚、用户的权限管理等操作。使用Archery平台可以使得我们所有的数据库操作都有记录,并且可以很方便地sql审核和回滚。Archery除了支持mysql,也支持其他类型的数据库。
官方教程:https://archerydms.com/
github:https://github.com/hhyo/Archery
假定mysql和redis已经安装完成。
因为系统中之前已经有运行redis和mysql服务,所以不想通过docker-compose.yml再创建额外的mysql和redis服务,所以需要对相关配置文件做一些调整,详见后续的配置说明。
# 下载程序
- 解压程序压缩包
可前往[官方网站](https://github.com/hhyo/archery/releases/)下载最新的安装包。
tar -zxvf ./Archery-1.8.1.tar.gz -C ~/workspace/project/wangshibiao/docker-compose-file/
- 进入程序的docker启动根目录 cd ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose
wangshibiao@bogon ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ± ls -l
total 8
drwxr-xr-x 6 wangshibiao staff 192 3 27 2021 archery
-rw-r--r-- 1 wangshibiao staff 1446 3 27 2021 docker-compose.yml
drwxr-xr-x 4 wangshibiao staff 128 3 27 2021 inception
drwxr-xr-x 3 wangshibiao staff 96 3 27 2021 mysql
wangshibiao@bogon ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ±
# 修改archery服务的配置文件
配置文件路径:vi ./archery/settings.py
# 修改mysql配置
修改mysql的用户名、密码、host、port、数据库名。
# 该项目本身的mysql数据库地址
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'archery',
'USER': 'root',
'PASSWORD': 'buzhidao',
'HOST': '10.31.0.100',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4'
},
'TEST': {
'NAME': 'test_archery',
'CHARSET': 'utf8mb4',
},
}
}
# 修改redis配置
# 缓存配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.31.0.100:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": ""
}
},
"dingding": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.31.0.100:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": ""
}
}
}
# 修改goinception配置
vi ./inception/config.toml
backup_host = "10.31.0.100"
backup_port = 3306
backup_user = "root"
backup_password = "buzhidao"
goInception是一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具, 通过对执行SQL的语法解析,返回基于自定义规则的审核结果,并提供执行和备份及生成回滚语句的功能。
若想进一步了解goInception,请前往goInception的官网 (opens new window)。
# 修改inception配置
vi ./inception/inc.cnf
inception_remote_system_password=buzhidao
inception_remote_system_user=root
inception_remote_backup_port=3306
inception_remote_backup_host=10.31.0.100
TODO: 应该没必要做该项配置,后续验证。因为系统默认启用了goinception,那么就不会使用inception配置。
# 修改docker-compose.yml配置
- 删除docker-compose.yml中的mysql和redis容器配置
- 修改archery的mysql和redis连接配置
将entrypoint: "dockerize -wait tcp://mysql:3306 -wait tcp://redis:6379 -timeout 60s /opt/archery/src/docker/startup.sh"
中的mysql和redis连接由主机名改为具体IP
示例配置如下:
wangshibiao@bogon ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ± cat ./docker-compose.yml
version: '3'
services:
inception:
image: hhyo/inception
container_name: inception
restart: always
expose:
- "6669"
volumes:
- "./inception/inc.cnf:/etc/inc.cnf"
goinception:
image: hanchuanchuan/goinception
container_name: goinception
restart: always
expose:
- "4000"
volumes:
- "./inception/config.toml:/etc/config.toml"
archery:
image: hhyo/archery:1.8.1
container_name: archery
restart: always
ports:
- "9123:9123"
volumes:
- "./archery/settings.py:/opt/archery/archery/settings.py"
- "./archery/soar.yaml:/etc/soar.yaml"
- "./archery/docs.md:/opt/archery/docs/docs.md"
- "./archery/downlo-compoads:/opt/archery/downloads"
- "./archery/sql/migrations:/opt/archery/sql/migrations"
- "./archery/logs:/opt/archery/logs"
entrypoint: "dockerize -wait tcp://10.31.0.100:3306 -wait tcp://10.31.0.100:6379 -timeout 60s /opt/archery/src/docker/startup.sh"
environment:
NGINX_PORT: 9123
wangshibiao@bogon ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ±
# 创建数据库
在mysql中创建数据库archery。
create database archery default CHARSET utf8mb4 collate utf8mb4_unicode_ci;
# 初始化数据并启动服务
如下内容摘自[官方文档](https://archerydms.com/installation/docker/#_2)。
进入docker-compose目录,按顺序执行如下命令
# 启动
docker-compose -f docker-compose.yml up -d
# 表结构初始化
docker exec -ti archery /bin/bash
cd /opt/archery
source /opt/venv4archery/bin/activate
python3 manage.py makemigrations sql
python3 manage.py migrate
# 数据初始化
python3 manage.py dbshell<sql/fixtures/auth_group.sql
python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql
# 创建管理用户
python3 manage.py createsuperuser
# 重启
docker-compose restart
# 日志查看和问题排查
docker logs archery -f --tail=50
在步骤创建管理用户
中会提示用户创建管理员的账号、密码和邮箱。
完整的操作过程如下:
wangshibiao@bogon ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ± docker-compose -f docker-compose.yml up -d
Creating network "docker-compose_default" with the default driver
Creating inception ... done
Creating goinception ... done
Creating archery ... done
wangshibiao@localhost ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ± docker exec -ti archery /bin/bash
[root@fe5538c67efd archery]# cd /opt/archery
[root@fe5538c67efd archery]# source /opt/venv4archery/bin/activate
(venv4archery) [root@fe5538c67efd archery]# python3 manage.py makemigrations sql
No changes detected in app 'sql'
(venv4archery) [root@fe5538c67efd 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
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sql.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying django_q.0001_initial... OK
Applying django_q.0002_auto_20150630_1624... OK
Applying django_q.0003_auto_20150708_1326... OK
Applying django_q.0004_auto_20150710_1043... OK
Applying django_q.0005_auto_20150718_1506... OK
Applying django_q.0006_auto_20150805_1817... OK
Applying django_q.0007_ormq... OK
Applying django_q.0008_auto_20160224_1026... OK
Applying django_q.0009_auto_20171009_0915... OK
Applying django_q.0010_auto_20200610_0856... OK
Applying django_q.0011_auto_20200628_1055... OK
Applying django_q.0012_auto_20200702_1608... OK
Applying django_q.0013_task_attempt_count... OK
Applying sessions.0001_initial... OK
(venv4archery) [root@fe5538c67efd archery]# python3 manage.py dbshell<sql/fixtures/auth_group.sql
Warning: Using a password on the command line interface can be insecure.
(venv4archery) [root@fe5538c67efd archery]# python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql
Warning: Using a password on the command line interface can be insecure.
(venv4archery) [root@fe5538c67efd archery]# python3 manage.py createsuperuser
用户名: archery
电子邮件地址: 645102170@qq.com
Password:
Password (again):
密码跟 用户名 太相似了。
密码长度太短。密码必须包含至少 9 个字符。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
(venv4archery) [root@fe5538c67efd archery]# exit
exit
wangshibiao@localhost ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ± docker-compose restart
Restarting archery ... done
Restarting goinception ... done
Restarting inception ... done
wangshibiao@localhost ~/workspace/project/wangshibiao/docker-compose-file/Archery-1.8.1/src/docker-compose master ±
# 访问
浏览器请求http://127.0.0.1:9123/。
账号和密码即为上一步骤中由您自定义的账号和密码。
# 使用
# 1. 创建用户
给用户关联权限组: 系统默认提供了5个权限组。当然也可以根据需要灵活自定义。
# 2. 创建实例
若mysql运行在本地,那么指定的实例连接时,建议使用具体的IP不要使用127.0.0.1,否则点击实例操作列中的“测试”按钮可能会提示连接失败。
关联实例标签:通过支持上线、支持查询的标签来控制实例是否在SQL上线/查询中显示,要使用上线和查询的实例需要关联标签。
# 3. 创建资源组
关联用户和实例。
用户必须关联资源组才能访问资源组内的实例资源
# 4. sql上线
要开启该功能,必须要配置下"系统配置项",包括goInception配置
、工单审核流配置
。
- goInception配置
按页面导航"系统管理 -> 配置项管理 -> 系统设置 -> goInception配置",进入到配置页面。
因为archery服务可以直接通过服务名
goinception来访问goInception服务,所以配置如下:
GO_INCEPTION_HOST: goinception
GO_INCEPTION_PORT: 4000
BACKUP_HOST: 10.31.0.100
BACKUP_PORT: 3306
BACKUP_USER: root
BACKUP_PASSWORD: buzhidao
- 回滚
若不配置该项信息,那么查询回滚语句会失败。
备份库的信息(BACKUP_HOST、BACKUP_PORT、BACKUP_USER、BACKUP_PASSWORD)仅用于平台获取回滚语句,需要和审核工具自身的配置保持一致,此处配置变更不会修改审核工具自身的配置。
该项配置要和配置文件./inception/config.toml
中的配置保持一致,前文中已经提到如何配置。
TODO: 后续尝试配置为额外的一个专门用户备份的数据库,和主数据库分开。也需要事先创建一个数据库archery。
- 工单审核流配置
如不做该项配置,那么提交sql审核时会提示完成工单审核配置。