ตรวจสอบการเข้าสู่ระบบในฐานข้อมูล MySQL


11

มีวิธีตรวจสอบการเข้าสู่ระบบ MySQL หรือไม่ ฉันต้องการที่จะสามารถสร้างชื่อผู้ใช้สำหรับพนักงานแต่ละคนและดังนั้นจึงสร้างเส้นทางการตรวจสอบของการเข้าสู่ระบบ อย่างไรก็ตาม googling กลับไม่ได้ผลลัพธ์ที่ดี

ยิ่งเราตรวจสอบได้มากเท่าไหร่ก็ยิ่งดีเท่านั้น อย่างน้อยที่สุดมันก็ดีที่รู้ว่าใครเข้าระบบเมื่อ มันจะดียิ่งขึ้นถ้าดูว่าใครดำเนินการสืบค้นเมื่อใด บันทึกส่วนใหญ่จะมีการบอกลูกค้าว่าเรามีพวกเขาเนื่องจากมีข้อมูลที่อาจอ่อนไหวในฐานข้อมูล

เห็นได้ชัดว่าความสามารถในการตรวจสอบแบบสอบถามที่ดำเนินการโดยผู้ใช้แต่ละคน (และเมื่อ) จะทำให้เราสามารถระบุได้ดีขึ้นว่าใครเป็นสาเหตุของปัญหาด้านความปลอดภัยหากควรเกิดขึ้น


1
คุณต้องการตรวจสอบอะไร ฉันคิดว่าคุณหมายความว่าคุณจะใช้ชื่อผู้ใช้ MySQL ไม่ใช่ชื่อผู้ใช้ระบบ? คุณตั้งใจจะใช้ข้อมูลการตรวจสอบในภายหลัง (หมายถึงรายละเอียดที่สำคัญที่นี่การบันทึกระบบจะเพียงพอหรือไม่แทนการบันทึก MySQL) ข้อมูลเพิ่มเติมที่คุณสามารถให้ในคำถามของคุณยิ่งเราสามารถให้คำตอบและบูตได้อย่างรวดเร็ว ฉันคิดว่าคุณต้องการคำตอบที่ดีกว่า "ให้แอพโทรหา sproc เฉพาะเจาะจงก่อนดำเนินการอื่น ๆ " ~ โดยสรุปคุณต้องการรายละเอียดอะไรจากฉันถ้าฉันถามคำถามนี้
jcolebrand

คำตอบ:


6

คุณอาจจะต้องการที่จะใช้บันทึกแบบสอบถามทั่วไป

บันทึกแบบสอบถามทั่วไปเป็นบันทึกทั่วไปของสิ่งที่ mysqld กำลังทำอยู่ เซิร์ฟเวอร์เขียนข้อมูลลงในบันทึกนี้เมื่อลูกค้าเชื่อมต่อหรือยกเลิกการเชื่อมต่อและบันทึกคำสั่ง SQL ที่ได้รับจากลูกค้าแต่ละราย

สิ่งหนึ่งที่สำคัญที่มีการบันทึกสำหรับการรักษาความปลอดภัยที่ผู้โจมตีไม่สามารถเข้าถึงเข้าสู่ระบบเพื่อลบร่องรอยของการแสดงตนของพวกเขาเพื่อพิจารณาไฟล์ผนวกเท่านั้น

FWIW ใน Oracle เราสามารถส่งบันทึกโดยอัตโนมัติไปยังsyslog ระยะไกลแต่ฉันไม่เชื่อว่า MySQL มีคุณสมบัตินี้ บางทีคุณอาจปลอมด้วย SNMP แต่ฉันไม่ได้ลอง



โอ้เยี่ยมมากเรียนรู้สิ่งใหม่ทุกวัน :-)
ออกุสตุส

5

คำตอบของ @Gauis นั้นยอดเยี่ยม หากต้องการเพิ่มเพิ่มเติมคุณสามารถทำสิ่งต่อไปนี้:

ขณะนี้ MySQL 5.1 อนุญาตให้จัดเก็บบันทึกทั่วไปและบันทึกแบบสอบถามช้าเป็นตาราง SQL

เพิ่มไปยัง /etc/my.cnf:

[mysqld]
log-output=TABLE
log

รีสตาร์ท mysql

จากนั้นเมื่อ mysqld สร้างบันทึกทั่วไปแทนที่จะเป็นไฟล์ข้อความมันจะสร้างตารางเป็นตาราง CSV ในโฟลเดอร์ / var / lib / mysql / mysql (ฐานข้อมูล mysql schema)

เพียงทำสิ่งนี้เพื่อดู:

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;

คุณอาจต้องการใส่ดัชนี fulltext ลงในฟิลด์อาร์กิวเมนต์

ฉันเพิ่งติดตั้ง 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      | 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)

ตอนนี้คุณสามารถเคียวรีด้วยการประทับเวลาและค้นหาโทเค็น specfic ในฟิลด์อาร์กิวเมนต์

ตัวอย่างเช่นสังเกตบรรทัดที่ 4 ของ SELECT ที่ฉันทำ lwdba@127.0.0.1 onในการเข้าสู่ระบบของฉันได้รับการบันทึกในเขตอาร์กิวเมนต์เป็น คุณสามารถติดตามสิ่งเหล่านี้

เกิดอะไรขึ้นถ้านายพลใหญ่เกินไป (เชื่อฉันสิมันจะใหญ่เกินไปเร็วมาก)

จะทำอย่างไร ???

  1. ปิด mysql
  2. ย้าย general_log.frm, general_log.MYD และ general_log.MYI ไปยังดิสก์เมานต์อื่น (และ hopefull ใหญ่กว่า)
  3. สร้าง symlink สามรายการไปที่ general_log.frm, general_log.MYD และ general_log.MYI จาก / var / lib / mysql / mysql
  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 symlinks ใน / var / lib / mysql / mysql
  6. เริ่ม mysql สำรอง

BTW เมื่อคุณมีบันทึกทั่วไปที่ออฟไลน์คุณสามารถเรียกใช้สิ่งเหล่านี้เพื่อรวบรวมการเข้าสู่ระบบที่แตกต่างที่ทำอะไรใน 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 Eeach กับ DB Server มีสายมากกว่า 1,000,000,000 (1 พันล้าน [พันล้าน]) สคริปต์ด้านบนใช้เวลาประมาณ 2.5 ชั่วโมงจึงจะเสร็จสมบูรณ์ ตาราง audit_user_host สิ้นสุดลงด้วยการล็อกอินที่แตกต่างกัน 27 รายการ

คุณควรจะไปดี

ขอให้สนุกกับสิ่งนี้ทุกคน !!!


สุดยอดบทความ! เพียงแบ่งปันการทดสอบของฉัน ฉันพยายามเปลี่ยนชื่อตาราง mysql.general_log และแบ่งพาร์ติชั่นตารางเพื่อล้างข้อมูล แต่จะไม่เข้าสู่ระบบในตาราง ดังนั้นฉันจะสลับกลับไปที่ตาราง MyIsam ที่ไม่ได้แบ่งพาร์ติชัน ขอบคุณ!

1

แทนที่จะทำสิ่งต่างๆด้วยตนเองเพียงแค่ติดตั้งปลั๊กอินตรวจสอบที่ให้ข้อมูลเชิงลึกมากขึ้นในระดับผู้ใช้

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

มีให้บริการในรุ่น MySQL เชิงพาณิชย์ที่เลือกไว้ แต่ก็คงจะดีถ้ามีตัวแยก MySQL ใด ๆ ที่เพิ่มในรุ่นชุมชนเช่นกันเพื่อให้คนส่วนใหญ่ได้รับประโยชน์จากคุณลักษณะนี้มิฉะนั้นเราต้องพึ่งพาโซลูชันที่ @RolandoMySQLDBA ให้


0

@statichippo
วิธีการติดตั้งการบันทึกการตรวจสอบบน MySQL
+ การบันทึกการตรวจสอบสนับสนุนเฉพาะ MySQL Enterprise
+ คุณสามารถติดตั้งการบันทึกการตรวจสอบในชุมชน MySQL:
1. คัดลอกไฟล์ audit_log.so โดยคุณสามารถติดตั้ง MySQL Enterprise Trial แล้วคัดลอกไฟล์ audit_log.so ไปยังชุมชน MySQL
2. คัดลอก audit_log.so ไปยัง plugin_dir เป็น / usr / lib64 / mysql / plugin หรือคุณสามารถแสดงปลั๊กอิน dir โดย:
ไปที่คอนโซล mysql: mysql> แสดงตัวแปรทั่วโลกเช่น '% plugin%';
3. ติดตั้งการบันทึกการตรวจสอบบัญชีเป็น:
mysql> ติดตั้ง PLUGIN audit_log SONAME 'audit_log.so';
mysql> SHOW VARIABLES LIKE 'audit_log%';
4. การบันทึกการตรวจสอบผลลัพธ์:
tail -f /var/lib/mysql/audit.log

ขอบคุณมาก.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.