基本概念
數據庫審計(簡稱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的限制,也讓人覺得多少有點美中不足。
參考鏈接
https://github.com/cookieY/Yearning
https://guide.yearning.io/
轉至:https://developer.aliyun.com/article/790865