Auditoria de logins no banco de dados MySQL


11

Existe uma maneira de auditar logins no MySQL? Eu gostaria de poder criar um nome de usuário para cada funcionário e, assim, criar uma trilha de auditoria de logins. No entanto, o Google não apresentou bons resultados.

Quanto mais podemos auditar, melhor. No mínimo, seria bom saber quem fez login quando. Seria ainda melhor ver quem executou qual consulta quando. Os logs existem principalmente para informar aos clientes que os temos, pois há informações potencialmente confidenciais no banco de dados.

Obviamente, ser capaz de auditar as consultas executadas por cada usuário (e quando) também nos daria a capacidade de identificar melhor quem é a causa de um problema de segurança, se houver algum.


1
O que exatamente você deseja auditar? Presumo que você queira dizer que usará os nomes de usuário do MySQL, não os nomes de usuário do sistema? Como você pretende usar os dados de auditoria posteriormente (o que significa que detalhes são importantes aqui, o registro do sistema seria suficiente em vez do registro do MySQL). Quanto mais informações você fornecer na sua pergunta, mais exatamente podemos dar uma resposta e rapidamente inicializar. Eu imagino que você queira uma resposta melhor do que "faça com que seu aplicativo faça uma chamada específica antes de cada operação" ~ Em resumo, que detalhes você precisaria de mim se eu estivesse perguntando isso?
jcolebrand

Respostas:


6

Você provavelmente desejaria usar o log de consulta geral .

O log de consultas gerais é um registro geral do que o mysqld está fazendo. O servidor grava informações nesse log quando os clientes se conectam ou desconectam e registra cada instrução SQL recebida dos clientes.

Uma coisa importante no log de segurança é que um invasor não pode acessar o log para apagar traços de sua presença; portanto, considere anexar somente arquivos .

No FWIW no Oracle, podemos enviar logs automaticamente para um syslog remoto , mas não acredito que o MySQL ainda tenha esse recurso. Talvez você possa fingir com o SNMP, mas eu não tentei.



Oh legal, aprender algo novo todos os dias :-)
Caio

5

A resposta de @ Gaauis é excelente. Para adicionar mais, você pode:

O MySQL 5.1 agora permite armazenar o log geral e o log de consultas lentas como tabelas SQL.

Adicione isso ao /etc/my.cnf:

[mysqld]
log-output=TABLE
log

Reinicie o mysql

Então, quando o mysqld cria o log geral, em vez de um arquivo de texto, ele cria a tabela como uma tabela CSV na pasta / var / lib / mysql / mysql (banco de dados de esquema mysql).

Basta fazer isso para ver:

SHOW CREATE TABLE mysql.general_log\G

Todas as conexões se acumulam nele.

Para você, isso não é muito útil quando se trata de consultá-lo. Seria apenas uma verificação completa da tabela a cada vez.

O que fazer ??? Convertê-lo para MyISAM e indexar a tabela !!!!

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;

Opcionalmente, você pode colocar um índice de texto completo no campo de argumento.

Acabei de configurar o MySQL 5.5.9 em um servidor e tentei isso. Aqui está o resultado:

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)

Agora, você pode consultar com registro de data e hora e procurar tokens específicos no campo de argumento.

Por exemplo, observe a linha 4 do SELECT que fiz. Meu login foi registrado no campo de argumento como lwdba@127.0.0.1 on. Você pode acompanhar estes.

E se o general ficar muito grande (acredite, ficará muito grande muito rápido)

O que fazer ???

  1. mysql de desligamento
  2. mova o general_log.frm, o general_log.MYD e o general_log.MYI para uma montagem em disco diferente (e muito maior).
  3. Crie três links simbólicos para general_log.frm, general_log.MYD e general_log.MYI em / var / lib / mysql / mysql
  4. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI na nova montagem de disco
  5. chown mysql: mysql general_log.frm general_log.MYD general_log.MYI links simbólicos em / var / lib / mysql / mysql
  6. inicie o backup do mysql

BTW Depois de ter o log geral colocado offline, você pode executá-los para coletar os logins distintos que fizeram algo no 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;

Eu tenho um cliente com 3 servidores de banco de dados. O alcance com o DB Server possui mais de 1.000.000.000 (1 bilhão [milhares milhões]) de linhas. O script acima levou cerca de 2,5 horas para ser concluído. A tabela audit_user_host terminou com 27 logins distintos.

Você deve estar pronto para ir.

Divirta-se com este, pessoal !!!


Ótimo artigo! Apenas compartilhando meus testes. Tentei renomear a tabela mysql.general_log e particionar a tabela para fins de limpeza, mas não efetuarei login na tabela. Então, eu volto para a tabela MyIsam não particionada. Obrigado!

1

Em vez de fazer tantas coisas manualmente, basta instalar o plug-in de auditoria, que fornece mais informações no nível do usuário

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

Porém, ele está disponível em edições comerciais selecionadas do MySQL. Seria ótimo se algum fork do MySQL também fosse adicionado à edição da comunidade, para que a maioria das pessoas se beneficiasse com esse recurso, caso contrário, precisamos confiar na solução fornecida pelo @RolandoMySQLDBA.


0

@statichippo
Como instalar o log de auditoria no MySQL.
+ O log de auditoria suporta apenas o MySQL Enterprise
+ Você pode instalar o log de auditoria na Comunidade MySQL:
1. Copie o arquivo audit_log.so por Você pode instalar o MySQL Enterprise Trial e, em seguida, copie o arquivo audit_log.so para a Comunidade MySQL.
2. Copie audit_log.so para plugin_dir como / usr / lib64 / mysql / plugin ou você pode mostrar o diretório do plugin:
Vá para o console mysql: mysql> mostre variáveis ​​globais como '% plugin%';
3. Instale o log de auditoria como:
mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
mysql> MOSTRA VARIÁVEIS COMO 'audit_log%';
4.
Registro de auditoria de saída: tail -f /var/lib/mysql/audit.log

Muito Obrigado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.