MySQL veritabanında oturum açma denetimi


11

MySQL oturum açmalarını denetlemenin bir yolu var mı? Her çalışan için bir kullanıcı adı oluşturmak ve böylece girişlerin bir denetim izi oluşturmak istiyorum. Ancak, googling iyi sonuç vermedi.

Ne kadar çok denetleyebilirsek o kadar iyi olur. En azından kimin ne zaman giriş yaptığını bilmek güzel olurdu. Kimin hangi sorguyu ne zaman yürüttüğünü görmek daha da iyi olurdu. Günlükler, veritabanında potansiyel olarak hassas bilgiler bulunduğundan müşterilere sahip olduğumuzu söylemek için vardır.

Açıkçası, her kullanıcının (ve ne zaman) yürüttüğü sorguları denetleyebilmemiz, ortaya çıkması durumunda bir güvenlik sorununun nedenini kimin daha iyi tespit edebileceğimizi de sağlayacaktır.


1
Tam olarak neyi denetlemek istiyorsunuz? Sistem kullanıcı adlarını değil, MySQL kullanıcı adlarını kullanacağınızı söylüyorsunuz? Denetim verilerini daha sonra nasıl kullanmayı planlıyorsunuz (burada hangi ayrıntıların önemli olduğu anlamına gelir, MySQL günlüğü yerine sistem günlüğü yeterli olur). Sorunuzda ne kadar fazla bilgi verebilirseniz size tam olarak bir cevap verebiliriz ve hızlı bir şekilde önyükleme yapabiliriz. "Uygulamanızın birbirinden önce özel bir arama yapmasını sağlayın" dan daha iyi bir yanıt istediğinizi hayal ediyorum ~ Kısacası, bunu sorsaydım benden hangi ayrıntılara ihtiyacınız olurdu?
jcolebrand

Yanıtlar:


6

Muhtemelen genel sorgu günlüğünü kullanmak istersiniz .

Genel sorgu günlüğü mysqld ne yaptığını genel bir kaydıdır. İstemciler bağlandığında veya bağlantıyı kestiğinde sunucu bu günlüğe bilgi yazar ve istemcilerden alınan her SQL deyimini günlüğe kaydeder.

Güvenlik için günlüğe kaydetmeyle ilgili önemli bir şey, bir saldırganın varlıklarının izlerini silmek için günlüğe erişememesidir, bu nedenle yalnızca ek dosyaları düşünün .

Oracle'da FWIW, günlükleri otomatik olarak uzak bir sistem günlüğüne gönderebiliriz , ancak MySQL'in henüz bu özelliğe sahip olduğuna inanmıyorum. Belki de SNMP ile taklit edebilirsin ama denemedim.



Harika, her gün yeni bir şeyler öğren :-)
Gaius

5

@Gauis'in yanıtı mükemmel. Daha fazla eklemek için aşağıdakileri yapabilirsiniz:

MySQL 5.1 artık genel günlüğü ve yavaş sorgu günlüğünü SQL tabloları olarak depolamaya izin veriyor.

Bunu /etc/my.cnf dosyasına ekleyin:

[mysqld]
log-output=TABLE
log

MySQL'i yeniden başlat

Daha sonra, mysqld genel günlüğü oluşturduğunda, metin dosyası yerine tabloyu / var / lib / mysql / mysql klasöründe (mysql şema veritabanı) CSV tablosu olarak oluşturur.

Sadece görmek için bunu yap:

SHOW CREATE TABLE mysql.general_log\G

Tüm bağlantılar içeride birikecektir.

Sorgulama söz konusu olduğunda bu sizin için çok yararlı değildir. Her seferinde tam bir masa taraması olurdu.

Ne yapalım ??? MyISAM ve INDEX TABLO DÖNÜŞTÜR !!!!

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;

İsteğe bağlı olarak, bağımsız değişken alanına bir tam metin dizini koymak isteyebilirsiniz.

MySQL 5.5.9'u bir sunucuya kurdum ve bunu denedim. İşte sonuç:

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)

Şimdi, zaman damgasına göre sorgulayabilir ve bağımsız değişken alanında özel simgeler arayabilirsiniz.

Örneğin, yaptığım SELECT'in 4. satırına dikkat edin. Giriş yaptığım argüman alanına olarak kaydedildi lwdba@127.0.0.1 on. Bunları takip edebilirsiniz.

General çok büyürse (İnan bana çok hızlı büyüyecek)

Ne yapalım ???

  1. kapatma mysql
  2. general_log.frm, general_log.MYD ve general_log.MYI'yi farklı (ve umarım daha büyük) bir disk yuvasına taşıyın.
  3. General_log.frm, general_log.MYD ve general_log.MYI için / var / lib / mysql / mysql'den üç sembol oluşturun.
  4. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI yeni disk yuvasında
  5. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI simgeleri / var / lib / mysql / mysql içinde
  6. mysql yedeklemeyi başlat

BTW Genel günlüğü çevrimdışı duruma getirdikten sonra, mysqld'de bir şey yapan farklı girişleri toplamak için bunları çalıştırabilirsiniz:

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 sunucuları olan bir istemcim var. DB Server ile her birinin içinde 1.000.000.000 (1 milyar [binlerce milyon]) satır var. Yukarıdaki betiğin tamamlanması yaklaşık 2,5 saat sürdü. Audit_user_host tablosu 27 ayrı girişle sonuçlandı.

Gitmek için iyi olmalısın.

Herkes ile bu eğlenin !!!


Harika makale! Sadece testimi paylaşıyorum. Tablo mysql.general_log yeniden adlandırma denedim ve tasfiye amaçlı tablo bölümleme ama tabloda oturum açmaz. Bu yüzden onu bölümlenmemiş MyIsam tablosuna geri döndürürüm. Teşekkürler!

1

Manuel olarak çok fazla şey yapmak yerine, kullanıcı düzeyinde daha fazla bilgi veren Audit eklentisini yükleyin

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

Seçilmiş ticari MySQL sürümlerinde kullanılabilir, Topluluk sürümüne herhangi bir MySQL çatalı eklenirse harika olurdu, böylece insanların çoğu bu özellikten yararlanabilir, aksi takdirde @RolandoMySQLDBA tarafından sağlanan çözüme güvenmeliyiz.


0

@statichippo
MySQL üzerinde denetim günlüğü nasıl kurulur.
+ Denetim günlüğü yalnızca MySQL Enterprise'ı destekler
+ MySQL Topluluğuna denetim günlüğünü yükleyebilirsiniz:
1. Aud_log.so dosyasını kopyalayın MySQL Enterprise Deneme sürümünü yükleyebilir, sonra audit_log.so dosyasını MySQL Topluluğuna kopyalayabilirsiniz.
2. audit_log.so dosyasını plugin_dir dizinine / usr / lib64 / mysql / plugin olarak kopyalayın ya da eklenti dizinini şu şekilde gösterebilirsiniz:
mysql console: mysql> '% plugin%' gibi genel değişkenleri göster;
3. Denetim günlüğünü aşağıdaki gibi yükleyin:
mysql> PLUGIN INSTALL PLUGIN audit_log SONAME 'audit_log.so';
mysql> DEĞİŞİKLİKLERİ GÖSTER 'denetim_log%';
4. Çıktı denetim günlüğü:
tail -f /var/lib/mysql/audit.log

Çok teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.