sql >> データベース >  >> RDS >> MariaDB

データベースセキュリティのためのPercona監査ログプラグインの使用

    データベースに監査プラグインを使用する必要があるのはなぜですか?

    データベースでの監査は、同じ意味を共有するため、その意味から逸脱しません。つまり、データベース内でログに記録または実行されているデータベースイベント/トランザクションを検査、調査、および評価します。実際、データの管理と処理に機密性の高い管理側を称賛するため、特にセキュリティ機能としてデータベースの実現可能性が高まります。データ管理の責任と説明責任を包含しています。

    データベース監査では、トレースを記録し、データベース操作中に発生していることの完全な概要を取得するために、すべてのトランザクション(つまり、DDLおよびDML)をログに記録する必要があります。これらの操作には、次の考慮事項があります。

    • アプリケーション側のパフォーマンスを向上させるために、監視およびデバッグする機能を提供します
    • PCI DSS、HIPAA、GDPRなどのセキュリティとデータプライバシーコンプライアンス
    • マルチテナンシー環境に固有のデータ自律性を実現する機能を提供します。これにより、データ分析を行って、セキュリティとパフォーマンスを考慮した機密性とプライバシーに基づいてトランザクションを区別およびフィルタリングできます。
    • データベースユーザーが調査の疑わしいアクティビティに基づいて、またはその役割によって制限された不適切なアクションを実行しないように、管理アクションを実行します。つまり、たとえば、読み取りユーザーは、データのプルのみが許可され、職務に応じて責任があるか、範囲が限定されている特定のデータベースへのアクセスが制限されます。

    Percona監査ログプラグインとは何ですか?

    データベースで実行されているトランザクションまたはイベントの監査に関する以前のアプローチは、非常に大きなアプローチになる可能性があります。一般的なログファイルを有効にするか、低速のクエリログを使用します。これは完璧なアプローチではないため、監査ログプラグインは、ギャップを埋めるために柔軟性とカスタマイズ可能なパラメーターを追加することができます。 Perconaは、監査ログプラグインがMySQLEnterpriseAuditの代替であると主張しています。それは事実ですが、Perconaの監査ログプラグインはOracleのMySQLではインストールできないという警告があります。このバイナリにダウンロード可能なtarballはありませんが、既存のPerconaServerまたはPerconaXtraDBClusterインストールから既存のaudit_log.soファイルをコピーするだけで簡単にインストールできます。同じバージョンのPerconaServerの既存のaudit_log.soをMySQLコミュニティバージョンでも使用またはコピーすることをお勧めします。したがって、ターゲットのMySQL Communityバージョンが8.xの場合は、PerconaServer8.xバージョンのaudit_log.soも使用してください。このブログの後半で、MySQLコミュニティバージョンでこれを行う方法を紹介します。

    Percona Audit Log Pluginはもちろんオープンソースであり、無料で利用できます。したがって、エンタープライズアプリケーションがPercona ServerやバニラMySQLなどのバックエンドデータベースを使用している場合は、このプラグインを使用できます。 MySQL Enterprise Auditは、MySQL Enterprise Serverでのみ利用可能であり、料金がかかります。さらに、Perconaはこのソフトウェアを絶えず更新および保守しており、これは、MySQLアップストリームからのメジャーリリースが利用可能であるかのように大きな利点となります。 Perconaもメジャーバージョンに基づいてリリースされ、監査ログプラグインツールの更新とテストされた機能にも影響します。そのため、以前のバージョンとの非互換性も更新して、最新の安全なバージョンのMySQLで動作するようにする必要があります。

    Percona監査ログプラグインはセキュリティツールの1つとしてタグ付けされていますが、これをもう一度明確にしましょう。このツールは、ログの監査に使用されます。唯一の目的は、データベースからのトランザクションのトレースをログに記録することです。ファイアウォールを設定したり、特定のユーザーをブロックするための予防策を適用したりすることはありません。このツールは主にログの監査とデータベーストランザクション分析に使用します。

    Percona監査ログプラグインの使用

    このセクションでは、プラグインのインストール方法、使用方法、およびプラグインが実際の状況でどれほど有益であるかについて説明します。

    プラグインのインストール

    Perconaには、データベースバイナリ用のさまざまなソースが付属しています。データベースサーバーを適切にインストールすると、標準インストールでは監査ログプラグイン共有オブジェクトが/usr/lib64/mysql/plugin/audit_log.soに配置されます。 Percona / MySQLサーバー内でプラグインを有効にする方法としてプラグインをインストールするには、以下のアクションを実行します。この手順は、PerconaServer8.0を使用して実行されます

    mysql> select @@version_comment, @@version\G
    
    *************************** 1. row ***************************
    
    @@version_comment: Percona Server (GPL), Release 12, Revision 7ddfdfe
    
            @@version: 8.0.21-12
    
    1 row in set (0.00 sec)

    次に、手順は次のとおりです。

    1. プラグインが存在するかどうかを最初に確認します

    ##プラグインが有効またはインストールされているかどうかを確認します

    mysql> select * from information_schema.PLUGINS where PLUGIN_NAME like '%audit%';
    
    Empty set (0.00 sec)
    
    
    
    mysql> show variables like 'audit%';
    
    Empty set (0.00 sec)
    1. プラグインをインストールします

    ##プラグインがどこにあるかを確認してください

    mysql> show variables like 'plugin%';
    
    +---------------+--------------------------+
    
    | Variable_name | Value                    |
    
    +---------------+--------------------------+
    
    | plugin_dir    | /usr/lib64/mysql/plugin/ |
    
    +---------------+--------------------------+
    
    1 row in set (0.00 sec)
    
    
    
    mysql> \! ls -a /usr/lib64/mysql/plugin/audit_log.so
    
    /usr/lib64/mysql/plugin/audit_log.so

    ##準備ができてからインストール

    mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';
    
    Query OK, 0 rows affected (0.01 sec)
    1. もう一度確認してください

    mysql> select * from information_schema.PLUGINS where PLUGIN_NAME like '%audit%'\G
    
    *************************** 1. row ***************************
    
               PLUGIN_NAME: audit_log
    
            PLUGIN_VERSION: 0.2
    
             PLUGIN_STATUS: ACTIVE
    
               PLUGIN_TYPE: AUDIT
    
       PLUGIN_TYPE_VERSION: 4.1
    
            PLUGIN_LIBRARY: audit_log.so
    
    PLUGIN_LIBRARY_VERSION: 1.10
    
             PLUGIN_AUTHOR: Percona LLC and/or its affiliates.
    
        PLUGIN_DESCRIPTION: Audit log
    
            PLUGIN_LICENSE: GPL
    
               LOAD_OPTION: ON
    
    1 row in set (0.00 sec)
    
    
    
    mysql> show variables like 'audit%';
    
    +-----------------------------+---------------+
    
    | Variable_name               | Value         |
    
    +-----------------------------+---------------+
    
    | audit_log_buffer_size       | 1048576       |
    
    | audit_log_exclude_accounts  |               |
    
    | audit_log_exclude_commands  |               |
    
    | audit_log_exclude_databases |               |
    
    | audit_log_file              | audit.log     |
    
    | audit_log_flush             | OFF           |
    
    | audit_log_format            | OLD           |
    
    | audit_log_handler           | FILE          |
    
    | audit_log_include_accounts  |               |
    
    | audit_log_include_commands  |               |
    
    | audit_log_include_databases |               |
    
    | audit_log_policy            | ALL           |
    
    | audit_log_rotate_on_size    | 0             |
    
    | audit_log_rotations         | 0             |
    
    | audit_log_strategy          | ASYNCHRONOUS  |
    
    | audit_log_syslog_facility   | LOG_USER      |
    
    | audit_log_syslog_ident      | percona-audit |
    
    | audit_log_syslog_priority   | LOG_INFO      |
    
    +-----------------------------+---------------+
    
    18 rows in set (0.00 sec)

    MySQLコミュニティバージョンへのPercona監査プラグインのインストール

    Oracle MySQLのバージョンにインストールする場合、前述のように、audit_log.soファイルの元のバージョンのPerconaServerと常に一致します。たとえば、次のバージョンのMySQLがあります

    nodeB $  mysqld --version
    
    /usr/sbin/mysqld  Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)

    一方、私のPerconaサーバーは

    nodeA $ mysqld --version
    
    /usr/sbin/mysqld  Ver 8.0.21-12 for Linux on x86_64 (Percona Server (GPL), Release 12, Revision 7ddfdfe)

    必要なのは、PerconaソースからMySQLCommunityServerがインストールされているサーバーにコピーすることだけです。

    nodeA $ scp /usr/lib64/mysql/plugin/audit_log.so nodeB:/tmp/

    次に、プラグインが配置される/ usr / lib64 / mysql/pluginに移動します。

    [email protected] > show global variables like 'plugin%';
    
    +---------------+--------------------------+
    
    | Variable_name | Value                    |
    
    +---------------+--------------------------+
    
    | plugin_dir    | /usr/lib64/mysql/plugin/ |
    
    +---------------+--------------------------+
    
    1 row in set (0.00 sec)
    
    
    
    nodeB $ mv /tmp/audit_log.so /usr/lib64/mysql/plugin

    残りはすべて、上記の手順に従って、MySQLCommunityServer用のPerconaAuditLoginPluginのインストールまたは有効化を続行できます。

    Percona監査ログプラグインの構成と管理

    Percona Audit Log Pluginは、データベース接続またはトランザクションをログに記録する際の要件に対応するために、非常に構成可能またはカスタマイズ可能な非常に柔軟なツールです。これは、指定された構成の線形実装であるため、指定されたパラメーターによって柔軟にカスタマイズできる場合でも、データベースの実行中は指定された値のみがログに記録および監査され、デフォルトでは非同期で実行されます。このプラグインのすべてのパラメーター変数は重要ですが、プラグインの構成に使用できる最も重要なパラメーターは次のとおりです。

    • audit_log_strategy -監査ログ戦略を指定するため、およびaudit_log_handlerがFILEに設定されている場合に使用されます。次のいずれかの値が可能です:
      • ASYNCHRONOUS-(デフォルト)メモリバッファを使用してログに記録します。バッファがいっぱいの場合はメッセージをドロップしません
      • パフォーマンス-メモリバッファを使用してログに記録し、バッファがいっぱいの場合はメッセージをドロップします
      • SEMISYNCHRONOUS-ファイルに直接ログインし、すべてのイベントをフラッシュおよび同期しないでください
      • 同期-ファイルに直接ログインし、すべてのイベントをフラッシュして同期します
    • audit_log_file -監査ログの保存に使用されるファイル名。デフォルトはファイル${datadir}/audit.logです。データベースのdatadirからの相対ファイルパスまたは絶対ファイルパスを使用できます。
    • audit_log_flush -logrotateとの連携で使用されるなど、ログをフラッシュする必要がある場合に便利です
    • audit_log_buffer_size -デフォルトでは、PerconaAuditLogはトレースをデフォルトのファイルログに記録します。この変数は、audit_log_handler =FILE、およびaudit_log_strategy=ASYNCHRONOUSまたはPERFORMANCEの場合に役立ちます。設定すると、ロギングに使用されるメモリバッファのサイズを指定するために使用されます。これにより、監査ログが有効になっている場合のパフォーマンスの低下を回避できます。
    • audit_log_format -情報を監査ログファイルに記録または保存するときに指定する形式。フォーマットをOLD/NEW(XMLフォーマットに基づく)、JSON、およびCSVとして受け入れます。これは、後で他の外部ツールと組み合わせて、特定の形式をサポートする監査ログを取得する場合に特に便利です。
    • audit_log_exclude_accounts /audit_log_include_accounts-パラメータ名に応じて含めるまたは除外できるユーザーのリストを指定するために使用されます。 NULLを受け入れます。それ以外の場合は、[email protected]または'user'@'host'の形式のコンマ区切りのリストです。これらの変数は相互に排他的であるため、どちらか一方を設定解除する(つまり、値がNULLである)必要があります
    • audit_log_include_commands / audit_log_exclude_commands-SQLコマンドタイプによるフィルタリングが適用されるコマンドのリスト(NULLまたはコンマ区切りのリスト)を指定するために使用されます。これらの変数は相互に排他的であるため、どちらか一方を設定解除する(つまり、値がNULLである)必要があります。 MySQLまたはPerconaでSQLコマンドタイプのリストを取得するには、次の手順を実行します。
      • my.cnfでperformance_schema=ON変数を有効にします(データベースサーバーの再起動が必要です)
      • 次のクエリを実行します:SELECT GROUP_CONCAT(SUBSTRING_INDEX(name、'/'、-1)ORDER BY name)sql_statement FROM performance_schema.setup_instruments WHERE name LIKE "statement / sql /%" \ G
    • audit_log_include_databases / audit_log_exclude_databases-データベース名でフィルタリングするように指定し、audit_log_ {include、exclude} _commandsと組み合わせて、監査ログ中にログを記録するときに、コマンドのリストをより細かくフィルタリングするように指定します。これらの変数は相互に排他的であるため、どちらか一方を設定解除する(つまり、値がNULLである)必要があります。
    • audit_log_policy -ログに記録するイベントを指定するために使用されます。技術的には、この変数を動的に設定して、監査ログを有効または無効(値をNONEに設定)にすることができます。可能な値は次のとおりです。
      • ALL-すべてのイベントがログに記録されます
      • LOGINS-ログインのみがログに記録されます
      • クエリ-クエリのみがログに記録されます なし-イベントはログに記録されません
    監査ログプラグインの管理

    前述のように、デフォルトのログファイルは$ {data_dir} /audit.logに移動し、以下の例のようにXML形式を使用します。

    [[email protected] ~]# ls /var/lib/mysql/audit.log  | xargs tail -28
    
    <AUDIT_RECORD
    
      NAME="Ping"
    
      RECORD="28692714_2020-10-28T19:12:18"
    
      TIMESTAMP="2020-10-29T09:39:56Z"
    
      COMMAND_CLASS="error"
    
      CONNECTION_ID="10"
    
      STATUS="0"
    
      SQLTEXT=""
    
      USER="cmon[cmon] @  [192.168.10.200]"
    
      HOST=""
    
      OS_USER=""
    
      IP="192.168.10.200"
    
      DB="information_schema"
    
    />
    
    <AUDIT_RECORD
    
      NAME="Query"
    
      RECORD="28692715_2020-10-28T19:12:18"
    
      TIMESTAMP="2020-10-29T09:39:56Z"
    
      COMMAND_CLASS="show_status"
    
      CONNECTION_ID="10"
    
      STATUS="0"
    
      SQLTEXT="SHOW GLOBAL STATUS"
    
      USER="cmon[cmon] @  [192.168.10.200]"
    
      HOST=""
    
      OS_USER=""
    
      IP="192.168.10.200"
    
      DB="information_schema"
    
    />

    では、実際のシナリオでPercona監査ログプラグインを管理しましょう。 DaniのPerconaのブログの作業に触発されて、my.cnfの次の変数を変更することを検討しましょう。

    [[email protected] ~]# grep -i 'audit' /etc/my.cnf
    
    ## Audit Log
    
    audit_log_format=JSON
    
    audit_log_strategy=PERFORMANCE
    
    audit_log_policy=QUERIES
    
    audit_log_exclude_databases=s9s

    次に、次のデータベースとテーブルを作成しましょう。

    CREATE DATABASE s9s;
    
    CREATE TABLE `audit_records` ( `id` int unsigned NOT NULL AUTO_INCREMENT,  `audit_record` json,   PRIMARY KEY (`id`) ) ENGINE=InnoDB;

    次に、Linuxで名前付きパイプまたはFIFOを使用して、監査の準備ができているが、後で実行可能に使用できるログを収集しましょう。

    $ mkfifo /tmp/s9s_fifo
    
    $ exec 1<>/tmp/s9s_fifo
    
    $ tail -f /var/lib/mysql/audit.log 1>/tmp/s9s_fifo 2>&1
    
    Then, let's insert any logs to our table `s9s`.`audit_records` using the following script below,
    
    #/bin/bash
    
    pipe=/tmp/s9s_fifo
    
    while true; do
    
        if read line <$pipe; then 
    
    if [[ "$line" == 'quit' ]]; then 
    
    break
    
    fi 
    
    mysql --show-warnings -vvv -e "INSERT INTO s9s.audit_records (audit_record) VALUES(\"${line//\"/\\\"}\")" 
    
        fi
    
    done

    次に、sysbenchを使用してベンチマークを実行してみました。さて、私が持っている次のエントリで、

    mysql> select count(1) from audit_records\G
    
    *************************** 1. row ***************************
    
    count(1): 37856
    
    1 row in set (0.11 sec)

    JSONを使用して監査を行うことができるため、データベースの監査と調査、さらにはパフォーマンス分析を行うことができます。たとえば、

    mysql> SELECT top10_select_insert from ((select audit_record->"$.audit_record" as top10_select_insert from audit_records  where audit_record->"$.audit_record.command_class" in ('select') order by audit_records.id desc limit 10) union all (select audit_record->"$.audit_record" as top10_select_insert from audit_records  where audit_record->"$.audit_record.command_class" in ('insert')  order by audit_records.id desc limit 10)) AS b\G
    
    *************************** 1. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263176_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT DISTINCT c FROM sbtest1 WHERE id BETWEEN 5001 AND 5100 ORDER BY c", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25143"}
    
    *************************** 2. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263175_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest4 WHERE id BETWEEN 4875 AND 4974 ORDER BY c", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25143"}
    
    *************************** 3. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263174_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT SUM(k) FROM sbtest1 WHERE id BETWEEN 5017 AND 5116", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25143"}
    
    *************************** 4. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263173_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest8 WHERE id BETWEEN 4994 AND 5093", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 5. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263172_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=4976", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 6. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263171_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=5018", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 7. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263170_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=5026", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 8. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263169_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=5711", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 9. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263168_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=5044", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 10. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263167_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "SELECT c FROM sbtest3 WHERE id=5637", "timestamp": "2020-10-29T11:11:56Z", "command_class": "select", "connection_id": "25153"}
    
    *************************** 11. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263151_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest9 (id, k, c, pad) VALUES (4998, 4986, '02171032529-62046503057-07366460505-11685363597-46873502976-33077071866-44215205484-05994642442-06380315383-02875729800', '19260637605-33008876390-94789070914-09039113107-89863581488')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25124"}
    
    *************************** 12. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263133_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest8 (id, k, c, pad) VALUES (6081, 4150, '18974493622-09995560953-16579360264-35381241173-70425414992-87533708595-45025145447-98882906947-17081170077-49181742629', '20737943314-90440646708-38143024644-95915967543-47972430163')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25133"}
    
    *************************** 13. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263126_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest2 (id, k, c, pad) VALUES (5014, 5049, '82143477938-07198858971-84944276583-28705099377-04269543238-74209284999-24766869883-70274359968-19384709611-56871076616', '89380034594-52170436945-89656244047-48644464580-26885108397')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25135"}
    
    *************************** 14. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263119_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest5 (id, k, c, pad) VALUES (4995, 3860, '07500343929-19373180618-48491497019-86674883771-87861925606-04683804124-03278606074-05397614513-84175620410-77007118978', '19374966620-11798221232-19991603086-34443959669-69834306417')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25142"}
    
    *************************** 15. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263112_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest10 (id, k, c, pad) VALUES (5766, 5007, '46189905191-42872108894-20541866044-43286474408-49735155060-20388245380-67571749662-72179825415-56363344183-47524887111', '24559469844-22477386116-04417716308-05721823869-32876821172')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25137"}
    
    *************************** 16. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263083_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest7 (id, k, c, pad) VALUES (5033, 4986, '20695843208-59656863439-60406010814-11793724813-45659184103-02803540858-01466094684-30557262345-15801610791-28290093674', '14178983572-33857930891-42382490524-21373835727-23623125230')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25118"}
    
    *************************** 17. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263076_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest1 (id, k, c, pad) VALUES (5029, 5016, '72342762580-04669595160-76797241844-46205057564-77659988460-00393018079-89701448932-22439638942-02011990830-97695117676', '13179789120-16401633552-44237908265-34585805608-99910166472')", "timestamp": "2020-10-29T11:11:56Z", "command_class": "insert", "connection_id": "25121"}
    
    *************************** 18. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263036_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest1 (id, k, c, pad) VALUES (5038, 5146, '62239893938-24763792785-75786071570-64441378769-99060498468-07437802489-36899434285-44705822299-70849806976-77287283409', '03220277005-21146501539-10986216439-83162542410-04253248063')", "timestamp": "2020-10-29T11:11:55Z", "command_class": "insert", "connection_id": "25127"}
    
    *************************** 19. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326263018_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest4 (id, k, c, pad) VALUES (5004, 5028, '15487433957-59189974170-83116468418-96078631606-58760747556-09307871236-40520753062-17596570189-73692856496-38267942694', '98937710805-24695902707-05013528796-18454393948-39118534483')", "timestamp": "2020-10-29T11:11:55Z", "command_class": "insert", "connection_id": "25129"}
    
    *************************** 20. row ***************************
    
    top10_select_insert: {"db": "sbtest", "ip": "192.168.10.200", "host": "", "name": "Query", "user": "cmon[cmon] @  [192.168.10.200]", "record": "326262989_2020-10-29T10:35:07", "status": 0, "os_user": "", "sqltext": "INSERT INTO sbtest3 (id, k, c, pad) VALUES (5015, 5030, '30613877119-41343977889-67711116708-96041306890-46480766663-68231747217-07404586739-83073703805-75534384550-12407169697', '65220283880-37505643788-94809192635-84679347406-74995175373')", "timestamp": "2020-10-29T11:11:55Z", "command_class": "insert", "connection_id": "25139"}
    
    20 rows in set (0.00 sec)
    他のツールを使用して監査ログを集約する

    監査ログの出力を解析できるようになったので、JSONを読み取るかサポートしている限り、他の外部ツールへの組み込みを開始し、現在の環境またはテクノロジースタックとの集約を開始できます。たとえば、ELK(Elasticsearch、Logstash Kibana)を使用して、ログを解析および一元化します。また、GraylogまたはFluentdに組み込むこともできます。一方、独自のビューアを作成して、現在のソフトウェア設定に組み込むこともできます。 Percona Audit Logを使用すると、これらのことを実行可能になり、高い生産性でより多くの分析を実行できます。もちろん、実行可能で拡張可能です。


    1. PGAdminからCSVファイルをインポートしようとしたときにアクセスが拒否されました

    2. カスケード削除制約を追加するにはどうすればよいですか?

    3. SQL Union –UNION演算子に関する包括的なガイド

    4. 条件付きINSERTからIDを取得