基於Inception搭建MySQL SQL審核平台Yearing
Inception
1. Inceptionj簡介
Inception是一款針對MySQL的SQL語句審核自動化運維工具。使用Inception,將會給DBA帶來更大的便利性,將DBA從繁冗的工作中解放出來,做更多的自動化工作,或者從架構方面研究如何更大程度地保證數據庫的高可用等。
Inception的文檔地址:https://github.com/cookieY/inception-document/tree/master/docs
2. Inception安裝
2.1 下載和編譯
Inception的源代碼可以在Github上直接下載,開源GitHub地址為:
https://github.com/mysql-inception/inception.git
獲取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 的文檔地址:https://supermancookie.com/Yearning-document/
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
docker安裝
參考CentOS Docker 安裝
# 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及其他配置信息
2.2 Yearning v1.2.0版本安裝
參考官檔:https://supermancookie.com/Yearning-document/install/
啟動
#啟動nginx systemctl start nginx #啟動Inception Inception --defaults-file=/etc/inc.cnf & #啟動yearning cd /opt/Yearning-1.2.0/src/ gunicorn settingConf.wsgi:application -c gunicorn.conf # ps -ef|grep gun root 26174 1 2 13:56 ? 00:00:00 /usr/local/bin/python3.6 /usr/local/bin/gunicorn settingConf.wsgi:application -c gunicorn.conf root 26181 26174 17 13:56 ? 00:00:00 /usr/local/bin/python3.6 /usr/local/bin/gunicorn settingConf.wsgi:application -c gunicorn.conf root 26182 26174 15 13:56 ? 00:00:00 /usr/local/bin/python3.6 /usr/local/bin/gunicorn settingConf.wsgi:application -c gunicorn.conf root 26189 1925 0 13:57 pts/0 00:00:00 grep --color=auto gun
代表啟動成功