Yearning是基于Inception的可视化web端sql审核平台,Yearning SQL审计平台基于Vue.js与Django的整套sql审核平台解决方案,提供基于Inception的SQL检测及执行。
Yearning所需依赖:python >= 3.6、nginx、mysql >= 5.6、Inception
安装方法有两种,docker试用和正式环境部署
docker安装:
#docker run -it -d -p 80:80 -p 8000:8000 -e "HOST=宿主机ip"registry.cn-hangzhou.aliyuncs.com/cookie/yearning:v1.0.0
#docker exec -it container_id /bin/bash
#echo "from core.models import grained;grained.objects.get_or_create(username='admin', permissions={'ddl': '1', 'ddlcon': [], 'dml': '1', 'dmlcon': [], 'dic': '1', 'diccon': [], 'dicedit': '0', 'query': '1', 'querycon': [], 'user': '1', 'base': '1', 'dicexport': '0'})" | python3 manage.py shell
初始账号: admin 密码: Yearning_admin
注意:
由于目前镜像并没有将数据库数据存放目录挂载到宿主机所以不建议在正式环境中使用docker
建议在使用前评估及测试中使用
生产环境部署步骤:
一、nginx安装
1.1添加运行nginx服务进程的用户
#groupadd -r nginx
#chattr -i /etc/passwd /etc/shadow
#useradd -r -g nginx nginx
#chattr +i /etc/passwd /etc/shadow
1.2yum安装Nginx
#yum install nginx -y
二、MySQL5.7安装
2.1下载mysql的repo源
#wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
2.2安装mysql-community-release-el7-5.noarch.rpm包
#rpm -ivh mysql57-community-release-el7-11.noarch.rpm
2.3.安装mysql-server
#yum install -y mysql-community-server
三、Python3.6安装
3.1.安装依赖环境
# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
3.2下载Python3
# wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
3.3安装python3
# mkdir -p /usr/local/python3
# tar -zxvf Python-3.6.1.tgz
# cd Python-3.6.1
# ./configure --prefix=/usr/local/python3
#make && make install
# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
3.4将/usr/local/python3/bin加入PATH(可选)
# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/python3/bin
export PATH
3.5环境变量修改生效
# source ~/.bash_profile
四、Inception介绍
Inception是集审核、执行、回滚于一体的一个自动化运维系统,它是根据MySQL代码修改过来的,用它可以很明确的,详细的,准确的审核MySQL的SQL语句,它的工作模式和MySQL完全相同,可以直接使用MySQL客户端来连接,但不需要验证权限,它相对应用程序(上层审核流程系统等)而言,是一个服务器,在连接时需要指定服务器地址及Inception服务器的端口即可,而它相对要审核或执行的语句所对应的线上MySQL服务器来说,是一个客户端,它在内部需要实时的连接数据库服务器来获取所需要的信息,或者直接在在线上执行相应的语句及获取binlog等,Inception就是一个中间性质的服务。图1.1所示为Inception的架构。
Inception提供的功能很丰富,首先,它可以对提交的所有语句的语法分析,如果语法有问题,都会将相应的错误信息返回给审核者。 还提供语义分析,当一个表,库,列等信息不正确或者不符合规范的时候报错,或者使用了一个不存在的对象时报错等等。 还提供了很多针对SQL规范性约束的功能,这些DBA都是可以通过系统参数来配置的。 更高级的功能是,可以辅助DBA分析一条查询语句的性能,如果没有使用索引或者某些原因导致查询很慢,都可以检查。
还提供SQL语句的执行功能,可执行的语句类型包括常用的DML及DDL语句及truncate table等操作。 Inception 在执行 DML 时还提供生成回滚语句的功能,对应的操作记录及回滚语句会被存储在备份机器上面,备份机器通过配置Inception参数来指定。
项目地址:https://github.com/mysql-inception/inception
五、Inception安装
5.1 Git下载源码包
$ git clone https://github.com/mysql-inception/inception.git
5.2 安装依赖包
$ yum install gcc gcc-c++ cmake bison openssl-devel ncurses-devel MySQL-python –y
使用yum安装的bison版本会3.0以上,官方建议使用低于2.6版本的,不然会编译有问题。指定版本下载、安装步骤:
下载地址,选择合适的版本和压缩文件 http://ftp.gnu.org/gnu/bison/,这里下载的是bison-2.5.1.tar.xz这个版本的包。
解压
xz -d bison-2.5.1.tar.xz
tar -xvf bison-2.5.1.tar
安装
进入解压后的bison路径中,cd bison-2.5.1,按照正常的源码包依次编译安装即可。
./configure
make && make install
完成安装,检查Bison的版本,bison -V(记得之前要设置环境变量的,这里安装完之后直接就识别Bison命令了)。
5.3 开始编译安装
首先就是编译,在源码根目录下面有一个文件inception_build.sh,执行命令sh inception_build.sh,会输出使用方法。 实际上只需要执行inception_build.sh debug [Xcode]即可,后面的平台是可选的,如果不指定就是linux平台,而如果要指定是Xcode,就后面指定Xcode,而debug是编译的目录,编译之后,所有的生成文件都在这个目录下面,包括可执行文件Inception。可执行文件在debug/sql/目录下面(不同平台有可能不相同)。
$ cd inception
$ bash inception_build.sh debug [Xcode]
如果编译有以下报错:
解决办法:
#cmake -DWITH_DEBUG=OFF -DCMAKE_INSTALL_PREFIX=./inception -DMYSQL_DATADIR=./inception/data -DWITH_SSL=bundled -DCMAKE_BUILD_TYPE=RELEASE -DWITH_ZLIB=bundled -DMY_MAINTAINER_CXX_WARNINGS="-Wall -Wextra -Wunused -Wno-dev -Wwrite-strings -Wno-strict-aliasing -Wno-unused-parameter -Woverloaded-virtual" -DMY_MAINTAINER_C_WARNINGS="-Wall -Wextra -Wno-dev -Wunused -Wwrite-strings -Wno-strict-aliasing -Wdeclaration-after-statement" .
#sh -x inception_build.sh debug
#make -j6 && make install
编译完成之后,就是使用了,那么需要一个配置文件(inc.cnf):
$ cat /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=root
inception_remote_system_user=wzf1
inception_remote_backup_port=3306
inception_remote_backup_host=127.0.0.1
inception_support_charset=utf8mb4
inception_enable_nullable=0
inception_check_primary_key=1
inception_check_column_comment=1
inception_check_table_comment=1
inception_osc_min_table_size=1
inception_osc_bin_dir=/data/temp
inception_osc_chunk_time=0.1
inception_enable_blob_type=1
inception_check_column_default_value=1
5.4 启动Inception程序
启动方式和MySQL是一样的:
#nohup /data/inception/debug/mysql/bin/Inception --defaults-file=/etc/inc.cnf &
启动如果不报错的话,说明已经启动成功了,实际上很难让它报错,因为非常轻量级。注意:因为Inception支持OSC执行的功能,是通过调用pt-online-schema-change工具来做的,但如果Inception后台启动(&)的话,可能会导致pt-online-schema-change在执行完成之后,长时间不返回,进而导致Inception卡死的问题,这个问题官方后面会解决,但现阶段请尽量不要使用后台启动的方式,或者可以使用nohup Inception &的方式来启动。
启动成功之后,可以简单试一下看,通过MySQL客户端:
#mysql -uroot -h127.0.0.1 -P6669
登录上去之后,再执行一个命令:
mysql> inception get variables;
输出了所有的变量,恭喜你,已经启动成功了,都说了非常简单。
六、安装Yearning
6.1下载安装包
#git clone https://github.com/cookieY/Yearning.git
6.2编辑配置文件:
#vim /Yearning/src/deploy.conf
[mysql]
db = 所创建的库名
address = 数据库地址
port = 数据库端口
password = 数据库密码
username = 数据库用户
[host]
ipaddress = 服务器ip地址:端口 (涉及跨域十分重要!!设置不正确将无法登陆!!) 如 本机地址为192.168.1.2 nginx设置端口为80 则应填写为 192.168.1.2:80 之后通过该地址访问平台。
[Inception]
ip = Inception地址
port = Inception端口
user = Inception用户名
password = Inception密码
backupdb = 备份数据库地址
backupport = 备份数据库端口
backupuser = 备份数据库用户名
backuppassword = 备份数据库密码
[LDAP] LDAP相关设置
LDAP_SERVER = LDAP服务地址
LDAP_SCBASE = LDAP dc 设置 如 dc=xxx,dc=com
LDAP_DOMAIN = LDAP域名 如 xxx.com
LDAP_TYPE = 1 1 通过域名进行ldap认证 0 通过uid进行ldap认证
[email] 邮箱推送相关设置
username = 邮箱发件账号 如 xxxx@163.com password = 邮箱发件账号密码
smtp_server = 邮箱stmp地址, 具体地址请咨询对应邮箱提供者
6.3安装相关依赖
#cd /Yearning/src/
#pip3 install -r requirements.txt 安装相应python依赖库
#python3 manage.py makemigrations && python3 manage.py migrate 初始化数据库
#echo "from core.models import Account;Account.objects.create_user(username='admin', password='Yearning_admin', group='admin',is_staff=1)" | python3 manage.py shell 添加初始化用户
#echo "from core.models import grained;grained.objects.get_or_create(username='admin', permissions={'ddl': '1', 'ddlcon': [], 'dml': '1', 'dmlcon': [], 'dic': '1', 'diccon': [], 'dicedit': '0', 'query': '1', 'querycon': [], 'user': '1', 'base': '1', 'dicexport': '0'})" | python3 manage.py shell 初始化权限
#cp -rf Yearning/webpage/dist/* $NGINX_HOME/html/ 复制编译好的静态文件到nginx html目录下(如自行更改Nginx静态路径地址则将静态文件复制到对应静态文件目录下)
#systemctl start nginx
#启动nginx python3 manage.py runserver 0.0.0.0:8000 启动django 访问deploy.conf 配置文件中ipaddress 填写的地址
默认账号: admin 密码:Yearning_admin
安装完成,浏览器输入ip默认使用80端口,会出现这个页面:
使用默认账号: admin 密码:Yearning_admin登陆即可使用,可能会出现登陆不了的情况(无法跳转页面),这是由于跨域的问题,解决这个问题可以参考:http://blog.csdn.net/apple9005/article/details/54427902
注意事项
默认超级管理员只拥有各个页面的访问权限,其他的权限需自行增加!详情请查看使用说明用户管理
由于Inception 并不原生支持pymysql,所以需更改pymysql相关源码
修改 $PYTHON_HOME/lib/python3.6/site-packages/pymysql下
connections.py 和 cursors.py 两个文件
找到 connections.py 1108行
if int(self.server_version.split('.', 1)[0]) >= 5:
self.client_flag |= CLIENT.MULTI_RESULTS
更改为
try:
if int(self.server_version.split('.', 1)[0]) >= 5:
self.client_flag |= CLIENT.MULTI_RESULTS
except:
if self.server_version.split('.', 1)[0] >= 'Inception2':
self.client_flag |= CLIENT.MULTI_RESULTS
找到 cursors.py 345行
if self._result and (self._result.has_next or not self._result.warning_count):
return
更改为
if self._result:
return
注: 在install 文件夹下有已经修改的connections.py 和 cursors.py 直接替换即可
参考链接: