Đăng nhập kiểm toán trên cơ sở dữ liệu MySQL


11

Có cách nào để kiểm toán đăng nhập vào MySQL không? Tôi muốn có thể tạo tên người dùng cho mỗi nhân viên và từ đó tạo ra một bản kiểm tra đăng nhập. Tuy nhiên, googling đã bật lên không có kết quả tốt.

Chúng ta càng có thể kiểm toán, càng tốt. Ít nhất, thật tuyệt khi biết ai đã đăng nhập khi nào. Sẽ tốt hơn nữa khi xem ai thực hiện truy vấn nào khi nào. Các nhật ký chủ yếu ở đó để nói với khách hàng chúng tôi có chúng vì có thông tin nhạy cảm trong cơ sở dữ liệu.

Rõ ràng, việc có thể kiểm tra các truy vấn được thực hiện bởi mỗi người dùng (và khi nào) cũng sẽ cho chúng ta khả năng xác định chính xác ai là nguyên nhân của vấn đề bảo mật nếu cần phát sinh.


1
Chính xác những gì bạn đang tìm kiếm để kiểm toán? Tôi đoán bạn có nghĩa là bạn sẽ sử dụng tên người dùng MySQL, không phải tên người dùng hệ thống? Làm thế nào để bạn có ý định sử dụng dữ liệu kiểm toán sau này (có nghĩa là những chi tiết nào quan trọng ở đây, việc ghi nhật ký hệ thống là đủ thay vì đăng nhập MySQL). Càng nhiều thông tin bạn có thể cung cấp trong câu hỏi của mình, chúng tôi càng có thể cung cấp cho bạn câu trả lời chính xác và nhanh chóng khởi động. Tôi tưởng tượng bạn muốn có một câu trả lời tốt hơn là "yêu cầu ứng dụng của bạn thực hiện một cuộc gọi quay vòng cụ thể trước khi hoạt động khác" ~ Tóm lại, bạn sẽ cần những chi tiết nào từ tôi nếu tôi hỏi điều này?
jcolebrand

Câu trả lời:


6

Bạn có thể muốn sử dụng nhật ký truy vấn chung .

Nhật ký truy vấn chung là một bản ghi chung về những gì mysqld đang làm. Máy chủ ghi thông tin vào nhật ký này khi máy khách kết nối hoặc ngắt kết nối và nó ghi nhật ký từng câu lệnh SQL nhận được từ máy khách.

Một điều quan trọng với việc đăng nhập để bảo mật là kẻ tấn công không thể truy cập vào nhật ký để xóa dấu vết của sự hiện diện của chúng, vì vậy hãy xem xét các tệp chỉ nối thêm .

FWIW trong Oracle chúng ta có thể gửi nhật ký tự động đến một nhật ký hệ thống từ xa , nhưng tôi không tin rằng MySQL đã có tính năng này. Có lẽ bạn có thể giả mạo nó với SNMP nhưng tôi chưa thử.



Thật tuyệt, học được điều mới mỗi ngày :-)
Gaius

5

Câu trả lời của @Gauis là tuyệt vời. Để thêm vào nó, bạn có thể như sau:

MySQL 5.1 hiện cho phép lưu trữ nhật ký chung và nhật ký truy vấn chậm dưới dạng bảng SQL.

Thêm phần này vào /etc/my.cnf:

[mysqld]
log-output=TABLE
log

Khởi động lại mysql

Sau đó, khi mysqld tạo nhật ký chung, thay vì tệp văn bản, nó sẽ tạo bảng dưới dạng bảng CSV trong thư mục / var / lib / mysql / mysql (cơ sở dữ liệu lược đồ mysql).

Chỉ cần làm điều này để thấy nó:

SHOW CREATE TABLE mysql.general_log\G

Tất cả các kết nối sẽ chồng chất trong đó.

Đối với bạn, điều đó không hữu ích lắm khi truy vấn nó. Nó sẽ chỉ là một lần quét toàn bộ bảng mỗi lần.

Phải làm sao đây ??? CHUYỂN ĐỔI CHO MyISAM và INDEX BẢNG !!!!

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;

Tùy chọn, bạn có thể muốn đặt một chỉ mục toàn văn bản trên trường đối số.

Tôi vừa thiết lập MySQL 5.5.9 trên máy chủ và dùng thử. Đây là kết quả:

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)

Bây giờ, bạn có thể truy vấn bằng dấu thời gian và tìm kiếm các mã thông báo cụ thể trong trường đối số.

Ví dụ, thông báo dòng 4 của CHỌN tôi đã làm. Đăng nhập của tôi đã được ghi lại trong trường đối số là lwdba@127.0.0.1 on. Bạn có thể theo dõi những điều này.

Điều gì sẽ xảy ra nếu vị tướng trở nên quá lớn (Tin tôi đi, nó sẽ trở nên quá lớn rất nhanh)

Phải làm sao đây ???

  1. tắt máy tính
  2. di chuyển general_log.frm, general_log.MYD và general_log.MYI sang một ổ đĩa khác (và lớn hơn).
  3. Tạo ba liên kết tượng trưng đến general_log.frm, general_log.MYD và general_log.MYI từ / var / lib / mysql / mysql
  4. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI trên ổ đĩa mới
  5. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI symlink trong / var / lib / mysql / mysql
  6. bắt đầu sao lưu

BTW Khi bạn đã đăng nhập chung ngoại tuyến, bạn có thể chạy chúng để thu thập các thông tin đăng nhập riêng biệt đã làm một cái gì đó trong 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;

Tôi có một máy khách với 3 máy chủ DB. Eeach với DB Server có hơn 1.000.000.000 (1 tỷ [nghìn triệu]) dòng trong đó. Kịch bản trên mất khoảng 2,5 giờ để hoàn thành. Bảng Aud_user_host đã kết thúc với 27 thông tin đăng nhập riêng biệt.

Bạn sẽ được tốt để đi.

Hãy vui vẻ với điều này, mọi người !!!


Bài báo tuyệt vời! Chỉ cần chia sẻ thử nghiệm của tôi. Tôi đã thử đổi tên bảng mysql.general_log và phân vùng bảng cho mục đích thanh trừng nhưng sẽ không đăng nhập vào bảng. Vì vậy, tôi chuyển nó trở lại bảng MyIsam không phân vùng. Cảm ơn!

1

Thay vì thực hiện quá nhiều thứ theo cách thủ công, chỉ cần cài đặt plugin Audit để hiểu rõ hơn ở cấp độ người dùng

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

Tuy nhiên, nó có sẵn trên các phiên bản MySQL thương mại được chọn, thật tuyệt nếu có bất kỳ ngã ba MySQL nào thêm vào phiên bản cộng đồng để hầu hết mọi người đều có được lợi ích của tính năng này, nếu không chúng tôi phải dựa vào giải pháp được cung cấp bởi @RolandoMyQueryDBA.


0

@statichippo
Cách cài đặt đăng nhập kiểm toán trên MySQL.
+ Ghi nhật ký kiểm toán chỉ hỗ trợ MySQL Enterprise
+ Bạn có thể cài đặt ghi nhật ký kiểm toán trên Cộng đồng MySQL:
1. Sao chép tệp aud_log.so bằng cách bạn có thể cài đặt MySQL Enterprise Trial, sau đó sao chép tệp aud_log.so vào Cộng đồng MySQL.
2. Sao chép aud_log.so vào plugin_dir dưới dạng / usr / lib64 / mysql / plugin hoặc bạn có thể hiển thị thư mục plugin bằng cách: Truy
cập bảng điều khiển mysql: mysql> hiển thị các biến toàn cục như '% plugin%';
3. Cài đặt ghi nhật ký kiểm toán dưới dạng:
mysql> INSTALL PLUGIN aud_log SONAME 'aud_log.so';
mysql HIỂN THỊ BIỂU TƯỢNG THÍCH 'aud_log%';
4.
Ghi nhật ký kiểm toán đầu ra: tail -f /var/lib/mysql/audit.log

Cảm ơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.