- 論壇徽章:
- 0
|
本帖最后由 ubuntuer 于 2011-03-04 16:01 編輯
通過修改mysql源碼添加審計(jì)功能
實(shí)驗(yàn)環(huán)境:vmware虛擬centos5.3
虛擬機(jī):192.168.83.137 (自己編譯的mysqld 5.1.55)
192.168.83.133 mysql client
一、原理
Mysql審計(jì)無非抓包(tcp and 3306),目前mysqlsniffer已經(jīng)很好的完成了抓包功能,加點(diǎn)自己的功能也簡單,這個(gè)下次有機(jī)會(huì)再說,mysqlsniffer的代碼量很少,對于用過pcap的人來說,都是a piece of cake!
今天還是說下從mysql的源碼入手,大家都知道m(xù)ysql有了慢log功能,讓我們先看看一條慢log:
這個(gè)語句似乎已經(jīng)滿足了審計(jì)的功能,誰在那里在什么時(shí)間做了什么???
Root于11:00:22在localhost上執(zhí)行了insert操作
我們大膽的想下,如果mysql每條語句都打log是不是就完成審計(jì)了呢?absolutely,不過這個(gè)似乎太黃太暴力了,只針對特定用戶特定機(jī)器執(zhí)行審計(jì)操作是不是就達(dá)到審計(jì)的要求了呢….嗯哼、嗯哼~~~
那我們再添加兩個(gè)選項(xiàng) audit-user、audit-ip不就ok了么,so just do it
Ps:
在這個(gè)的基礎(chǔ)上,可以將慢log修改成發(fā)送到另一臺(tái)server上統(tǒng)一分析,這樣對性能也沒有什么影響。我這個(gè)只是個(gè)非常非常粗糙的版本,請?jiān)徫倚薷膍ysql代碼后make && make install后,居然啟動(dòng)成功,審計(jì)成功的驚喜吧…留待后面完善
二、代碼修改
2.1 添加配置選項(xiàng)
2.1.1 加載源碼
Sourceinsight加載mysql 5.1.55源碼(si,默認(rèn)不加載.cc文件,options->Document options設(shè)置下)
2.1.2 如何添加配置選項(xiàng)
讓我們先了解下log-error這個(gè)配置選項(xiàng)(因?yàn)槲覀兲砑拥呐渲眠x項(xiàng),也將是字符串滴,注意是log-error不是log_error),我們在依葫蘆畫,search下主要有:
struct my_option my_long_options[] = {
….
{"log-error", OPT_ERROR_LOG_FILE, "Error log file.",
&log_error_file_ptr, &log_error_file_ptr, 0, GET_STR,
OPT_ARG, 0, 0, 0, 0, 0, 0}
…
}
看下就知道m(xù)ysql讀取配置選項(xiàng)為log-error的值到log_error_file_ptr這個(gè)變量中,這里var_type(GET_STR, GET_STR_ALLOC等)和arg_type(NO_ARG, OPT_ARG,REQUIRED_ARG)你懂的,我就不說了
接下來就是log_error_file_ptr這個(gè)變量是怎么使用的了,還是按潛規(guī)則,search了哦
其實(shí)最主要的就是在init_server_components中將log_error_file_ptr賦值到了log_error_file中
fn_format(log_error_file, log_error_file_ptr, mysql_data_home, ".err",
MY_UNPACK_FILENAME | MY_SAFE_PATH);
接下來就是如何用這個(gè)變量了,大家注意我標(biāo)紅的
在mysql_priv.h中extern了,在log.cc和set_var.cc中使用了log_error_file這個(gè)變量。。
先看看set_var.cc吧 sys_log_error的類型為sys_var_const,sys_var_const的構(gòu)造函數(shù)有個(gè)chain_sys_var,看字面意思就這個(gè)這個(gè)函數(shù)是將所有變量(其實(shí)也就是配置選項(xiàng)串起來了),這里就不細(xì)說了,有興趣的自己跟下
到這里如何添加配置選項(xiàng)就清晰了
2.1.3
首先在mysqld中添加一個(gè)我們自己的配置選項(xiàng)
至于opt_audit_user的定義,這些就不說了
將這個(gè)變量保存到一個(gè)數(shù)組中(這里完全模仿log-error),在init_server_components中添加:
snprintf(audit_user, sizeof(audit_user), "%s", opt_audit_user);
在mysql_priv.h中添加:
extern char* opt_audit_user;
extern char audit_user[FN_REFLEN];
2.2 審計(jì)原理
利用慢log,search下long_query_time在log_slow_statement中
if (((end_utime_of_query - thd->utime_after_lock) >
thd->variables.long_query_time || …
一路追尋,找到
具體的語句打印在
bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
ulonglong current_utime)
那么一切都清晰而又明了了,如果設(shè)置long_query_time為0,把>修改為>=,在的slow_log_print里過濾掉一些不想審計(jì)的東東,就ok了
三、源碼編譯安裝
具體源碼怎么修改的,我就不寫了,代碼我給出來…
Make && make install后cp ./support-files/mysql.server /etc/init.d/mysqld就可以了。。。
四、 使用
4.1 配置文件/etc/my.cnf
修改配置文件,添加下面的幾個(gè)選項(xiàng)
哈哈,上面兩個(gè)配置選項(xiàng)就是自己添加的,表示只審計(jì)來自192.168.86.133上的secutcs用戶,log-slow-queries表示log存放的文件名,long_query_time=0表示記錄任何log(聰明的你可能已經(jīng)想到了還需要修改某處的>為>=)
4.2 啟動(dòng)mysql,查看審計(jì)log
[root@localhost ~]# /etc/init.d/mysqld start
這里的mysqld就是mysql.server cp過來的,強(qiáng)烈建議使用mysql.server這個(gè)啟動(dòng)腳本,在137上查看審計(jì)log
4.3 133上使用secutcs賬戶連接
[root@localhost ~]# mysql -usecutcs -p123456 -h192.168.83.137 test
4.4 137上audit_log
4.5 137上自己使用root帳號(hào)看是否能審計(jì)
[root@localhost ~]# mysql -uroot -p123456 test -S /var/lib/mysql/mysql.sock
使用root賬戶,沒有效果
在133上使用 另一個(gè)賬戶haha也沒有反映
[root@localhost ~]# mysql -uhaha -p123456 -h192.168.83.137 test
4.6 來查看下我們設(shè)置的變量
五、 后續(xù)
目前這種做法,對正常的慢log有影響,后續(xù)再專門添加一個(gè)audit-log表示審計(jì)功能開啟與否,long-query-time也再另添加一個(gè)audit-long-query-time就可以了
六、 附件patch包
有些地方我可能敲了回車,patch包不一定對,但是vim打開下audit.patch基本在那里修改了,已經(jīng)很清除了
如果patch包不行,直接使用 ,我把sql子目錄打包了,如果設(shè)計(jì)到路徑問題,我configure的時(shí)候使用的是./configure –prefix=/usr/local
word和程序都在附件里了,大家笑納
blog地址為:http://blog.chinaunix.net/space. ... =blog&id=154149
mysql審計(jì).tar
(4.44 MB, 下載次數(shù): 708)
2011-03-04 15:58 上傳
點(diǎn)擊文件名下載附件
|
|