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實現工單、查詢維度的可視化統計

功能導圖

Archery

部署

啟動

#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語句,前端展現如下 -w1089

AUTO_REVIEW_WRONG

用於控制自動駁回的等級,駁回的工單不會通知審核人,會系統直接審核不通過。1表示SQL上線審核出現警告信息就駁回,2和空表示出現錯誤才駁回,其他設置表示不駁回,審核規則請參考Inception所支持的參數變量,前端展現如下 -w1129

ENABLE_BACKUP_SWITCH

是否開啟備份選項,未開啟時提交SQL工單,將不會顯示是否備份選擇項,系統會強制備份

AUTO_REVIEW

是否開啟SQL上線自動審批,開啟自動審批后,當提交的SQL語句不匹配AUTO_REVIEW_REGEX規則,並且update語句的總影響行數低於MAX_UPDATE_ROWS時,系統則會自動審批通過,前端展現如下 -w1138

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參數控制 * 正常脫敏: -w1331* 開啟QUERY_CHECK后執行不支持語句 -w1338* 關閉QUERY_CHECK后執行不支持語句 -w1329

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工單執行完畢時會進行通知 -w1311

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

是否開啟注冊功能,關閉后將無法自主注冊用戶


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM