1. 程式人生 > >Oracle MySQL雲服務上的MySQL企業版審計

Oracle MySQL雲服務上的MySQL企業版審計

Oracle Cloud Service似乎是唯一個即使你只提交了建立RDS服務的請求,也會自動幫你建立一個虛擬主機,並且提供主機登入許可權的服務提供商,也許這就是Oracle一直在宣稱的IaaS+PaaS的整合。

在建立MySQL Cloud Service時,會要求提供一個SSH登入金鑰,所有的Oracle雲服務主機登入使用者都是opc,因此在服務建立完畢,收到通知郵件之後,就可以通過以下命令登入到雲主機上。

ssh -i id_rsa_oracle_cloud_enmotech [email protected]_host_ip

登入到主機以後,螢幕歡迎詞是個小驚喜,Oracle貼心得顯示了MySQL執行狀態和儲存使用量的提示。

MySQL

在比較了多方的RDS之後,Oracle MySQL Cloud Service確實如一直以來宣傳的那樣,提供了最多的安全選件功能,如果我們用MySQL Workbench登入到資料庫中,在Server Status頁面可以看到:SSL連線,PAM驗證,密碼校驗,資料庫審計等多種安全功能全部是開啟的。

而與之相比,阿里雲MySQL RDS提供的安全功能就少的可憐了。說少不合適,是一項安全功能都沒開啟。

MySQL RDS

Oracle對於資料庫安全性的看重確實超越了大多數資料庫提供商,而這也帶來了一些小麻煩。

在建立MySQL雲服務的時候,需要指定資料庫root使用者的密碼,這個密碼有比較強的安全要求,需要有大寫、小寫英文字母,有數字,同時還需要有特殊字元(比如#)。因此在後續建立Login Path時,在mysql_config_editor命令提示輸入密碼的時候,需要在密碼前後加上雙引號(比如”Passw#rd”),否則會一直出現拒絕訪問的提示。

opc使用者沒有辦法直接登入MySQL,需要切換到oracle使用者

oracle

使用密碼直接登入是沒有問題的
建立Login Path,仍然輸入上述一樣的密碼
[[email protected] ~]$ mysql_config_editor set --host=localhost -
-user=root --password
Enter password:
檢查確認Login Path已經建立成功
Login Path
直接登入報錯
[[email protected] ~]$ mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
在密碼前後加上雙引號重新建立Login Path
Login Path
再次登入,成功

在進行Audit功能的檢查之前,對於預設的mysql命令列提示只有mysql> 這樣簡陋的顯示不能忍,要加上當前登入的使用者和資料庫名稱。在oracle使用者的.my.cnf下增加以下行。

[mysql]
prompt=\\[email protected]\\h [\\d]>\\_
再次登入,mysql命令列的提示就比較順眼了。
mysql
接下來進入本文的正題,在Oracle MySQL Cloud Service中預設是如何設定Audit的?
首先先檢查一下audit_log的相關引數設定。

那麼audit_log_file=audit.log表示仍然使用了預設的名字,到MySQL的資料檔案目錄中檢查一下audit.log檔案的存在。

這裡可以看到總共的audit日誌已經有1.9GB之大,在第一個audit.log達到audit_log_rotate_on_size引數設定的大小之後,自動切換成了新的audit.log。

題外話,之所以有這麼巨大的audit.log,是由於啟用了MySQL Enterprise Monitor,不斷地記錄了Monitor程序的登入和退出

為了方便後面觀察audit.log,先將Monitor停止。

Monitor

接下來進行一些常規操作,並觀察audit.log檔案的輸出內容。

1. 用root使用者登入,在audit檔案中顯示一條Connect型別的記錄。TIMESTAMP記錄了時間,USER標籤記錄了登入的使用者,HOST標籤記錄了登入的機器,COMMAND_CLASS為connect。

SQL

2. 嘗試直接CTAS一張測試表,在enforce_gtid_consistency=ON時會報1786錯誤,這是GTID特性決定的。

在audit.log中也記錄下了這次報錯的操作,STATUS標籤為錯誤程式碼1786,STATUS_CODE標籤值為1表示這條SQL沒有成功執行,SQLTEXT標籤記錄了整個SQL語句。

3. 下面的三條語句,select,create table,insert均沒有在audit.log中記錄下來。

這樣的行為是由audit_log_statement_policy=ERRORS引數決定的,預設只記錄報錯的SQL,而不會記錄所有的執行語句。

4. 將audit_log_statement_policy引數修改為ALL,再執行同樣的select語句。

可以發現audit.log中已經有記錄了。

結論

在Oracle MySQL Cloud Service中預設會啟動MySQL Enterprise Audit元件,並且設定即記錄使用者登入又記錄執行語句(audit_log_policy=ALL),使用者登入情況則不管登入成功還是失敗每次都記錄(audit_log_connection_policy=ALL),而執行語句則只記錄執行失敗的語句(audit_log_statement_policy=ERRORS)。

作者:張樂奕

文章來自微信公眾號:資料和雲