天天看点

MySQL 审核工具 Inception

一直打算安装 Inception ,也一直拖到现在,看着 Inception 闭源。有 github 中保存了一份,并且重命名为  SQLaudit 。虽然闭源了,但是还是能用的,现在安装测试。

 

版本信息:

版本信息:
CentOS 7 x86_64
Inception2.1.50 for Linux on x86_64 (Source distribution)


# rpm -qa | grep -E '^(cmake|ncurses|openssl|bison|gcc-c++)'

openssl-devel-1.0.2k-16.el7.x86_64
cmake-2.8.12.2-2.el7.x86_64
ncurses-base-5.9-14.20130511.el7_4.noarch
ncurses-5.9-14.20130511.el7_4.x86_64
bison-3.0.4-2.el7.x86_64
bison-devel-3.0.4-2.el7.x86_64
ncurses-libs-5.9-14.20130511.el7_4.x86_64
gcc-c++-4.8.5-36.el7.x86_64
openssl-libs-1.0.2k-16.el7.x86_64
ncurses-devel-5.9-14.20130511.el7_4.x86_64
openssl-1.0.2k-16.el7.x86_64
           

安装前,MySQL 需要配置以下几个参数,用于 inception 记录及回滚等

# vim /etc/my.cnf
[mysqld]
log-bin=/usr/local/mysql/binlog/mysql-bin
binlog_format = row	#mixed/row 
server_id = 10
           

 

=============================== 开始安装 ==============================

安装相关包

yum install -y cmake ncurses-devel openssl-devel bison-devel gcc-c++ MySQL-python 
           

安装 percona-toolkit (需要用到 pt-online-schema-change)

wget https://www.percona.com/downloads/percona-toolkit/3.0.12/binary/redhat/7/x86_64/percona-toolkit-3.0.12-1.el7.x86_64.rpm
rpm -ivh percona-toolkit-3.0.12-1.el7.x86_64.rpm
ll /usr/bin/pt-*
           

下载  SQLaudit(inception )源码,命名为 "inception-master"

wget https://github.com/weiyanwei412/SQLaudit/archive/master.zip
unzip master.zip
mv SQLaudit-master /opt/inception-master
cd /opt/inception-master
           

但是编译有点问题。在 CentOS 中,这 2 种编译方法可能错误

-----------------------------------------------------------
# 错误一:
# sh inception_build.sh /usr/local/inception
-----------------------------------------------------------
building project in /usr/local/inception
CMake Error: The source directory "/usr/local" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
make: *** No rule to make target `install.  Stop.


-----------------------------------------------------------
# 错误二:
# sh inception_build.sh inception [linux]
-----------------------------------------------------------
-- Running cmake version 2.8.12.2
CMake Warning (dev) at CMakeLists.txt:141 (INCLUDE):
  Syntax Warning in cmake code at

    /opt/inception-master/cmake/ssl.cmake:207:55

  Argument not separated from preceding token by whitespace.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- MySQL Inception2.1.50
-- Packaging as: mysql-Inception2.1.50-Linux-x86_64
-- HAVE_VISIBILITY_HIDDEN
-- HAVE_VISIBILITY_HIDDEN
-- HAVE_VISIBILITY_HIDDEN
-- Configuring done
-- Generating done
-- Build files have been written to: /opt/inception-master
make: *** No rule to make target `install.  Stop.
-----------------------------------------------------------
           

正确的编译方法

cmake -DWITH_DEBUG=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/local/inception \
-DMYSQL_DATADIR=/usr/local/inception/data \
-DWITH_SSL=yes \
-DCMAKE_BUILD_TYPE=RELEASE \
-DWITH_ZLIB=bundled \
-DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement" \
-DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Wno-unused-parameter -Woverloaded-virtual"


make && make install

           

Inception 配置文件(/etc/inc.cnf)设置

# Inception 配置文件设置
# vim /etc/inc.cnf

# doc: https://github.com/weiyanwei412/inception-document/blob/master/docs/variables.md
[inception]
port=6669
socket=/usr/local/inception/data/inc.socket
character-set-server=utf8
general_log=1 								#启用Inception语句执行记录
general_log_file=/usr/local/inception/data/inception.log

#Inception 审核规则
inception_check_autoincrement_datatype=1 	#建表时,自增列的类型不为int或者bigint
inception_check_autoincrement_init_value=1	#建表时,自增列的值指定的不为1,则报错
inception_check_autoincrement_name=1		#建表时,如果指定的自增列的名字不为ID
inception_check_column_comment=1			#建表时,列没有注释
inception_check_column_default_value=0		#检查在建表、修改列、新增列时,列属性是否有默认值
inception_check_dml_limit=1					#在DML语句中使用了LIMIT
inception_check_dml_orderby=1				#在DML语句中使用了Order By
inception_check_dml_where=1					#在DML语句中没有WHERE条件
inception_check_identifier=1				#SQL语句名字检查,如果发现名字中存在除数字、字母、下划线之外的字符时,会报Identifier "invalidname" is invalid, valid options: [a-z,A-Z,0-9,_].
inception_check_index_prefix=1				#是否检查索引名字前缀为"idx_",检查唯一索引前缀是不是"uniq_"
inception_check_insert_field=1				#是否检查插入语句中的列链表的存在性
inception_check_primary_key=1				#检查是否有主键
inception_check_table_comment=0				#检查表是否有注释
inception_check_timestamp_default=0			#检查表是否有timestamp类型指定默认值
inception_enable_autoincrement_unsigned=1	#检查自增列是不是为无符号型
inception_enable_blob_type=0				#检查是不是支持BLOB字段,包括建表、修改列、新增列操作 默认开启
inception_enable_column_charset=0			#允许列自己设置字符集
inception_enable_enum_set_bit=0				#是否支持enum,set,bit数据类型
inception_enable_foreign_key=0				#是否支持外键
inception_enable_identifer_keyword=0		#SQL语句是否有标识符被写成MySQL的关键字
inception_enable_not_innodb=0				#存储引擎是否指定为Innodb
inception_enable_nullable=0					#创建或者新增列是否允许为NULL
inception_enable_orderby_rand=0				#是否允许order by rand
inception_enable_partition_table=0			#是否支持分区表
inception_enable_select_star=0				#是否允许 Select* 
inception_enable_sql_statistic=1			#备库实例是否存储sql统计信息
inception_max_char_length=16				#当char类型的长度大于这个值时,是否提示转换为VARCHAR
inception_max_key_parts=5					#一个索引中,列的最大个数,超过这个数目则报错
inception_max_keys=16						#一个表中,最大的索引数目,超过这个数则报错
inception_max_update_rows=10000				#在一个修改语句中,预计影响的最大行数,超过这个数就报错
inception_merge_alter_table=1				#在多个改同一个表的语句出现是,是否提示合成一个

#inception 支持 OSC 参数(pt-online-schema-change)
inception_osc_bin_dir=/usr/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

#备份服务器信息,记录用于回滚(需要权限 CREATE、INSERT,只备份更改的数据)
#线上同名库可能冲突,所有此备库命名规则如:IP_Port_dbname,里面的表与对应线上表都是一一对应的
inception_remote_backup_host=10.10.10.10
inception_remote_backup_port=3307
inception_remote_system_user=root
inception_remote_system_password=mysql
inception_support_charset=utf8
           

启动和连接 Inception

# 启动和连接 Inception
nohup /usr/local/inception/bin/Inception --defaults-file=/etc/inc.cnf &

/usr/local/inception/bin/mysql -h10.10.10.10 -P6669

# 连接后测试查看变量
mysql> inception get variables;
mysql> inception get variables 'connect_timeout';
mysql> inception set connect_timeout=15;
           

注:在执行时,不能将 DML 语句及 DDL 语句放在一起执行,否则会因为备份解析binlog时由于表结构的变化出现不可预知的错误,如果要有同时执行 DML 及 DDL,则请分开多个语句块儿来执行,如果真的这样做了,Inception 会报错,不会去执行

验证SQL脚本的基本语法

/*--user=root;--password=mysql;--host=10.10.10.10.10;--enable-check;--port=3306;*/ #目标数据库连接字符串
inception_magic_start;  #必须:语句块开始(开始结束间为sql脚本)
use test;  
CREATE TABLE inc_table(id int);  
inception_magic_commit;	#必须:语句块结束
           

但是,目前只支持通过C/C++接口、Python接口来对Inception访问。所以现在测试使用 python 脚本连接 inception 去审核语句。创建 python 脚本,内容如下:

#!/usr/bin/python
#-*- coding: utf-8 -*-
#Python 2.7.5

import MySQLdb

sql="""/*--user=root;--password=mysql;--host=10.10.10.10;--enable-check;--port=3306;*/  
inception_magic_start;  
use test;  
CREATE TABLE inc_table(id int);  
inception_magic_commit;"""
try:
    conn=MySQLdb.connect(host='10.10.10.10',user='',passwd='',db='',port=6669)
    cur=conn.cursor()
    ret=cur.execute(sql)
    result=cur.fetchall()
    num_fields = len(cur.description) 
    field_names = [i[0] for i in cur.description]
    print field_names
    for row in result:
        print row[0], "|",row[1],"|",row[2],"|",row[3],"|",row[4],"|",row[5],"|",row[6],"|",row[7],"|",row[8],"|",row[9],"|",row[10]
    cur.close()
    conn.close()
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])
           

返回结果为:

['ID', 'stage', 'errlevel', 'stagestatus', 'errormessage', 'SQL', 'Affected_rows', 'sequence', 'backup_dbname', 'execute_time', 'sqlsha1']
1 | CHECKED | 0 | Audit completed | None | use test | 0 | '0_0_0' | None | 0 | 
2 | CHECKED | 1 | Audit completed | Set engine to innodb for table 'inc_table'.
Set charset to one of 'utf8' for table 'inc_table'.
Column 'id' in table 'inc_table' have no comments.
Column 'id' in table 'inc_table' is not allowed to been nullable.
Set a primary key for table 'inc_table'. | CREATE TABLE inc_table(id int) | 0 | '0_0_1' | 10_10_10_10_3306_test | 0 | 
           

 

接下来继续安装 WEB 端的审核平台 yearning 。Yearning 是基于Inception的web可视化SQL审核平台,其本身只提供可视化交互页面并不具备sql审核的能力。所以必须搭配Inception一起使用。建议使用者先熟悉Inception使用方法后再进行使用!

接下来Yearning 部署参考: MySQL 审核平台 Yearning 部署

Â