AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 668
Accepted
statichippo
statichippo
Asked: 2011-01-18 13:19:57 +0800 CST2011-01-18 13:19:57 +0800 CST 2011-01-18 13:19:57 +0800 CST

Auditoria de logins no banco de dados MySQL

  • 772

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, googling não apresentou bons resultados.

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

Obviamente, poder 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, caso surja.

mysql authentication
  • 4 4 respostas
  • 35445 Views

4 respostas

  • Voted
  1. Best Answer
    Gaius
    2011-01-18T13:57:24+08:002011-01-18T13:57:24+08:00

    Você provavelmente gostaria de usar o log de consulta geral .

    O log de consulta geral é 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 com o registro de segurança é que um invasor não pode acessar o registro para apagar rastros de sua presença, portanto, considere arquivos somente anexados .

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

    • 7
  2. RolandoMySQLDBA
    2011-02-25T11:51:10+08:002011-02-25T11:51:10+08:00

    A resposta de @Gauis é excelente. Para adicionar mais a ele, você pode o seguinte:

    O MySQL 5.1 agora permite armazenar o log geral e o log de consulta lenta como tabelas SQL.

    Adicione isto ao /etc/my.cnf:

    [mysqld]
    log-output=TABLE
    log
    

    Reinicie o mysql

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

    Basta fazer isso para ver:

    SHOW CREATE TABLE mysql.general_log\G
    

    Todas as conexões vão se acumular nele.

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

    O que fazer ??? CONVERTE PARA MyISAM e INDEX 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 querer colocar um índice de texto completo no campo do 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      | [email protected] 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      | [email protected] 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 por carimbo de data/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 [email protected] on. Você pode rastreá-los.

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

    O que fazer ???

    1. desligar mysql
    2. mova o general_log.frm, general_log.MYD e general_log.MYI para uma montagem de disco diferente (e esperançosamente maior).
    3. Crie três links simbólicos para general_log.frm, general_log.MYD e general_log.MYI de /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. iniciar o backup do mysql

    BTW Uma vez que você tenha o log geral 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 DB. Cada um com DB Server tem mais de 1.000.000.000 (1 bilhão [milhares de milhões]) de linhas nele. O script acima levou cerca de 2,5 horas para ser concluído. A tabela audit_user_host acabou com 27 logins distintos.

    Você deve estar pronto para ir.

    Divirtam-se com este, todos !!!

    • 6
  3. Mahesh Patil
    2012-11-03T06:39:58+08:002012-11-03T06:39:58+08:00

    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

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

    • 1
  4. Binh Nguyen
    2015-01-22T00:14:42+08:002015-01-22T00:14:42+08:00

    @statichippo
    Como instalar o log de auditoria no MySQL.
    + O registro de auditoria só suporta MySQL Enterprise
    + Você pode instalar o registro 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 por:
    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> MOSTRAR VARIÁVEIS COMO 'audit_log%';
    4. Log de auditoria de saída:
    tail -f /var/lib/mysql/audit.log

    Muito obrigado.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve