AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 668
Accepted
statichippo
statichippo
Asked: 2011-01-18 13:19:57 +0800 CST2011-01-18 13:19:57 +0800 CST 2011-01-18 13:19:57 +0800 CST

审计 MySQL 数据库上的登录

  • 772

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

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

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

mysql authentication
  • 4 4 个回答
  • 35445 Views

4 个回答

  • Voted
  1. Best Answer
    Gaius
    2011-01-18T13:57:24+08:002011-01-18T13:57:24+08:00

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

    一般查询日志是mysqld在做什么的一般记录。当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端接收到的每个 SQL 语句。

    安全日志记录的一件重要事情是攻击者无法访问日志以清除其存在的痕迹,因此请考虑仅附加文件。

    在 Oracle 中的 FWIW 我们可以自动将日志发送到远程 syslog,但我不相信 MySQL 还具有此功能。也许你可以用 SNMP 伪造它,但我还没有尝试过。

    • 7
  2. RolandoMySQLDBA
    2011-02-25T11:51:10+08:002011-02-25T11:51:10+08:00

    @Gauis 的回答非常好。要进一步添加它,您可以执行以下操作:

    MySQL 5.1 现在允许将一般日志和慢查询日志存储为 SQL 表。

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

    [mysqld]
    log-output=TABLE
    log
    

    重启mysql

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

    只需执行此操作即可查看:

    SHOW CREATE TABLE mysql.general_log\G
    

    所有的连接都会堆积在里面。

    对您来说,在查询它时这不是很有用。每次都只是一次全表扫描。

    该怎么办 ???将其转换为 MyISAM 并索引表!!!!

    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 并进行了尝试。结果如下:

    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      | [email protected] 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      | [email protected] 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 行。我的登录记录在参数字段中为[email protected] 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:mysql general_log.frm general_log.MYD general_log.MYI 符号链接在 /var/lib/mysql/mysql
    6. 启动mysql备份

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

    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;
    

    我有一个带有 3 个数据库服务器的客户端。每个带有 DB Server 的服务器中都有超过 1,000,000,000(10 亿 [ 万 ])行。上面的脚本大约需要 2.5 小时才能完成。audit_user_host 表最终有 27 个不同的登录。

    你应该很高兴。

    玩得开心,大家!!!

    • 6
  3. Mahesh Patil
    2012-11-03T06:39:58+08:002012-11-03T06:39:58+08:00

    无需手动执行很多操作,只需安装审核插件即可在用户级别提供更多洞察力

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

    它可以在选定的商业 MySQL 版本上使用,如果任何 MySQL 分支也添加到社区版本中会很棒,这样大多数人都能从这个功能中受益,否则我们必须依赖 @RolandoMySQLDBA 提供的解决方案。

    • 1
  4. Binh Nguyen
    2015-01-22T00:14:42+08:002015-01-22T00:14:42+08:00

    @statichippo
    如何在 MySQL 上安装审计日志。
    + 审计日志仅支持 MySQL Enterprise
    + 您可以在 MySQL Community 上安装审计日志:
    1. 复制文件 audit_log.so 您可以安装 MySQL Enterprise Trial,然后将文件 audit_log.so 复制到 MySQL Community。
    2. 将 audit_log.so 复制到 plugin_dir 作为 /usr/lib64/mysql/plugin 或者您可以通过以下方式显示插件目录:
    转到 mysql 控制台: mysql> show global variables like '%plugin%';
    3. 安装审计日志为:
    mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
    mysql> SHOW VARIABLES LIKE 'audit_log%';
    4.输出审计日志:
    tail -f /var/lib/mysql/audit.log

    非常感谢。

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve