MySQL審計插件安裝使用說明文檔
目的
為了便於開發人員和DBA安裝和使用MySQL審計插件,並對審計的使用和審計粒度有更全面的理解。本文對審計插件的設計思想、審計粒度、審計配置說明、安裝使用、其他內容進行詳細的描述。一方面便於後續的維護和開發,另一方面對於使用提供便利的查詢。
設計思想 www.2cto.com
MySQL的審計接口為開發審計插件提供了有利的條件,基於MySQL審計接口,參考General log設計思想,將審計插件的審計類型定義了:FILE和TABLE兩種類型,用於將審計的內容分別寫入日志文件或數據庫表。此外,對審計的粒度進行劃分,不僅根據操作命令的類型進行劃分,並對Query命令類型進行進一步的細化分,將DDL、DML、DCL三種類型不同SQL語句類型進行劃分;對特定的用戶進行審計,僅對指定的用戶審計,結合審計的粒度實現對用戶行為的審計;對特定的對象(數據庫、數據表)進行審計,目前僅給出配置,源碼中暫時沒有實現。
此外,審計的粒度采用按位標示,並通過按位覆蓋可以進行自定義的審計粒度。
審計粒度
審計插件將審計的粒度細化到具體的SQL語句,主要包括:create、drop、alter、ddl(包括create、drop、alter)、insert、delete、update、modify(包括insert、delete、update、replace)、select、dml(包括insert、delete、update、select)、grant、revoke、dcl(包括grant、revoke)、set、cmd(包括ddl、dml、dcl、set)、connect、quit、connection(包括connect、quit)、server(包括修改server相關的命令操作,如init db、sleep等操作)、full(包括以上所有操作)、all(包括所有操作,包括預留的所有的審計粒度的擴展)、none(不進行審計),這些粒度在配置文件中的以audit_為前綴,值為1/0(或on/off)。為了更精確的控制某些命令,提供audit_ops參數,該參數的值是整數,通過整數的二進制位來控制具體的審計粒度。
具體的審計粒度對應整數的二進制位如下所示:
粒度
位值
AUDIT_ALL
(~AUDIT_NONE)
AUDIT_NONE
(ulonglong)0
AUDIT_CREATE
(ulonglong)1
AUDIT_ALTER
(AUDIT_CREATE << 1)
AUDIT_DROP
(AUDIT_CREATE << 2)
AUDIT_DDL
(AUDIT_CREATE | AUDIT_ALTER | AUDIT_DROP)
AUDIT_INSERT www.2cto.com
(AUDIT_CREATE << 3)
AUDIT_UPDATE
(AUDIT_CREATE << 4)
AUDIT_REPLACE
(AUDIT_CREATE << 5)
AUDIT_DELETE
(AUDIT_CREATE << 6)
AUDIT_MODIFY
(AUDIT_INSERT | AUDIT_UPDATE | AUDIT_DELETE | AUDIT_REPLACE)
AUDIT_SELECT
(AUDIT_CREATE << 7)
AUDIT_DML
(AUDIT_MODIFY | AUDIT_SELECT)
AUDIT_GRANT
(AUDIT_CREATE << 8)
AUDIT_REVOKE
(AUDIT_CREATE << 9)
AUDIT_DCL
(AUDIT_GRANT | AUDIT_REVOKE)
AUDIT_SET
(AUDIT_CREATE << 10)
AUDIT_CMD
(AUDIT_DDL | AUDIT_DML | AUDIT_DCL | AUDIT_SET)
AUDIT_CONNECT
(AUDIT_CREATE << 11)
AUDIT_QUIT
(AUDIT_CREATE << 12)
AUDIT_CHANGE_USER
(AUDIT_CREATE << 13)
AUDIT_CONNECTION
(AUDIT_CONNECT | AUDIT_QUIT | AUDIT_CHANGE_USER)
AUDIT_FULL
(AUDIT_CMD | AUDIT_CONNECTION)
AUDIT_SLEEP
(AUDIT_CREATE << 16)
AUDIT_INIT_DB
(AUDIT_CREATE << 17)
AUDIT_FIELD_LIST
(AUDIT_CREATE << 18)
AUDIT_REFRESH
(AUDIT_CREATE << 19)
AUDIT_SHUTDOWN
(AUDIT_CREATE << 20)
AUDIT_STATISTICS
(AUDIT_CREATE << 21)
AUDIT_PROCESSLIST
(AUDIT_CREATE << 22)
AUDIT_KILL
(AUDIT_CREATE << 23)
AUDIT_DEBUG
(AUDIT_CREATE << 24)
AUDIT_PING
(AUDIT_CREATE << 25)
AUDIT_TIME
(AUDIT_CREATE << 26)
AUDIT_DELAY_INSERT
(AUDIT_CREATE << 27)
AUDIT_BINLOG_DUMP
(AUDIT_CREATE << 28)
AUDIT_TABLE_DUMP
(AUDIT_CREATE << 29)
AUDIT_CONNECT_OUT
(AUDIT_CREATE << 30)
AUDIT_REGISTER_SLAVE
(AUDIT_CREATE << 31)
AUDIT_PREPARE
(AUDIT_CREATE << 32)
AUDIT_EXECUTE
(AUDIT_CREATE << 33)
AUDIT_LONG_DATA
(AUDIT_CREATE << 34)
AUDIT_CLOSE_STMT
(AUDIT_CREATE << 35) www.2cto.com
AUDIT_RESET_STMT
(AUDIT_CREATE << 36)
AUDIT_SET_OPTION
(AUDIT_CREATE << 37)
AUDIT_FETCH
(AUDIT_CREATE << 38)
AUDIT_DAEMON
(AUDIT_CREATE << 39)
AUDIT_ERROR
(AUDIT_CREATE << 40)
AUDIT_SERVER
(~AUDIT_FULL)
以上定義中,預留了很多位,用於粒度的深化。audit_ops的指定有一定的風險,需要進行計算,不建議直接控制。
審計配置說明
為了審計插件的獨立性,對審計進行單獨配置文件的控制,從而不影響數據庫server的配置。此外,審計的配置與審計粒度、審計用戶、審計文件地址、審計文件名、審計文件大小、審計類型有關。
審計用戶格式為“,”分割的用戶名列表;審計文件地址在linux下必須為mysql用戶名和用戶組,且mysql至少有W訪問權限,如果指定審計文件大小,則需要有X權限;
審計文件名默認為mysql-audit,並且根據是否設置審計文件大小來創建文件。如果設置審計文件的大小,那麼審計文件以日期為文件夾,以文件編號為後綴,且文件達到指定文件大小後,重新創建文件且文件編號遞增。如:2012-6-20/mysql-audit.000000,如果未設置文件大小,則文件名以當前日期為後綴,如:mysql-audit. 2012-6-20;
審計文件大小格式為整數,或者整數加上單位,單位包括K、M、G。為了便於查看,不建議將該值設置的過大; www.2cto.com
審計類型包括FILE、TABLE兩種。目前僅FILE有效。
此外,配置文件支持動態修改並生效的功能。審計配置文件修改後,將會重新加載配置選項。但鑒於性能問題,不建議頻繁對配置文件進行修改。
安裝使用
1 源碼安裝
針對不同的MySQL源碼和不同操作系統,建議使用源碼進行編譯安裝。該插件基於Linux 64位操作系統、MySQL 5.5.15/5.5.20源碼進行編譯和測試通過,並提供二進制動態庫供二進制安裝,具體二進制安裝見下一節內容。
1.1 源碼獲取
1)審計插件源碼
審計插件源碼可以通過github獲取最新版本。
github地址為:https://github.com/HengWang/mysql-audit。
github clone https://github.com/HengWang/mysql-audit
2)MySQL源碼
MySQL源碼可以從官網下載,本文推薦使用Percona Server 5.5版本。推薦理由是Percona Server針對MySQL源碼基礎之上,進行了改進,尤其是性能方面和參數選項方面。
1.2 拷貝插件源碼
1)解壓數據庫源碼
tar -xzf Percona-Server-<VERSION>.tar.gz
2)拷貝插件到源碼
cp -rf mysql-audit/ Percona-Server-<VERSION>/plugin/
將插件源碼拷貝到mysql數據庫源碼的plugin文件夾下。
1.3、編譯數據庫源碼
根據編譯參數,對數據庫源碼進行編譯,並安裝。
www.2cto.com
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
make
make install
安裝完成後,在MYSQL_HOME(安裝路徑,文中設置為/usr/local/mysql)的lib/plugin/下面,會有audit.so和audit.cnf文件。
1.4 設置審計參數
根據審計需求,修改審計配置文件audit.cnf,對審計的選項參數、審計粒度進行設置。配置文件中對各個審計參數的功能進行了描述,可根據具體的需求設置。
1.5 創建審計路徑
根據配置文件中設置的audit_dir的路徑,創建審計文件夾。審計文件夾必須是mysql可操作的文件夾,如果指定了審計文件大小,指定的審計文件夾對mysql必須有xw權限。
1.6 創建審計數據表
啟動MySQL數據庫,使用mysql客戶端登陸數據庫,執行sql腳本audit.sql,創建mysql.audit表,用於存儲審計內容。
1.7 安裝審計插件
啟動MySQL數據庫,使用mysql客戶端登陸數據庫後,執行安裝插件命令。如下所示:
install plugin audit soname ‘audit.so’;
安裝完成後,會在指定審計文件夾下,生成<FILENAME>.<DATE>文件或<DATE>/<FILENAME>.000000。如果文件不存在,表示安裝失敗。
2 二進制安裝
二進制動態庫目前僅提供基於Linux 64位操作系統、MySQL 5.5.15/5.5.20源碼進行編譯的審計插件動態庫。 www.2cto.com
在mysql-audit/script文件夾下,有對應的二進制庫;mysql-audit/etc文件夾下,有配置文件。配置文件audit.cnf拷貝到MYSQL_HOME/lib/plugin/下,二進制庫拷貝到MySQL Server的plugin_dir指定的地址。
接下來的操作與源碼安裝一致,從步驟1.4開始進行下面操作即可。
3 自動化安裝部署
自動化安裝部署,主要針對二進制文件的安裝,通過執行腳本即可實現整個安裝部署過程。因此,使用自動化腳本的前提是提供的二進制文件符合應用需求。具體如下:
執行腳本的前提是已經獲取mysql-audit。在此情況下,執行自動化腳本,可以安裝部署成功。
具體腳本操作,可以通過執行:audit_build.sh -h 查看輸入參數。舉例如下:
./audit_build.sh --mysqldir=/usr/local/mysql --auditdir=/home/mysql/audit --user=root --password=”” --host=localhost --port=3306 --socket=/tmp/mysql.sock --version=5.5.20 --type=release
4 插件卸載
為了保證數據庫的性能,可以卸載審計插件。使用mysql登陸數據庫服務器,執行以下命令:
uninstall plugin audit;
文件輸出格式
文件格式分為兩種,分別為連接審計和操作審計。
1、連接審計 www.2cto.com
連接相關的審計日志信息的格式如下所示。
具體的:
[2012-06-20 15:40:39]:審計的時間。
[CONNECT]:為連接的類型;
status:為連接成功(0)或者失敗(錯誤號)的狀態;
user:為連接的用戶名;
external-user:為外部連接的用戶,在使用中間件或者代理服務的時候有效;
proxy-user:為代理服務的用戶名;
host:表示連接的主機名;
ip:連接的ip地址;
database:表示連接的數據庫名。
[2012-06-20 15:40:39] [CONNECT] status: # ; thread_id: # ; user: XXX ; external-user: XXX ; proxy-user: XXX ; host: XXX ; ip: ###.###.###.### ; database: XXX
2、操作審計
操作相關的審計日志信息的格式如下所示。操作相關的命令包括CREATE、DROP、ALTER、INSERT、UPDATE、DELETE、GRANT、REVOKE等對數據或數據庫有影響的操作。以下以CREATE為例,進行詳細說明。
具體的:
[2012-06-20 15:40:39]:審計的時間。
[CREATE]為操作的類型;
error_code:為操作的錯誤碼,操作成功為0;
thread_id:執行操作的線程id;
user:執行操作的用戶名;
command:操作命令的類型,是數據庫內部的定義,數據相關操作一般為Query;
query:操作的查詢語句。 www.2cto.com
charset:操作的字符集類型;
time:執行操作的時間點,該值為從1970年以來的長整數。
rows:執行操作影響數據的行數。
[2012-06-20 15:40:39] [CREATE] error_code: # ; thread_id: # ; user: XXX ; command: XXX ; query: XXX ; charset: XXX ; time: ### ; rows: #
數據表定義
CREATE TABLE mysql.audit (
`audit_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`command` varchar(20) NOT NULL DEFAULT 'NULL',
`status` int(11) NOT NULL DEFAULT '0',
`thread_id` bigint(32) unsigned NOT NULL DEFAULT '0',
`user` varchar(20) NOT NULL DEFAULT 'NULL',
`external_user` varchar(20) NOT NULL DEFAULT 'NULL',
`proxy_user` varchar(20) NOT NULL DEFAULT 'NULL',
`host` varchar(20) NOT NULL DEFAULT 'NULL',
`ip` varchar(20) NOT NULL DEFAULT 'NULL',
`query` varchar(255) NOT NULL DEFAULT 'NULL',
`charset` varchar(20) NOT NULL DEFAULT 'NULL',
`event_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`rows` bigint(32) NOT NULL DEFAULT '0'
) ENGINE=CSV DEFAULT CHARSET=utf8 ;
www.2cto.com
常見錯誤
1、無法識別的audit.so。
解決:查看plugin_dir路徑,在該路徑下查看audit.so是否存在。
2、沒有審計內容。
解決:首先確認指定的審計文件夾的權限是否符合,審計文件夾必須是mysql用戶可以操作的目錄,如果指定了審計文件大小,指定的審計文件夾必須有xw權限。
進一步工作
1、添加審計數據對象(數據庫、數據表)功能。
2、完善查看審計參數狀態,show status like ‘audit%’中動態顯示當前參數狀態。
作者 king_wangheng