1. 程式人生 > >基於Inception搭建MySQL SQL稽核平臺Yearing

基於Inception搭建MySQL SQL稽核平臺Yearing

Inception

1. Inceptionj簡介

Inception是一款針對MySQL的SQL語句稽核自動化運維工具。使用Inception,將會給DBA帶來更大的便利性,將DBA從繁冗的工作中解放出來,做更多的自動化工作,或者從架構方面研究如何更大程度地保證資料庫的高可用等。

2. Inception安裝

2.1 下載和編譯

獲取Inception原始碼

git clone https://github.com/mysql-inception/inception.git

依賴包安裝 編譯Inception過程中依賴一些包才可以成功,依賴的包有如下5個:

bison:用來編譯語法檔案(.yy)
。yum收錄的是3.0.4,原始碼編譯2.5,官方推薦2.6之前的,所以採用原始碼編譯。 # wget http://ftp.gnu.org/gnu/bison/bison-2.5.tar.bz2 # tar xf bison-2.5.tar.bz2 # cd bison-2.5 # ./configure && make && make install cmake:版本最好用2.8.x # yum -y install cmake ncurses安裝 # yum -y install ncurses-devel 安裝g++ # yum -y install gcc gcc-c++
安裝openssl # yum -y installopenssl-devel

編譯Inception

# cd /opt  
# mkdir -p /inception/{data,logs}
# unzip inception-master.zip -d /inception
# cd /inception/inception-master
# cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/inception \
 -DMYSQL_DATADIR=/inception/data \
 -DWITH_SSL=bundled \
 -DCMAKE_BUILD_TYPE=
RELEASE \ -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wno-unused-parameter -Woverloaded-virtual" \ -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement" # make && make install

2.2 啟動配置

拷貝啟動檔案

# cp /inception/inception-master/sql/Inception /usr/local/bin/

# cp /inception/inception-master/sql/gen_lex_hash /usr/local/bin/

配置引數檔案/etc/inc.cnf

# vi /etc/inc.cnf 
[inception]
general_log=1
general_log_file=inception.log
port=6669
socket=/tmp/inc.socket
character-set-client-handshake=0
character-set-server=utf8
inception_remote_system_password=mysql
inception_remote_system_user=wanbin
inception_remote_backup_port=3307
inception_remote_backup_host=127.0.0.1
inception_support_charset=utf8mb4
inception_enable_nullable=1
inception_check_primary_key=1
inception_check_column_comment=0
inception_check_table_comment=1
inception_check_column_default_value=0
inception_max_char_length=30
inception_osc_min_table_size=1
inception_osc_bin_dir=/usr/local/toolkit/bin
inception_osc_chunk_time=0.1
inception_enable_blob_type=1

詳細引數介紹


`port=6669`:Inception的服務埠

`socket=/tmp/inc.socket`:Inception的套接字檔案存放位置

`character-set-server=utf8`:mysql原生引數

#Inception 稽核規則
`inception_check_insert_field`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在插入語句中,
用來控制是否指定插入列列表,如果沒有指定,並且引數值為ON,則會報錯。

`inception_check_dml_where`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在稽核DML語句時,
如果發現沒有WHERE條件,並且此引數設定為ON,就會報錯,否則被忽略

`inception_check_dml_limit`:引數可選範圍為ON/OFF,引數預設值為ON,功能說明是在DML語句中,如果使用了LIMIT表示式,
並且此引數設定為ON,就會報錯。這一般用來防止STATEMENT語句主從複製時導致主從不一致的問題。

`inception_check_dml_orderby`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在DML語句中,如果使用了OrderBy表示式,
並且此引數設定為ON,就會報錯。這一般用來防止STATEMENT語句主從複製時導致主從不一致的問題。

`inception_enable_select_star`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在遇到查詢語句為“select*from”,
並且此引數設定為ON時,不會報錯,否則會報錯。

`inception_enable_orderby_rand`:引數可選範圍為ON/OFF,引數預設值為ON,功能是語句中出現orderbyrand()時,
用來控制是否報錯,設定為ON表示不報錯,否則會報錯。

`inception_enable_nullable`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建立或者新增列時,如果列為NULL,
用來控制是否報錯,如果設定為ON,表示不報錯,否則會報錯。

`inception_enable_foreign_key`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建立表或增加索引時,如果存在外來鍵,
用來控制是否報錯,如果設定為ON,則不報錯,否則會報錯。

`inception_max_key_parts`:引數可選範圍為1~64,引數預設值為5,功能是在一個索引中,用來控制列的最大個數,
如果超過這個數目則報錯。在增加索引或新建表時,都會生效。

`inception_max_update_rows`:引數可選範圍為1~MAX,引數預設值為10000,功能是在一個修改語句中,用來控制預計影響的最大行數,
如果超過這個數就報錯。這個引數的獲取方法是explain,對於有一些語句或在MySQL5.5版本中獲取不到相應語句時,預計行數都會是0,
這時這個引數就失效了。

`inception_max_keys`:引數可選範圍為1~1024,引數預設值為16,功能在一個表中,用來控制支援的最大索引數目,
如果超過這個數則報錯,不管在新增表,還是新增索引時,都有效。

`inception_enable_not_innodb`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是在新建表指定的儲存引擎不是Innodb時,
用來控制是否報錯,如果設定為ON,則不報錯,否則會報錯。

`inception_support_charset`:引數可選範圍為MySQL支援字符集,引數預設值為“utf8mb4”,功能是表示在建表或建庫時支援的字符集,
如果需要多個,則用逗號分隔,影響的範圍是建表、設定會話字符集、修改表字符集屬性等。

`inception_check_table_comment`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表及沒有設定表註釋時,用來控制是否報錯,如果設定為ON,則會報錯。

`inception_check_column_comment`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表或改表加列,並且沒有設定列註釋時,用來控制是否報錯,如果設定為ON,則會報錯。

`inception_check_primary_key`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表時,如果沒有建立主鍵,
用來控制是否報錯,如果設定為ON,就會報錯。

`inception_enable_partition_table`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是在建表時,
如果建立了分割槽表,用來控制是否報錯,如果設定為ON,不會報錯,否則會報錯。

`inception_enable_enum_set_bit`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是在建表或加列時,
如果列對應的資料型別指定的是enum、set、bit資料型別,用來控制是否報錯,如果設定為ON,則不報錯,否則會報錯。

`inception_check_index_prefix`:引數可選範圍為ON/OFF,引數預設值為ON,功能是用來檢查新建或建表時的索引字首,
普通索引的字首為“idx_”,唯一索引的字首為“uniq_”,如果設定為ON,並且索引字首不符合規則,則會報錯。

`inception_enable_autoincrement_unsigned`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在新建表時,
如果自增列不是無符號整型的資料型別,用來控制是否報錯,如果設定為ON,就報錯,否則不報錯。

`inception_max_char_length`:引數可選範圍為1~MAX,引數預設值為16,功能是用來控制當char型別的長度大於多少時,
就提示將其轉換為VARCHAR。

`inception_check_autoincrement_init_value`:引數可選範圍為ON/OFF,引數預設值為ON,功能是當建表時自增列的值指定不為1時,
用來控制是否報錯,如果設定為ON,則報錯。

`inception_check_autoincrement_datatype`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表時自增列的型別不為int或bigint時,
用來控制是否報錯,如果設定為ON,則會報錯。

`inception_check_timestamp_default`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表時,如果沒有為timestamp型別指定預設值,
用來控制是否報錯,如果設定為ON,則會報錯。

`inception_enable_column_charset`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是在新建表或修改表加列改列時,
用來控制是否能單獨指定列的字符集,如果設定為ON,則表示可以設定,不報錯。

`inception_check_autoincrement_name`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表時,如果指定的自增列名字不為ID,
用來控制是否報錯,如果設定為ON,則報錯,表示這個列可能存在業務意義,起到提示的作用。

`inception_merge_alter_table`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在同一個Inception任務中,多個語句修改同一個表的語句出現時,
用來控制是否報錯,如果設定為ON,則報錯,並提示合成一個。

`inception_check_column_default_value`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表、修改列、新增列時,
用來控制新的列屬性是否要有預設值,如果設定為ON,則說明必須要有預設值,否則會報錯。

`inception_enable_blob_type`:引數可選範圍為ON/OFF,引數預設值為ON,功能是在建表、修改列、新增列操作時,如果存在BLOB型別的列,
用來控制是否報錯,如果設定為ON,說明支援BLOB型別,則不會報錯。

`inception_enable_identifer_keyword`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是在所有稽核的SQL語句中,
如果有識別符號被寫成MySQL的關鍵字,用來控制是否報錯。如果設定為ON,說明支援識別符號為關鍵字,就不會報錯,否則會報錯。
由於歷史原因,這裡的identifer寫錯了,正確寫法是identifier,但Inception釋出已久,只能將錯就錯。

`auto_commit`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是為了匹配Python客戶端每次自動設定auto_commit=0的,
如果取消則會報錯,針對Inception本身沒有實際意義。

`bind_address`:引數可選範圍為string,引數預設值為*。這個引數實際上就是MySQL資料庫原來的引數,
因為Incpetion沒有許可權驗證過程,那麼為了實現更安全的訪問,可以給Inception伺服器的這個引數設定某些機器(Inception上層的應用程式)的地址,
這樣其他非法程式就是不可訪問的了,再加上Inception執行選項中的使用者名稱密碼,對於後端MySQL就更加安全了。

`general_log`:引數可選範圍為ON/OFF,引數預設值為ON。
這個引數就是原生的MySQL引數,用來記錄在Inception服務上執行過哪些語句,定位一些問題等。

`general_log_file`:引數可選範圍為string,引數預設值為inception.log,功能是設定generallog寫入的檔案路徑。

`inception_user`:引數可選範圍為string,引數預設值為empty。這個使用者名稱在配置之後,在連線Inception的選項中可以不指定user,
這樣就可以不暴露線上資料庫的使用者名稱及密碼了,可以作為臨時使用的一種方式。
但這個使用者現在只能用來稽核,也就是說,即使在選項中指定--enable-execute,也不能執行,是隻能用來稽核的賬號。

`inception_password`:引數可選範圍為string,引數預設值為empty。這個引數與上面的引數是一對的,對應的是選項中的password,設定這個引數之後,可以在選項中不指定password。

`inception_enable_sql_statistic`:引數可選範圍為ON/OFF,引數預設值為ON。
用來設定是否支援在統計Inception執行過的語句中,記錄各種語句分別佔多大比例。
如果引數值為ON,則每次執行的情況都會在備份資料庫例項中inception庫的statistic表中,以一條記錄的形式儲存這次操作的統計情況,
每次操作對應一條記錄,這條記錄中含有的資訊是各種型別的語句執行次數情況,
具體的資訊請參照52章中“Inception對SQL執行情況的統計”一節。

`inception_read_only`:引數可選範圍為ON/OFF,引數預設值為OFF。
設定當前Inception伺服器是否為只讀,這是為了防止一些人在具有修改許可權的賬號時,通過Inception誤修改一些資料。
如果inception_read_only設定為ON,則即使打開了enable-execute,同時又有執行許可權,也不會去執行,稽核完成即返回。

`inception_check_identifier`:引數可選範圍為ON/OFF,引數預設值為ON,功能是開啟與關閉Inception對SQL語句中各種名字的檢查。
如果設定為ON,則發現名字中存在除數字、字母、下劃線之外的字元時,會報Identifier“invalidname”isinvalid,validoptions:[a-z,A-Z,0-9,_]`inception_max_primary_key_parts`:引數可選範圍為1~64,引數預設值為5,功能是在建立表時,如果主鍵所包含的列個數超過這個設定的值,則會報警告。

`inception_enable_pk_columns_only_int`:引數可選範圍為ON/OFF,引數預設值為OFF,功能是如果引數設定為ON,則在建立表或建立主鍵索引時,會判斷包含的列的型別是否只有INT型別的,如果不是則報警告。

#備份伺服器資訊,注意改成你的機器.用於回滾。
`inception_remote_backup_host`:指定遠端備份MySQL例項的地址。

`inception_remote_backup_port`:指定遠端備份MySQL例項的埠。

`inception_remote_system_user`:備份時,連線上面指定的MySQL例項時所需要的使用者名稱,這個使用者需要有相應的許可權,一般包括CREATE、INSERT及SELECT許可權。

`inception_remote_system_password`:備份時,連線備份庫時所需要的使用者對應的密碼。

#inception 支援 OSC 引數

`inception_osc_bin_dir=/user/bin`:用於指定pt-online-schema-change指令碼的位置,不可修改,在配置檔案中設定

`inception_osc_check_interval=5` #對應OSC引數--check-interval,意義是Sleep time between checks for --max-lag.

`inception_osc_chunk_size=1000` #對應OSC引數--chunk-size

`inception_osc_chunk_size_limit=4` #對應OSC引數--chunk-size-limit

`inception_osc_chunk_time=0.1` #對應OSC引數--chunk-time

`inception_osc_critical_thread_connected=1000` #對應引數--critical-load中的thread_connected部分

`inception_osc_critical_thread_running=80` #對應引數--critical-load中的thread_running部分

`inception_osc_drop_new_table=1` #對應引數--[no]drop-new-table

`inception_osc_drop_old_table=1` #對應引數--[no]drop-old-table

`inception_osc_max_lag=3` #對應引數--max-lag

`inception_osc_max_thread_connected=1000` #對應引數--max-load中的thread_connected部分

`inception_osc_max_thread_running=80` #對應引數--max-load中的thread_running部分

`inception_osc_min_table_size=0` # 這個引數實際上是一個OSC的開關,如果設定為0,則全部ALTER語句都走OSC,如果設定為非0,則當這個表佔用空間大小大於這個值時才使用OSC方式。單位為M,這個表大小的計算方式是通過語句:"select (DATA_LENGTH + INDEX_LENGTH)/1024/1024 from information_schema.tables where table_schema = 'dbname' and table_name = 'tablename'"來實現的

`inception_osc_on=0` #一個全域性的OSC開關,預設是開啟的,如果想要關閉則設定為OFF,這樣就會直接修改

`inception_osc_print_none=1` #用來設定在Inception返回結果集中,對於原來OSC在執行過程的標準輸出資訊是不是要列印到結果集對應的錯誤資訊列中,如果設定為1,就不列印,如果設定為0,就列印。而如果出現錯誤了,則都會列印

`inception_osc_print_sql=1` #對應引數--print

啟動Inception

# Inception --defaults-file=/etc/inc.cnf &

# mysql -h127.0.0.1 -uroot -P6669

1 [(none)] 10:53:26>inception get variables;
+------------------------------------------+---------------------------------------------+
| Variable_name                            | Value                                       |
+------------------------------------------+---------------------------------------------+
| autocommit                               | OFF                                         |
| bind_address                             | *                                           |
| character_set_system                     | utf8                                        |
| character_sets_dir                       | /inception/inception-master/share/charsets/ |
| connect_timeout                          | 10                                          |
| date_format                              | %Y-%m-%d                                    |
| datetime_format                          | %Y-%m-%d %H:%i:%s                           |
| general_log                              | ON                                          |
| general_log_file                         | inception.log                               |
| inception_check_autoincrement_datatype   | ON                                          |
| inception_check_autoincrement_init_value | ON                                          |
| inception_check_autoincrement_name       | ON                                          |
| inception_check_column_comment           | OFF                                         |
| inception_check_column_default_value     | OFF                                         |
| inception_check_dml_limit                | ON                                          |
| inception_check_dml_orderby              | ON                                          |
| inception_check_dml_where                | ON                                          |
| inception_check_identifier               | ON                                          |
| inception_check_index_prefix             | ON                                          |
| inception_check_insert_field             | ON                                          |
| inception_check_primary_key              | ON                                          |
| inception_check_table_comment            | ON                                          |
| inception_check_timestamp_default        | ON                                          |
| inception_ddl_support                    | OFF                                         |
| inception_enable_autoincrement_unsigned  | ON                                          |
| inception_enable_blob_type               | ON                                          |
| inception_enable_column_charset          | OFF                                         |
| inception_enable_enum_set_bit            | OFF                                         |
| inception_enable_foreign_key             | OFF                                         |
| inception_enable_identifer_keyword       | OFF                                         |
| inception_enable_not_innodb              | OFF                                         |
| inception_enable_nullable                | ON                                          |
| inception_enable_orderby_rand            | OFF                                         |
| inception_enable_partition_table         | OFF                                         |
| inception_enable_pk_columns_only_int     | OFF                                         |
| inception_enable_select_star             | OFF                                         |
| inception_enable_sql_statistic           | ON                                          |
| inception_max_char_length                | 30                                          |
| inception_max_key_parts                  | 5                                           |
| inception_max_keys                       | 16                                          |
| inception_max_primary_key_parts          | 5                                           |
| inception_max_update_rows                | 10000                                       |
| inception_merge_alter_table              | ON                                          |
| inception_osc_alter_foreign_keys_method  | none                                        |
| inception_osc_bin_dir                    | /usr/local/toolkit/bin                      |
| inception_osc_check_alter                | ON                                          |
| inception_osc_check_interval             | 5.000000                                    |
| inception_osc_check_replication_filters  | ON                                          |
| inception_osc_chunk_size                 | 1000                                        |
| inception_osc_chunk_size_limit           | 4.000000                                    |
| inception_osc_chunk_time                 | 0.100000                                    |
| inception_osc_critical_thread_connected  | 1000                                        |
| inception_osc_critical_thread_running    | 80                                          |
| inception_osc_drop_new_table             | ON                                          |
| inception_osc_drop_old_table             | ON                                          |
| inception_osc_max_lag                    | 3.000000                                    |
| inception_osc_max_thread_connected       | 1000                                        |
| inception_osc_max_thread_running         | 80                                          |
| inception_osc_min_table_size             | 1                                           |
| inception_osc_on                         | ON                                          |
| inception_osc_print_none                 | ON                                          |
| inception_osc_print_sql                  | ON                                          |
| inception_osc_recursion_method           | processlist                                 |
| inception_password                       |                                             |
| inception_read_only                      | OFF                                         |
| inception_remote_backup_host             | 127.0.0.1                                   |
| inception_remote_backup_port             | 3307                                        |
| inception_remote_system_password         | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA   |
| inception_remote_system_user             | wanbin                                      |
| inception_support_charset                | utf8mb4                                     |
| inception_user                           |                                             |
| interactive_timeout                      | 28800                                       |
| max_allowed_packet                       | 1073741824                                  |
| max_connect_errors                       | 100                                         |
| max_connections                          | 151                                         |
| net_buffer_length                        | 16384                                       |
| net_read_timeout                         | 30                                          |
| net_write_timeout                        | 60                                          |
| port                                     | 6669                                        |
| query_alloc_block_size                   | 8192                                        |
| query_prealloc_size                      | 8192                                        |
| socket                                   | /tmp/inc.socket                             |
| thread_handling                          | one-thread-per-connection                   |
| thread_stack                             | 262144                                      |
| time_format                              | %H:%i:%s                                    |
| version                                  | Inception2.1.50                             |
| version_comment                          | Source distribution                         |
| version_compile_machine                  | x86_64                                      |
| version_compile_os                       | Linux                                       |
| wait_timeout                             | 28800                                       |
+------------------------------------------+---------------------------------------------+
90 rows in set (0.00 sec)

Yearning

1. Yearning簡介

Yearning 開源的MYSQL SQL語句稽核平臺,提供資料庫字典查詢,查詢審計,SQL稽核等多種功能。

Yearning 是基於Inception的web視覺化SQL稽核平臺,其本身只提供視覺化互動頁面並不具備sql稽核的能力。

2. Yearning安裝

從v1.3.0版本開始將採取docker執行的方式,不再提供普通安裝教程

2.1 Yearning v1.3.0及以上版本安裝

docker-compose安裝

# sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# sudo chmod +x /usr/local/bin/docker-compose

# docker-compose --version
docker-compose version 1.22.0, build f46880fe
# service docker start

Yearning安裝

# git clone https://github.com/cookieY/Yearning.git

# cd /opt/Yearning-master/install/yearning-docker-compose

# vim docker-compose.yml 
把8080:80 改成 80:80

# docker-compose up -d

請注意本地不要佔用8080和8000埠 如需要更改埠可再docker-compose.yml檔案中更改,3306和8000埠不可更改!docker-compose並不能確定容器的依賴關係,所以如果執行後無法登陸,請使用docker-compose restart yearning重啟容器

cd /opt/Yearning-master/install/yearning-docker-compose

docker-compose down
或者
docker-compose stop yearning  #停止yearning服務
docker-compose stop db #停止mysql服務



cd /opt/Yearning-master/install/yearning-docker-compose
docker-compose up -d
或者
docker-compose start yearning #啟動yearning服務
docker-compose start db #啟動mysql服務

預設使用者:admin 預設密碼: Yearning_admin

使用外部mysql docker-compose中已經包含了mysql且掛載本地目錄,不存在容器銷燬資料消失的問題,但如果你還是想使用外部mysql,可使用以下步驟:

#新建Yearning庫,設定字符集為UTF-8,

然後在Yearning庫中匯入sql檔案
# cd /opt/Yearning-master/install/yearning-docker-compose/init-sql

mysql> create database Yearning DEFAULT CHARACTER SET utf8mb4;

mysql>use Yearning

mysql>source install.sql

# docker run -d -e HOST=192.168.56.210 \
-e MYSQL_ADDR=192.168.56.210 \
-e MYSQL_USER=wanbin \
-e MYSQL_PASSWORD=mysql \ 
-p80:80 -p8000:8000 registry.cn-hangzhou.aliyuncs.com/cookie/yearning:v1.3.2

登陸後請通過設定頁面設定inception及其他配置資訊 登陸介面 home介面

2.2 Yearning v1.2.0版本安裝