mysql安全-数据库审计(audit)


目录(?)[+]

1 简介

    数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。
    在MySQL数据库中(5.5版本),增加了一个新的插件:Audit plugin,用于对数据库连接和数据库操作进行审计。该插件在mysql5.6.20 企业版及其后续版本才比较完善。

2 audit插件安装

    可通过两种方式加载
    2.1 配置my.cnf文件
[sql]  view plain copy
  1. [mysqld]  
  2. plugin-load=audit_log.so  
    如果想要在运行过程中该插件不被移除,配置如下
[sql]  view plain copy
  1. [mysqld]  
  2. plugin-load=audit_log.so  
  3. audit-log=FORCE_PLUS_PERMANENT  
    该加载方式不会被注册到mysql.plugins表中,如果在my.cnf中移除配置选项将会导致审计失败。
    2.2 在mysql中动态加载
    进入mysql数据库执行如下sql语句
[sql]  view plain copy
  1. mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';  
    该选项会被注册到mysql.plugins表中,数据库后续的重启,该插件都会被加载。

    加载成功后查看状态
mysql安全-数据库审计(audit)_第1张图片
    注:演示使用的mysql版本为5.6.21企业版
    2.3 查看所有加载的插件
    可通过如下两个命令查看所有已经加载的插件
[sql]  view plain copy
  1. mysql> SHOW PLUGINS;  
  2. mysql> select * from INFORMATION_SCHEMA.PLUGINS;  

mysql安全-数据库审计(audit)_第2张图片

    mysql> SHOW PLUGINS;

mysql安全-数据库审计(audit)_第3张图片

3 audit.log日志文件格式

    3.1 格式变更方法:
    audit.log文件格式有两种,OLD和NEW,5.6.14之后增加了新的日志格式,通过参数audit_log_format 来控制。更改日志格式需要以下三个步骤:
    step1:关闭数据库
    step2:重命名当前的audit.log文件
    step3:更改audit_log_format参数,并重启mysql,重启后会自动生成一个新的audit.log文件
    3.2 文件介绍(NEW格式)
    文件内容举例

[sql]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <AUDIT>  
  3.  <AUDIT_RECORD>  
  4.   <TIMESTAMP>2013-09-17T15:03:24 UTC</TIMESTAMP>  
  5.   <RECORD_ID>1_2013-09-17T15:03:24</RECORD_ID>  
  6.   <NAME>Audit</NAME>  
  7.   <SERVER_ID>1</SERVER_ID>  
  8.   <VERSION>1</VERSION>  
  9.   <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld  
  10.     --socket=/usr/local/mysql/mysql.sock  
  11.     --port=3306</STARTUP_OPTIONS>  
  12.   <OS_VERSION>x86_64-osx10.6</OS_VERSION>  
  13.   <MYSQL_VERSION>5.7.2-m12-log</MYSQL_VERSION>  
  14.  </AUDIT_RECORD>  
  15.  <AUDIT_RECORD>  
  16.   <TIMESTAMP>2013-09-17T15:03:40 UTC</TIMESTAMP>  
  17.   <RECORD_ID>2_2013-09-17T15:03:24</RECORD_ID>  
  18.   <NAME>Connect</NAME>  
  19.   <CONNECTION_ID>2</CONNECTION_ID>  
  20.   <STATUS>0</STATUS>  
  21.   <STATUS_CODE>0</STATUS_CODE>  
  22.   <USER>root</USER>  
  23.   <OS_LOGIN></OS_LOGIN>  
  24.   <HOST>localhost</HOST>  
  25.   <IP>127.0.0.1</IP>  
  26.   <COMMAND_CLASS>connect</COMMAND_CLASS>  
  27.   <PRIV_USER>root</PRIV_USER>  
  28.   <PROXY_USER></PROXY_USER>  
  29.   <DB>test</DB>  
  30.  </AUDIT_RECORD>  
  31.   
  32. ...  
  33.   
  34.  <AUDIT_RECORD>  
  35.   <TIMESTAMP>2013-09-17T15:03:41 UTC</TIMESTAMP>  
  36.   <RECORD_ID>4_2013-09-17T15:03:24</RECORD_ID>  
  37.   <NAME>Query</NAME>  
  38.   <CONNECTION_ID>2</CONNECTION_ID>  
  39.   <STATUS>0</STATUS>  
  40.   <STATUS_CODE>0</STATUS_CODE>  
  41.   <USER>root[root] @ localhost [127.0.0.1]</USER>  
  42.   <OS_LOGIN></OS_LOGIN>  
  43.   <HOST>localhost</HOST>  
  44.   <IP>127.0.0.1</IP>  
  45.   <COMMAND_CLASS>drop_table</COMMAND_CLASS>  
  46.   <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>  
  47.  </AUDIT_RECORD>  
  48.   
  49. ...  
  50.   
  51.  <AUDIT_RECORD>  
  52.   <TIMESTAMP>2013-09-17T15:03:47 UTC</TIMESTAMP>  
  53.   <RECORD_ID>10_2013-09-17T15:03:24</RECORD_ID>  
  54.   <NAME>Quit</NAME>  
  55.   <CONNECTION_ID>3</CONNECTION_ID>  
  56.   <STATUS>0</STATUS>  
  57.   <STATUS_CODE>0</STATUS_CODE>  
  58.   <USER></USER>  
  59.   <OS_LOGIN></OS_LOGIN>  
  60.   <HOST></HOST>  
  61.   <IP></IP>  
  62.   <COMMAND_CLASS>connect</COMMAND_CLASS>  
  63.  </AUDIT_RECORD>  
  64.  <AUDIT_RECORD>  
  65.   <TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP>  
  66.   <RECORD_ID>11_2013-09-17T15:03:24</RECORD_ID>  
  67.   <NAME>NoAudit</NAME>  
  68.   <SERVER_ID>1</SERVER_ID>  
  69.  </AUDIT_RECORD>  
  70. </AUDIT>  
    各标签元素解释
    <audit>:
文件的根标签为<AUDIT>,并以 </AUDIT>为结束标签
    <AUDIT_RECORD> :包含一系列的必选标签和可选标签,可选标签是否出现取决于audit record类型。
    <NAME>:必选,例如<NAME>Query</NAME>,可能出现的值还包含Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, Time.
     <RECORD_ID>:必选,例如<RECORD_ID>28743_2013-09-18T21:03:24</RECORD_ID>,包含一些列数字和时间戳,数字表示的是记录数,每增加一条记录,数字加1.
     <TIMESTAMP>:必选,例如<TIMESTAMP>2013-09-17T15:03:49 UTC</TIMESTAMP>,包含时间戳和时区两部分,记录的是从客户端接收到的sql执行完时刻的时间。
    以下标签audit record类型决定是否出现
    <COMMAND_CLASS>:
命令的类型。例如<COMMAND_CLASS>drop_table</COMMAND_CLASS>.
     <CONNECTION_ID>:例如<CONNECTION_ID>127</CONNECTION_ID>,代表客户端连接标识符的无符号整型数字。
     <DB>:mysql连接的默认数据库名称,该标签只在 <NAME>值是Connect或Change user时出现.
    <HOST>:client端的主机名,该标签只在 <NAME>值是Connect,Change user或Query时出现,例如<HOST>localhost</HOST>。
    <IP>:client端的IP地址,该标签只在 <NAME>值是Connect,Change user或Query时出现,例如<IP>127.0.0.1</IP>。
     <MYSQL_VERSION>:mysql版本号,只在 <NAME>值是Audit时出现,例如<MYSQL_VERSION>5.7.1-m11-log</MYSQL_VERSION>
     <OS_LOGIN>:外部用户,该标签只在 <NAME>值是Connect,Change user或Query时出现。
    <OS_VERSION>:表示运行数据库的服务器的操作系统,只在 <NAME>值是Audit时出现,例如<OS_VERSION>x86_64-Linux</OS_VERSION>。
    <PRIV_USER>:服务器认证的客户端名称。该标签只在 <NAME>值是Connect或Change user时出现。例如<PRIV_USER>root</PRIV_USER>。
    <PROXY_USER>:通过proxy连接到mysql的用户。该标签只在 <NAME>值是Connect或Change user时出现。
    <SERVER_ID>:mysql数据库服务器的ID号,该标签只在 <NAME>值是Audit或No Audit时出现。例如<SERVER_ID>1</SERVER_ID>。
    <SQLTEXT>:实际执行的SQL语句。该标签只在 <NAME>值是 Query 或 Execute时出现。例如<SQLTEXT>DELETE FROM t1</SQLTEXT>。
    <STARTUP_OPTIONS>:mysql数据库启动选项,该标签只在 <NAME>值是Audit时出现,例如<STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld --port=3306 --log-output=FILE</STARTUP_OPTIONS>
    <STATUS>:代表sql命令的执行状态,0表示成功,其余表示有错误。例如<STATUS>1051</STATUS>。
    <STATUS_CODE>:代表sql命令的执行状态,0表示成功,1表示有错误。例如<STATUS_CODE>0</STATUS_CODE>。
    <USER>:客户端连接mysql服务器的用户名。例如<USER>root[root] @ localhost [127.0.0.1]</USER>。
    <VERSION>:表示日志文件格式的版本号。该标签只在 <NAME>值是Audit时出现。例如<VERSION>1</VERSION>。

4 日志文件控制

    Audit日志文件名称
    可以通过参数audit_log_file来控制日志文件名称和存放路径,默认路径为mysql的data目录,默认名称为audit.log。
    Audit日志审计策略
    可以通过参数audit_log_strategy来控制日志审计策略,默认为ASYNCHRONOUS(异步),可选值为SYNCHRONOUS,SEMISYNCHRONOUS和PERFORMANCE。
    ASYNCHRONOUS:先将日志写进buffer,buffer写满后才刷进磁盘。
    SYNCHRONOUS:同步刷盘,每次事件都调用sync()
    SEMISYNCHRONOUS:半同步方式刷盘,使用操作系统的缓存。
    PERFORMANCE:buffer写满后会丢掉后面的事件,在高负载的机器上使用该参数会丢掉部分事件。
    Audit日志存储空间管理
    审计日志提供了3个系统参数来控制日志文件的大小,分别是。
    audit_log_buffer_size:缓冲区大小,该缓冲区是一个单缓冲区,初始化时创建,程序结束时移除,该参数仅在audit_log_strategy为ASYNCHRONOUS(异步)模式下有效。
    audit_log_rotate_on_size:日志文件增长到多大开始轮换,记写新的日志文件,该参数默认为0。该参数不为0时会,当文件增长到制定大小时便重命名为一个后缀带时间戳的文件,然后创建新的日志文件记录审计日志。
    audit_log_flush:该参数仅在audit_log_rotate_on_size为0时有效,例如我们重命名了audit.log日志文件,该参数由OFF变为ON时,会产生一个新的audit.log日志文件。
    日志过滤
    我们可以过滤的事件包括用户账户以及状态。
    对账户的过滤主要通过audit_log_include_accounts和audit_log_exclude_accounts,即记录列表包含用户的审计日志和不记录列表包含用户的审计日志。这两个参数默认都为NULL,且同时只能有一个生效。例如设置仅记录如下用户的审计日志:
SET GLOBAL audit_log_include_accounts = 'user1@localhost,user2@localhost';
    状态过滤信息主要由3个参数来控制,分别是audit_log_policy,audit_log_connection_policy 及audit_log_statement_policy。

5 mysql audit使用限制

    审计文件audit.log默认存放在mysql安装目录的data目录下,且没有加密,应指定一个对数据库和用户有合法权限的安全目录。
    对存储过程和触发器不做审计。

    对load data infile操作不做审计。

****************************************************************************************
    原文地址:http://blog.csdn.net/jesseyoung/article/details/41116867
    博客主页:http://blog.csdn.net/jesseyoung
****************************************************************************************

你可能感兴趣的:(mysql安全-数据库审计(audit))