Windows Sqlserver Automatic Log Audit Via C/C++

Andrew.Hann發表於2015-12-31

catalog

1. 資料庫日誌審計產品
2. Mysql日誌審計
3. SQLServer日誌審計

 

1. 資料庫日誌審計產品

Relevant Link:

http://enterprise.huawei.com/cn/products/security/security-management/security-management-system/hw-143212.htm
http://www.dbappsecurity.com.cn/products/products03.html
http://www.nsfocus.com.cn/upload/contents/2015/04/2015_04021455110.pdf
http://baike.baidu.com/view/3993625.htm

 

2. Mysql日誌審計

0x1: audit外掛方式

在MySQL資料庫中(5.5版本),增加了一個新的外掛:Audit plugin,用於對資料庫連線和資料庫操作進行審計。該外掛在mysql5.6.20企業版及其後續版本才比較完善

1. 安裝

可通過兩種方式載入

1. 配置my.cnf檔案 
[mysqld]  
plugin-load=audit_log.so  
如果想要在執行過程中該外掛不被移除,配置如下 
[mysqld]  
plugin-load=audit_log.so  
audit-log=FORCE_PLUS_PERMANENT  
該載入方式不會被註冊到mysql.plugins表中,如果在my.cnf中移除配置選項將會導致審計失敗 

2. 在mysql中動態載入
進入mysql資料庫執行如下sql語句 
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';  
該選項會被註冊到mysql.plugins表中,資料庫後續的重啟,該外掛都會被載入

3. 檢視所有載入的外掛
可通過如下兩個命令檢視所有已經載入的外掛
    1) SHOW PLUGINS;  
    2) select * from INFORMATION_SCHEMA.PLUGINS;  

0x2: general_log

mysql中監控的主要原理是開啟mysql的general_log來記錄mysql的歷史執行語句,它有兩種記錄方式

1. 預設是通過記錄到檔案方式
2. 另外一種是通過直接記錄到mysql庫的general_log表中

直接用mysql的sql語句開啟,sql語句如下

set global general_log=on;
SET GLOBAL log_output='table';

檢視log日誌磁碟位置

show global variables like "%genera%";

Relevant Link: 

http://blog.csdn.net/jesseyoung/article/details/41116867
http://itindex.net/detail/51728-sql-mysql-mssql

 

3. SQLServer日誌審計

Mssql執行監控,在sqlserver 上自帶有一個效能監控的工具SQL Server Profiler,在開始選單裡可以找到它,使用SQL Server Profiler可以將SQL執行過程儲存到檔案和資料庫表,同時它還支援實時檢視和搜尋

0x1: 監控事件

一個事件表現SQL Server中執行的各種活動。這些活動可以簡單地分類為

1. 事件類
2. 遊標事件
3. 鎖事件
4. 儲存過程事件
5. T-SQL事件 

對於效能分析,主要關注SQL Server上執行的各種活動的資源壓力水平的事件。資源壓力主要包含如下內容

1. SQL活動涉及哪一類的CPU使用
2. 使用了多少記憶體
3. 涉及多少I/0操作
4. SQL活動執行了多長時間
5. 特定的查詢執行的頻率有多高
6. 查詢面對哪類錯誤和警告 

跟蹤查詢結束的事件

1. Security Audit(安全審計): 記錄使用者連線到SQL Server或斷開連線時資料庫的連線
    1) Audit Login(登入審計)
    2) Audit Logout(登出審計)
2. Sessions(會話)    
    1) ExistingConnection(現有連線): 表示所有在跟蹤開始之間連線到SQL Server的使用者
3. Cursors(遊標)
    1) CursorImplicitConversion(遊標隱含轉換): 表明建立的遊標型別與所請求的型別個不同
4. Errors and Warnings(錯誤和警告)
    1) Attention(注意): 表示由於客戶端撤銷查詢或者資料庫連線破壞引起請求中斷
    2) Exception(異常): 表明SQL Server發生了異常
    3) Execution Warning(執行警告): 表明在查詢或儲存過程執行期間出現了警告
    4) Hash Warning(雜湊警告): 表明hash操作發生了錯誤
    5) Missing Column Statistics(列統計丟失): 表明優化器要求的確定處理策略用的類統計丟失
    6) Missing Join Predicate(連線斷言丟失)    表明查詢在兩個表沒有連線斷言情況下執行
    7) Sort Warning(排序警告): 表明像SELECT這樣的查詢中執行排序操作沒有合適的記憶體
5. Locks(鎖)
    1) Lock:Deadlock(死鎖): 標誌著死鎖的出現
    2) Lock:Deadlock Chain(死鎖鏈): 顯示產生死鎖的查詢鏈條
    3) lock:Timeout(鎖超時): 表示鎖已經超過其超時引數,該引數由SETLOCK_TIMEOUT timeout_perious(ms)命令設定
6. Stored Procedures(儲存過程) 
    1) SP:Recompile(重編譯): 表明用於一個儲存過程的執行計劃必須重編譯,原因是執行計劃不存在,強制的重編譯,或者現有的執行計劃不能重用
    2) SP:Starting(開始): 表示一個SP:StmtStarting儲存過程的開始
    3) SP:StmtStarting(語句開始): 表示一個SP:StmtStarting儲存過程中的一條SQL語句的開始 
    4) RPC:Completed: RPC完成事件,RPC事件表示儲存過程使用遠端過程呼叫(RPC)機制通過OLEDB命令執行。如果一個資料庫應用程式使用T-SQL EXECUTE語句執行一個儲存過程,那麼儲存過程將被轉化為一個SQL批而不是一個RPC。RPC請求通常比EXECUTE請求快,因為它繞過了SQL Server中的許多語句解析和引數處理
     5) SP:Completed: 儲存過程完成事件
     6) SP:StmtCompleted: 在儲存過程中一條SQL語句完成事件
7. Transactions(事物)    
    1) SQLTransaction(SQL事務): 提供資料庫事務的資訊,包括事務開始/結束的時間、事務持續事件等資訊 
8. T-SQL    
    1) SQL:BatchCompleted: T-SQL批完成事件,T-SQL由一條或多條T-SQL語句組成。語句或T-SQL語句在儲存過程中也是單獨和離散的。用SP:StmtCompleted或SQL:StmtCompleted事件捕捉單獨的語句可能是代價很高的操作,這取決於單獨語句的數量
     2) SQL:StmtCompleted: 一條T-SQL語句完成事件

0x2: 事件列

1. EventClass(事件類): 事件型別,如SQL:StatementCompleted
2. TextData: 事件所用的SQL語句,如SELECT * FROM Person
3. CPU: 事件的CPU開銷(以ms表示),如對一個SELECT語句,CPU=100表示該語句執行100ms
4. Reads: 為一個事件所執行的邏輯讀運算元量。例如對一個SELECT語句,Reads=800表示該語句需要800次邏輯讀操作
5. Writes: 為一個事件所執行的邏輯寫運算元量
6. Duration: 事件的執行時間(ms)
7. SPID: 用於該事件的SQL Server程式識別符號
8. StartTime: 事件開始的時間
9. BinaryData(二進位制資料)
10. IntegerData(整數資料)
11. EventSubClass(事件子類)
12. DatabaseID(資料庫識別符號)
13. ObjectID(物件識別符號)
14. IndexID(索引識別符號)
15. TransactionID(事務識別符號)
16. Error(錯誤)
17. EndTime(結束時間)

0x3: 啟動日誌審計

/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler          */
/* Date: 2015/12/31  16:54:56         */
/****************************************************/


-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Writing to a table is not supported through the SP's

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 14, 1, @on
exec sp_trace_setevent @TraceID, 14, 9, @on
exec sp_trace_setevent @TraceID, 14, 6, @on
exec sp_trace_setevent @TraceID, 14, 10, @on
exec sp_trace_setevent @TraceID, 14, 14, @on
exec sp_trace_setevent @TraceID, 14, 11, @on
exec sp_trace_setevent @TraceID, 14, 12, @on
exec sp_trace_setevent @TraceID, 15, 15, @on
exec sp_trace_setevent @TraceID, 15, 16, @on
exec sp_trace_setevent @TraceID, 15, 9, @on
exec sp_trace_setevent @TraceID, 15, 17, @on
exec sp_trace_setevent @TraceID, 15, 6, @on
exec sp_trace_setevent @TraceID, 15, 10, @on
exec sp_trace_setevent @TraceID, 15, 14, @on
exec sp_trace_setevent @TraceID, 15, 18, @on
exec sp_trace_setevent @TraceID, 15, 11, @on
exec sp_trace_setevent @TraceID, 15, 12, @on
exec sp_trace_setevent @TraceID, 15, 13, @on
exec sp_trace_setevent @TraceID, 17, 1, @on
exec sp_trace_setevent @TraceID, 17, 9, @on
exec sp_trace_setevent @TraceID, 17, 6, @on
exec sp_trace_setevent @TraceID, 17, 10, @on
exec sp_trace_setevent @TraceID, 17, 14, @on
exec sp_trace_setevent @TraceID, 17, 11, @on
exec sp_trace_setevent @TraceID, 17, 12, @on
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 9, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 2, @on
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 11, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 6, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 12, 15, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 9, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 6, @on
exec sp_trace_setevent @TraceID, 12, 10, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 11, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on
exec sp_trace_setevent @TraceID, 13, 1, @on
exec sp_trace_setevent @TraceID, 13, 9, @on
exec sp_trace_setevent @TraceID, 13, 6, @on
exec sp_trace_setevent @TraceID, 13, 10, @on
exec sp_trace_setevent @TraceID, 13, 14, @on
exec sp_trace_setevent @TraceID, 13, 11, @on
exec sp_trace_setevent @TraceID, 13, 12, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 196ba3b9-dbd4-496e-b163-fa1ff7667592'
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go

0x4: 提取SQL執行日誌

SELECT 
    [EventClass]
    ,[TextData]
    ,[ApplicationName]
    ,[NTUserName]
    ,[LoginName] 
    ,[SPID]
    ,[StartTime]
    ,[BinaryData]
FROM 
    [master].[dbo].[sqllog]
WHERE  
    ApplicationName != 'Report Server'  
GO

0x5: 惡意分析

1. 異常登入、登出: 
2. 異常指令執行
3. 可疑SQL隱碼攻擊

2. 異常指令執行

1. EXEC
2. master..xp_cmdshell
3. sp_configure
4. master.dbo.sp_addlogin
5. master.dbo.sp_addsrvrolemember
6. master.dbo.xp_servicecontrol
7. sp_oacreate
8. wscript.shell
9. sp_oamethod
10. sp_add_jobstep
11. sp_add_jobserver
12. sp_start_job
13. xp_regenumvalues
14. addextendedproc
15. master..xp_regwrite
16. master.dbo.xp_regread
17. ias.mdb
18. Microsoft.Jet.OLEDB
19. sp_addlinkedserver
20. sp_makewebtask
21. master..xp_availablemedia
22. master..xp_dirtree
23. master..xp_enumdsn
24. master..xp_loginconfig
25. master..xp_makecab
26. master..xp_ntsec_enumdomains
27. master..xp_terminate_process
28. sp_add_job
29. sp_OACreate
30. sp_OASetProperty
31. sp_OAMethod

3. 可疑SQL隱碼攻擊

1. "((e|\.|)\d|\\n)union.{1,10}select" 
2. "(\bsha1\s{0,5}\(|\bpassword\s{0,5}\(|\bencode\s{0,5}\(|\bschema\s{0,5}\(|\bconvert\s{0,5}\(|\bhost_name\s{0,5}\(|\bopendatasource\s{0,5}\(|\bopenrowset\s{0,5}\(|\bsysaux\s{0,5}\(|\bis_member\s{0,5}\(|\@\@spid|\@\@version)" 
3. "((substr|substring)\((concat|concat_ws|group_concat|lower|upper|left|right)\()|((ascii|hex|ord)\(substr)|(length\((trim|replace)\()|((cast|substr|substring|length)\((user|version|database)\()|((asc|locate)\((mid|substr))||COOKIE^^[r]((substr|substring)\((concat|concat_ws|group_concat|lower|upper|left|right)\()|((ascii|hex|ord)\(substr)|(length\((trim|replace)\()|((cast|substr|substring|length)\((user|version|database)\()|((asc|locate)\((mid|substr))"
4. "(into.{1,10}(outfile|dumpfile)|load_file\()||COOKIE^^[r](into.{1,10}(outfile|dumpfile)|load_file\()" 
5. "(name_const|concat(_ws)?)\(.{1,100}from.{1,15}information_schema||COOKIE^^[r](name_const|concat(_ws)?)\(.{1,100}from.{1,15}information_schema" 
6. "/\*.{0,50}\*/" 
7. "(updatexml|extractvalue|ascii|\bhex|\bbin|\bord|\bconv|substring|substr|instr|strcmp|\bmid|\bcast|length|benchmark|sleep|pg_sleep|version|\buser|(current|system)_user|datadir|load_file|concat|concat_ws|group_concat|md5)\(||USER_AGENT^^[r](updatexml|extractvalue|ascii|\bhex|\bbin|\bord|\bconv|substring|substr|instr|strcmp|\bmid|\bcast|length|benchmark|sleep|pg_sleep|version|\buser|(current|system)_user|datadir|load_file|concat|concat_ws|group_concat|md5)\(||REFERER^^[r](updatexml|extractvalue|ascii|\bhex|\bbin|\bord|\bconv|substring|substr|instr|strcmp|\bmid|\bcast|length|benchmark|sleep|pg_sleep|version|\buser|(current|system)_user|datadir|load_file|concat|concat_ws|group_concat|md5)\("  

Relevant Link:

http://itindex.net/detail/51728-sql-mysql-mssql

 

Copyright (c) 2015 LittleHann All rights reserved

 

相關文章