Login audit pada database MySQL


11

Apakah ada cara untuk mengaudit login ke MySQL? Saya ingin dapat membuat nama pengguna untuk setiap karyawan dan dengan demikian membuat jejak audit login. Namun, googling tidak memberikan hasil yang baik.

Semakin kita bisa mengaudit, semakin baik. Paling tidak, akan lebih baik untuk mengetahui siapa yang login ketika. Akan lebih baik untuk melihat siapa yang mengeksekusi permintaan apa saat itu. Log ada di sana untuk memberi tahu klien bahwa kami memilikinya karena ada informasi sensitif yang berpotensi dalam database.

Jelas, mampu mengaudit pertanyaan yang dieksekusi oleh setiap pengguna (dan kapan) juga akan memberi kita kemampuan untuk menentukan dengan lebih baik siapa yang menjadi penyebab masalah keamanan jika harus muncul.


1
Apa yang sebenarnya ingin Anda audit? Saya kira Anda berarti Anda akan menggunakan nama pengguna MySQL, bukan nama pengguna sistem? Bagaimana Anda bermaksud menggunakan data audit nanti (artinya rincian apa yang penting di sini, apakah pencatatan sistem akan mencukupi dan bukan pencatatan MySQL). Semakin banyak informasi yang dapat Anda berikan dalam pertanyaan Anda, semakin tepatnya kami dapat memberikan jawaban kepada Anda, dan dengan cepat melakukan booting. Saya membayangkan Anda menginginkan jawaban yang lebih baik daripada "apakah aplikasi Anda membuat panggilan sproc spesifik sebelum operasi satu sama lain" ~ Singkatnya, detail apa yang akan Anda butuhkan dari saya jika saya menanyakan hal ini?
jcolebrand

Jawaban:


6

Anda mungkin ingin menggunakan log kueri umum .

Log kueri umum adalah catatan umum tentang apa yang dilakukan mysqld. Server menulis informasi ke log ini ketika klien terhubung atau terputus, dan mencatat setiap pernyataan SQL yang diterima dari klien.

Satu hal penting dengan pencatatan keamanan adalah penyerang tidak dapat mengakses log untuk menghapus jejak keberadaan mereka, jadi pertimbangkan file-file append-only .

FWIW di Oracle kami dapat mengirim log secara otomatis ke syslog jarak jauh , tapi saya belum percaya MySQL memiliki fitur ini. Mungkin Anda bisa memalsukannya dengan SNMP tetapi saya belum mencobanya.



Oh, keren, pelajari sesuatu yang baru setiap hari :-)
Gayus

5

Jawaban oleh @Gauis luar biasa. Untuk menambahkan lebih lanjut, Anda dapat mengikuti:

MySQL 5.1 sekarang memungkinkan menyimpan log umum dan log kueri lambat sebagai tabel SQL.

Tambahkan ini ke /etc/my.cnf:

[mysqld]
log-output=TABLE
log

Mulai ulang mysql

Kemudian, ketika mysqld membuat log umum, alih-alih file teks itu akan membuat tabel sebagai tabel CSV di folder / var / lib / mysql / mysql (database skema mysql).

Lakukan ini untuk melihatnya:

SHOW CREATE TABLE mysql.general_log\G

Semua koneksi akan menumpuk di dalamnya.

Bagi Anda, itu tidak terlalu berguna untuk menanyakannya. Itu hanya akan menjadi pemindaian tabel penuh setiap kali.

Apa yang harus dilakukan ??? CONVERT IT UNTUK MyISAM dan INDEX THE TABLE !!!!

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;

Secara opsional, Anda mungkin ingin meletakkan indeks teks lengkap pada bidang argumen.

Saya baru saja mengatur MySQL 5.5.9 di server dan mencoba ini. Inilah hasilnya:

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)

Sekarang, Anda dapat melakukan query berdasarkan cap waktu dan mencari token khusus di bidang argumen.

Misalnya, perhatikan baris 4 SELECT yang saya lakukan. Log masuk saya dicatat di bidang argumen sebagai lwdba@127.0.0.1 on. Anda dapat melacak ini.

Bagaimana jika sang jenderal terlalu besar (Percayalah, ia akan menjadi terlalu besar dengan sangat cepat)

Apa yang harus dilakukan ???

  1. shutdown mysql
  2. pindahkan general_log.frm, general_log.MYD, dan general_log.MYI ke disk mount yang berbeda (dan berharap lebih besar).
  3. Buat tiga symlink ke general_log.frm, general_log.MYD, dan general_log.MYI dari / var / lib / mysql / mysql
  4. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI pada disk mount baru
  5. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI symlinks di / var / lib / mysql / mysql
  6. mulai mysql kembali

BTW Setelah log umum offline, Anda dapat menjalankannya untuk mengumpulkan login berbeda yang melakukan sesuatu di 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;

Saya punya klien dengan 3 server DB. Eeach with DB Server memiliki lebih dari 1.000.000.000 (1 miliar [ribuan juta]) baris di dalamnya. Script di atas membutuhkan waktu 2,5 jam untuk selesai. Tabel audit_user_host berakhir dengan 27 login berbeda.

Anda harus baik untuk pergi.

Bersenang-senang dengan yang ini, semuanya !!!


Artikel bagus! Hanya berbagi pengujian saya. Saya mencoba mengubah nama tabel mysql.general_log dan mempartisi tabel untuk tujuan membersihkan tetapi tidak akan masuk dalam tabel. Jadi saya beralih kembali ke tabel MyIsam yang tidak dipartisi. Terima kasih!

1

Alih-alih melakukan begitu banyak hal secara manual, cukup instal plugin Audit yang memberikan lebih banyak wawasan di tingkat pengguna

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

Ini tersedia pada edisi MySQL komersial tertentu, Akan lebih bagus jika ada garpu MySQL yang ditambahkan dalam edisi komunitas juga sehingga sebagian besar orang mendapatkan manfaat dari fitur ini, jika tidak kita harus mengandalkan solusi yang disediakan oleh @Rando_MQLQLDBA.


0

@statichippo
Cara menginstal pendataan audit di MySQL.
+ Audit logging hanya mendukung MySQL Enterprise
+ Anda dapat menginstal audit logging di Komunitas MySQL:
1. Salin file audit_log.so dengan Anda dapat menginstal MySQL Enterprise Trial, lalu salin file audit_log.so ke Komunitas MySQL.
2. Salin audit_log.so ke plugin_dir sebagai / usr / lib64 / mysql / plugin atau Anda dapat menampilkan dir plugin dengan:
Buka konsol mysql: mysql> tampilkan variabel global seperti '% plugin%';
3. Instal pendataan audit sebagai:
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
mysql> TAMPILKAN VARIABEL SEPERTI 'audit_log%';
4. Pencatatan audit keluaran:
tail -f /var/lib/mysql/audit.log

Terimakasih banyak.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.