首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对MySQL数据库的审计登录

对MySQL数据库的审计登录
EN

Database Administration用户
提问于 2011-01-17 21:19:57
回答 5查看 38.1K关注 0票数 13

有办法审核MySQL的登录吗?我希望能够为每个员工创建一个用户名,从而创建登录的审计跟踪。然而,谷歌搜索并没有发现好的结果。

我们越能审计越好。至少,知道谁什么时候登录是很好的。看谁什么时候执行什么查询就更好了。日志的存在主要是为了告诉客户我们有它们,因为数据库中有潜在的敏感信息。

显然,能够对每个用户执行的查询进行审计(以及何时执行)也将使我们能够更好地确定在出现安全问题时谁是造成安全问题的原因。

EN

回答 5

Database Administration用户

回答已采纳

发布于 2011-01-17 21:57:24

您可能希望使用通用查询日志

通用查询日志是mysqld所做工作的一般记录。当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端接收的每条SQL语句。

为了安全起见,日志记录的一个重要方面是,攻击者无法访问日志以清除其存在的痕迹,因此请考虑只附加文件

在Oracle中,我们可以自动将日志发送到远程syslog,但我认为MySQL还没有这个特性。也许你可以用SNMP伪造它,但我还没有试过。

票数 8
EN

Database Administration用户

发布于 2011-02-24 19:51:10

“Gauis”的答案很好。为了进一步添加,您可以这样做:

MySQL 5.1现在允许将常规日志和慢速查询日志存储为SQL。

将此添加到/etc/my.cnf:

代码语言:javascript
复制
[mysqld]
log-output=TABLE
log

重新启动mysql

然后,当mysqld创建通用日志时,它将创建该表作为/var/lib/mysql/mysql文件夹(mysql模式数据库)中的CSV表,而不是文本文件。

做这件事就是为了看:

代码语言:javascript
复制
SHOW CREATE TABLE mysql.general_log\G

所有的联系都会堆积在里面。

对你来说,在查询它的时候,这并不是很有用。每次都是一个完整的表格扫描。

怎么办?将其转换为MyISAM并对表进行索引!

代码语言:javascript
复制
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;

或者,您可能希望在参数字段上设置全文索引。

我刚刚在服务器上安装了MySQL 5.5.9,并尝试了这一点。结果如下:

代码语言:javascript
复制
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.9-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

iml-db10:3306 (DB (none)) :: show create table mysql.general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.01 sec)

iml-db10:3306 (DB (none)) :: SET @old_log_state = @@global.general_log;
Query OK, 0 rows affected (0.00 sec)

iml-db10:3306 (DB (none)) :: SET GLOBAL general_log = 'OFF';
Query OK, 0 rows affected (0.00 sec)

iml-db10:3306 (DB (none)) :: ALTER TABLE mysql.general_log ENGINE = MyISAM;
Query OK, 9 rows affected (0.02 sec)
Records: 9  Duplicates: 0  Warnings: 0

iml-db10:3306 (DB (none)) :: ALTER TABLE mysql.general_log ADD INDEX (event_time);
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

iml-db10:3306 (DB (none)) :: SET GLOBAL slow_query_log = @old_log_state;
Query OK, 0 rows affected (0.00 sec)

iml-db10:3306 (DB (none)) :: select * from mysql.general_log;
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
| event_time          | user_host                   | thread_id | server_id | command_type | argument                                  |
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
| 2011-02-24 14:42:18 | [lwdba] @  [127.0.0.1]      |         3 | 106451130 | Connect      | lwdba@127.0.0.1 on                        |
| 2011-02-24 14:42:18 | lwdba[lwdba] @  [127.0.0.1] |         3 | 106451130 | Query        | select @@version_comment limit 1          |
| 2011-02-24 14:42:18 | lwdba[lwdba] @  [127.0.0.1] |         3 | 106451130 | Query        | SHOW VARIABLES LIKE 'hostname'            |
| 2011-02-24 14:42:18 | lwdba[lwdba] @  [127.0.0.1] |         3 | 106451130 | Quit         |                                           |
| 2011-02-24 14:42:18 | [lwdba] @  [127.0.0.1]      |         4 | 106451130 | Connect      | lwdba@127.0.0.1 on                        |
| 2011-02-24 14:42:18 | lwdba[lwdba] @  [127.0.0.1] |         4 | 106451130 | Query        | select @@version_comment limit 1          |
| 2011-02-24 14:42:30 | lwdba[lwdba] @  [127.0.0.1] |         4 | 106451130 | Query        | show create table mysql.general_log       |
| 2011-02-24 14:43:54 | lwdba[lwdba] @  [127.0.0.1] |         4 | 106451130 | Query        | SET @old_log_state = @@global.general_log |
| 2011-02-24 14:44:00 | lwdba[lwdba] @  [127.0.0.1] |         4 | 106451130 | Query        | SET GLOBAL general_log = 'OFF'            |
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
9 rows in set (0.00 sec)

iml-db10:3306 (DB (none)) :: show create table mysql.general_log\G
*************************** 1. row ***************************
       Table: general_log
Create Table: CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL,
  KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)

现在,您可以按时间戳进行查询,并在参数字段中查找特定的标记。

例如,请注意我所做的SELECT第4行。我的登录记录在参数字段中被记录为lwdba@127.0.0.1 on。你可以追踪这些。

如果将军变大了怎么办(相信我,它会很快变大)

怎么办?

  1. 停工mysql
  2. 将general_log.frm、general_log.MYD和general_log.MYI移动到不同的磁盘挂载(以及更大的磁盘挂载)。
  3. 从/var/lib/mysql/mysql创建到general_log.frm、general_log.MYD和general_log.MYI的三个符号链接
  4. chown mysql:mysql general_log.frm general_log.MYD general_log.MYI上的新磁盘挂载
  5. chown mysql: /var/lib/mysql/mysql中的mysql general_log.frm general_log.MYD general_log.MYI符号链接
  6. 启动mysql备份

顺便说一句,一旦将普通日志脱机,您就可以运行这些日志来收集在mysqld中执行某些操作的不同登录:

代码语言:javascript
复制
SET SQL_LOG_BIN=0;
use mysql
DROP TABLE IF EXISTS audit_user_host;
CREATE TABLE audit_user_host
(
    user_host VARCHAR(32),
    PRIMARY KEY (user_host)
) ENGINE=MyISAM;
SHOW CREATE TABLE audit_user_host\G
INSERT IGNORE INTO mysql.audit_user_host SELECT user_host FROM mysql.general_log;
SELECT COUNT(1) FROM mysql.audit_user_host;

我有一个有3DB服务器的客户端。DB的Eeach中有超过1,000,000(10亿几亿)行。上面的脚本花了大约2.5个小时才完成。audit_user_host表以27个不同的登录结束。

你该走了。

大家玩得开心!

票数 7
EN

Database Administration用户

发布于 2012-11-02 14:39:58

不要手动做这么多事情,只需安装更具用户洞察力的审计插件即可。

http://www.mysql.com/products/enterprise/audit.html

不过,它可以在选定的商业MySQL版本中使用,如果社区版本中添加了任何MySQL叉,那么大多数人就可以从这个特性中获益,否则我们必须依赖@RolandoMySQLDBA提供的解决方案。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档