Accedere agli accessi sul database MySQL


11

C'è un modo per controllare gli accessi a MySQL? Mi piacerebbe essere in grado di creare un nome utente per ciascun dipendente e quindi creare una pista di controllo degli accessi. Tuttavia, googling non ha prodotto buoni risultati.

Più possiamo controllare, meglio è. Per lo meno, sarebbe bello sapere chi ha effettuato l'accesso quando. Sarebbe anche meglio vedere chi ha eseguito quale query quando. I registri servono principalmente per indicare ai clienti che li abbiamo, poiché nel database sono presenti informazioni potenzialmente sensibili.

Ovviamente, essere in grado di controllare le query eseguite da ciascun utente (e quando) ci darebbe anche la possibilità di individuare meglio chi è la causa di un problema di sicurezza se si dovesse presentare.


1
Cosa stai cercando di controllare? Presumo che intendi che userete i nomi utente MySQL, non i nomi utente di sistema? Come intende utilizzare i dati di controllo in un secondo momento (ovvero quali dettagli sono importanti qui, la registrazione del sistema sarebbe sufficiente invece della registrazione di MySQL). Più informazioni puoi fornire nella tua domanda, più esattamente possiamo darti una risposta e avviare rapidamente. Immagino che tu voglia una risposta migliore di "chiedi alla tua app di effettuare una chiamata sproc specifica prima di ogni altra operazione" ~ In breve, quali dettagli avresti bisogno da me se te lo chiedessi?
jcolebrand

Risposte:


6

Probabilmente vorrai utilizzare il registro generale delle query .

Il registro generale delle query è un registro generale di ciò che sta facendo mysqld. Il server scrive le informazioni in questo registro quando i client si connettono o si disconnettono e registra ogni istruzione SQL ricevuta dai client.

Una cosa importante con la registrazione per motivi di sicurezza è che un utente malintenzionato non può accedere al registro per cancellare le tracce della sua presenza, quindi considera i file di sola aggiunta .

FWIW in Oracle possiamo inviare automaticamente i log a un syslog remoto , ma non credo che MySQL abbia ancora questa funzione. Forse potresti fingere con SNMP ma non l'ho provato.



Oh figo, impara qualcosa di nuovo ogni giorno :-)
Gaius

5

La risposta di @Gauis è eccellente. Per aggiungere ulteriormente ad esso, è possibile quanto segue:

MySQL 5.1 ora consente di archiviare il registro generale e il registro delle query lente come tabelle SQL.

Aggiungi questo a /etc/my.cnf:

[mysqld]
log-output=TABLE
log

Riavvia mysql

Quindi, quando mysqld crea il registro generale, invece di un file di testo, creerà la tabella come tabella CSV nella cartella / var / lib / mysql / mysql (database dello schema mysql).

Basta fare questo per vederlo:

SHOW CREATE TABLE mysql.general_log\G

Tutte le connessioni si accumuleranno in esso.

Per te, questo non è molto utile quando si tratta di interrogarlo. Sarebbe solo una scansione della tabella completa ogni volta.

Cosa fare ??? CONVERTI A MyISAM e INDICE LA TABELLA !!!!

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;

Facoltativamente, potresti voler inserire un indice full-text nel campo argomento.

Ho appena installato MySQL 5.5.9 su un server e l'ho provato. Ecco il risultato:

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)

Ora puoi eseguire una query in base al timestamp e cercare token specifici nel campo argomento.

Ad esempio, nota la riga 4 di SELECT I. Il mio accesso è stato registrato nel campo argomento come lwdba@127.0.0.1 on. Puoi seguirli.

E se il generale diventa troppo grande (Credetemi, diventerà troppo grande molto velocemente)

Cosa fare ???

  1. spegnimento mysql
  2. sposta general_log.frm, general_log.MYD e general_log.MYI su un diverso (e si spera più grande) supporto per disco.
  3. Creare tre collegamenti simbolici a general_log.frm, general_log.MYD e general_log.MYI da / var / lib / mysql / mysql
  4. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI sul nuovo mount del disco
  5. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI symlink in / var / lib / mysql / mysql
  6. avviare il backup di mysql

A proposito, una volta portato il log generale offline, è possibile eseguirli per raccogliere gli accessi distinti che hanno fatto qualcosa in 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;

Ho un client con 3 server DB. Ogni server DB ha oltre 1.000.000.000 (1 miliardo [migliaia di milioni]) di linee. Il completamento dello script sopra ha richiesto circa 2,5 ore. La tabella audit_user_host è finita con 27 accessi distinti.

Dovresti essere bravo ad andare.

Divertiti con questo, tutti !!!


Ottimo articolo! Sto solo condividendo i miei test. Ho provato a rinominare la tabella mysql.general_log e partizionare la tabella a scopo di eliminazione ma non accederò alla tabella. Quindi torno alla tabella MyIsam non partizionata. Grazie!

1

Invece di fare così tante cose manualmente, basta installare il plug-in Audit che fornisce maggiori informazioni a livello di utente

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

È disponibile su alcune edizioni MySQL commerciali selezionate, Sarebbe stato fantastico se qualsiasi fork di MySQL fosse aggiunto anche nell'edizione della community in modo che la maggior parte delle persone potesse beneficiare di questa funzionalità, altrimenti dovremo fare affidamento sulla soluzione fornita da @RolandoMySQLDBA.


0

@statichippo
Come installare la registrazione di controllo su MySQL.
+ La registrazione di controllo supporta solo MySQL Enterprise
+ Puoi installare la registrazione di controllo sulla comunità MySQL:
1. Copia il file audit_log.so di Puoi installare MySQL Enterprise Trial, quindi copiare il file audit_log.so nella comunità MySQL.
2. Copia audit_log.so in plugin_dir come / usr / lib64 / mysql / plugin oppure puoi mostrare la directory dei plugin tramite:
Vai alla console mysql: mysql> mostra le variabili globali come '% plugin%';
3. Installa la registrazione di controllo come:
mysql> INSTALLA PLUGIN audit_log SONAME 'audit_log.so';
mysql> MOSTRA VARIABILI COME 'audit_log%';
4. Registrazione di controllo dell'output:
tail -f /var/lib/mysql/audit.log

Grazie molto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.