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

MySQLおよびMariaDBのデータベースセキュリティ監視

    データ保護は、データベース管理の最も重要な側面の1つです。組織構造に応じて、開発者、システム管理者、DBAのいずれであっても、本番データベースを管理している場合は、不正アクセスや不正使用がないかデータを監視する必要があります。セキュリティ監視の目的は2つあります。 1つは、データベースでの不正なアクティビティを識別するためです。 2つ目は、データベースとその構成が全社的にセキュリティポリシーと標準に準拠しているかどうかを確認することです。

    この記事では、セキュリティの監視を2つのカテゴリに分けます。 1つは、MySQLおよびMariaDBデータベースアクティビティの監査に関連します。 2番目のカテゴリは、潜在的なセキュリティギャップについてインスタンスを監視することです。

    クエリおよび接続ポリシーベースの監視

    継続的監査は、データベース環境を監視するための必須のタスクです。データベースを監査することにより、実行されたアクションまたはアクセスされたコンテンツに対する説明責任を達成できます。さらに、監査には、SOXなどの一連の正確な規制やEU GDPR規制をサポートするための財務データに関連するコンポーネントなど、いくつかの重要なシステムコンポーネントが含まれる場合があります。通常、これは、データベースでのDB操作に関する情報を外部ログファイルに記録することによって実現されます。

    デフォルトでは、MySQLまたはMariaDBでの監査は無効になっています。追加のプラグインをインストールするか、query_logパラメーターを使用してすべてのクエリをキャプチャすることで実現できます。一般的なクエリログファイルは、MySQLが実行していることの一般的な記録です。サーバーは、クライアントが接続または切断したときにこのログにいくつかの情報を記録し、クライアントから受信した各SQLステートメントをログに記録します。パフォーマンスの問題と構成オプションの欠如により、general_logはセキュリティ監査の目的には適していません。

    MySQL Enterpriseを使用する場合は、独自のMySQLバージョンの拡張機能であるMySQLEnterpriseAuditプラグインを使用できます。 MySQL Enterprise Audit Pluginプラグインは、Oracleが提供する商用製品であるMySQLEnterpriseでのみ使用できます。 PerconaとMariaDBは、独自のオープンソースバージョンの監査プラグインを作成しました。最後に、MySQL用のMcAfeeプラグインは、さまざまなバージョンのMySQLでも使用できます。この記事では、オープンソースプラグインに焦点を当てますが、OracleのEnterpriseバージョンが最も堅牢で安定しているようです。

    MySQLオープンソース監査プラグインの特徴

    オープンソースの監査プラグインは、OracleのEnterpriseプラグインと同じ役割を果たしますが、データベースのクエリと接続を使用して出力を生成しますが、アーキテクチャには大きな違いがいくつかあります。

    MariaDB監査プラグイン– MariaDB監査プラグインは、MariaDB、MySQL(バージョン5.5.34および10.0.7以降)およびPerconaサーバーで動作します。 MariaDBは、バージョン10.0.10および5.5.37からデフォルトで監査プラグインの組み込みを開始し、MariaDB5.5.20からの任意のバージョンにインストールできます。これは、Oracle MySQL、Percona Server、およびMariaDBをサポートする唯一のプラグインです。 WindowsおよびLinuxプラットフォームで利用できます。 1.2以降のバージョンは最も安定しており、実稼働環境でそれより前のバージョンを使用するのは危険な場合があります。

    McAfee MySQL監査プラグイン–このプラグインはMySQL監査APIを使用しません。最近、MySQL5.7をサポートするように更新されました。一部のテストでは、APIベースのプラグインの方がパフォーマンスが向上する可能性があることが示されていますが、環境で確認する必要があります。

    Percona監査ログプラグイン– Perconaは、インストールプロセスの一部としてPerconaServer5.5.37以降および5.6.17以降をインストールするオープンソースの監査ソリューションを提供します。他のオープンソースプラグインと比較すると、このプラグインはXML、JSON、およびsyslogを出力するため、より多くのリーチ出力機能を備えています。

    サーバーへの内部フックがいくつかあり、Oracleのプラグインと機能互換性があるため、他のバージョンのMySQLのスタンドアロンプ​​ラグインとしては使用できません。

    MariaDB監査拡張に基づくプラグインのインストール

    オープンソースのMySQLプラグインのインストールは、MariaDB、Percona、およびMcAfeeバージョンで非常に似ています。
    PerconaとMariaDBは、デフォルトのサーバーバイナリの一部としてプラグインを追加するため、プラグインを個別にダウンロードする必要はありません。 PerconaバージョンはMySQLの独自のフォークのみを公式にサポートしているため、ベンダーのWebサイトから直接ダウンロードすることはできません(このプラグインをMySQLで使用する場合は、Perconaサーバーパッケージからプラグインを入手する必要があります)。 MySQLの他のフォークでMariaDBプラグインを使用したい場合は、https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/から見つけることができます。 McAfeeプラグインは、https://github.com/mcafee/mysql-audit/wiki/Installationで入手できます。

    プラグインのインストールを開始する前に、プラグインがシステムに存在するかどうかを確認できます。動的プラグイン(インスタンスの再起動は不要)の場所は、次のコマンドで確認できます:

    SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
    
    +---------------+--------------------------+
    | Variable_name | Value                    |
    +---------------+--------------------------+
    | plugin_dir    | /usr/lib64/mysql/plugin/ |
    +---------------+--------------------------+

    ファイルシステムレベルで返されたディレクトリをチェックして、プラグインライブラリのコピーがあることを確認します。 / usr / lib64 / mysql / plugin /内にserver_audit.soまたはserver_audit.dllがない場合は、MariaDBバージョンがサポートされていない可能性が高いため、最新バージョンにアップグレードする必要があります。

    MariaDBプラグインをインストールするための構文は次のとおりです。

    INSTALL SONAME 'server_audit';

    インストールされているプラ​​グインを確認するには、以下を実行する必要があります:

    SHOW PLUGINS;
    MariaDB [(none)]> show plugins;
    +-------------------------------+----------+--------------------+--------------------+---------+
    | Name                          | Status   | Type               | Library            | License |
    +-------------------------------+----------+--------------------+--------------------+---------+
    | binlog                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | mysql_native_password         | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
    | mysql_old_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
    | wsrep                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | MRG_MyISAM                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | MEMORY                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | CSV                           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | MyISAM                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | CLIENT_STATISTICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INDEX_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | TABLE_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | USER_STATISTICS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | PERFORMANCE_SCHEMA            | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | InnoDB                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | INNODB_TRX                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INNODB_LOCKS                  | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INNODB_LOCK_WAITS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INNODB_CMP                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    ...
    | INNODB_MUTEXES                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INNODB_SYS_SEMAPHORE_WAITS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | INNODB_TABLESPACES_ENCRYPTION | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
    | INNODB_TABLESPACES_SCRUBBING  | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
    | Aria                          | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | SEQUENCE                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | user_variables                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
    | FEEDBACK                      | DISABLED | INFORMATION SCHEMA | NULL               | GPL     |
    | partition                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
    | rpl_semi_sync_master          | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
    | rpl_semi_sync_slave           | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
    | SERVER_AUDIT                  | ACTIVE   | AUDIT              | server_audit.so    | GPL     |
    +-------------------------------+----------+--------------------+--------------------+---------+

    追加情報が必要な場合は、information_schemaデータベースのPLUGINSテーブルを確認してください。このテーブルには、より詳細な情報が含まれています。

    プラグインをインストールする別の方法は、my.cnfでプラグインを有効にして、インスタンスを再起動することです。 MariaDBの基本的な監査プラグイン構成の例は次のとおりです:

    server_audit_events=CONNECT
    server_audit_file_path=/var/log/mysql/audit.log
    server_audit_file_rotate_size=1073741824
    server_audit_file_rotations=8
    server_audit_logging=ON
    server_audit_incl_users=
    server_audit_excl_users=
    server_audit_output_type=FILE
    server_audit_query_log_limit=1024

    上記の設定はmy.cnfに配置する必要があります。監査プラグインはファイル/var/log/mysql/audit.logを作成します。このファイルは、サイズ1GBでローテーションされ、ファイルが上書きされるまで8ローテーションされます。このファイルには、接続に関する情報のみが含まれます。

    現在、MariaDB監査プラグインを調整するために使用できる16の設定があります。

    server_audit_events
    server_audit_excl_users
    server_audit_file_path
    server_audit_file_rotate_now
    server_audit_file_rotate_size
    server_audit_file_rotations
    server_audit_incl_users
    server_audit_loc_info
    server_audit_logging
    server_audit_mode
    server_audit_output_type
    Server_audit_query_log_limit
    server_audit_syslog_facility
    server_audit_syslog_ident
    server_audit_syslog_info
    server_audit_syslog_priority

    その中には、ユーザーを含めたり除外したり、さまざまなログイベント(CONNECTまたはQUERY)を設定したり、ファイルとsyslogを切り替えたりするオプションがあります。

    サーバーの起動時にプラグインが有効になるようにするには、my.cnf設定で
    plugin_load=server_audit=server_audit.soを設定する必要があります。このような構成は、プラグインのアンインストールオプションを無効にするserver_audit=FORCE_PLUS_PERMANENTによってさらに保護できます。

    UNINSTALL PLUGIN server_audit;
    
    ERROR 1702 (HY000):
    Plugin 'server_audit' is force_plus_permanent and can not be unloaded

    MariaDB監査プラグインによって生成されたサンプルエントリは次のとおりです。

    20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,0
    20180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
    20180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,0
    20180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,0
    20180819 17:19:19,slave,cmon,cmon,12,0,CONNECT,information_schema,,0
    20180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,1045
    20180819 17:19:19,slave,root,localhost,13,0,DISCONNECT,,,0
    20180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,0
    20180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql,,0
    20180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,0
    20180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,0
    20180819 19:00:01,slave,cmon,cmon,17,0,CONNECT,information_schema,,0
    20180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0

    スキーマ変更レポート

    DDLの変更のみを追跡する必要がある場合は、スキーマ変更に関するClusterControl操作レポートを使用できます。スキーマ変更検出レポートには、データベースのDDL変更が表示されます。この機能には、ClusterControl構成ファイルに追加のパラメーターが必要です。これが設定されていない場合は、次の情報が表示されます。schema_change_detection_addressが/etc/cmon.d/cmon_1.cnfに設定されていません。それが整ったら、出力例は次のようになります。

    スケジュールを設定して、レポートを受信者にメールで送信できます。

    ClusterControl:運用レポートのスケジュール

    MySQLデータベースのセキュリティ評価

    パッケージアップグレードチェック

    まず、セキュリティチェックから始めます。 MySQLパッチを最新に保つことは、MySQLサーバーに存在する既知の脆弱性に関連するリスクを軽減するのに役立ちます。ベンダーのパッケージリポジトリを使用して、環境を最新の状態に保つことができます。この情報に基づいて、独自のレポートを作成したり、ClusterControlなどのツールを使用して環境を確認し、更新の可能性について警告したりできます。

    ClusterControlアップグレードレポートは、オペレーティングシステムから情報を収集し、それらをリポジトリで利用可能なパッケージと比較します。レポートは4つのセクションに分かれています。アップグレードの概要、データベースパッケージ、セキュリティパッケージ、およびその他のパッケージ。システムにインストールしたものをすばやく比較して、推奨されるアップグレードまたはパッチを見つけることができます。

    ClusterControl:アップグレードレポート ClusterControl:アップグレードレポートの詳細

    それらを手動で比較するには、実行できます

    SHOW VARIABLES WHERE variable_name LIKE "version";

    次のようなセキュリティ情報を使用:
    https://www.oracle.com/technetwork/topics/security/alerts-086861.html
    https://nvd.nist.gov/view/vuln/search-結果?adv_search =true&cves =on&cpe_vendor =cpe%3a%2f%3aoracle&cpe_produ
    https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
    https://downloads.mariadb.org/mariadb/+releases/
    https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
    https://www。 cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html

    またはベンダーリポジトリ:

    Debianについて

    sudo apt list mysql-server

    RHEL / Centos

    yum list | grep -i mariadb-server

    パスワードのないアカウント

    空白のパスワードを使用すると、ユーザーはパスワードを使用せずにログインできます。 MySQLには、事前に作成されたユーザーのセットが付属していました。そのうちのいくつかは、パスワードなしでデータベースに接続でき、さらに悪いことに、匿名ユーザーも接続できます。幸い、これはMySQL5.7で変更されました。最後に、インストール時に選択したパスワードを使用するrootアカウントのみが付属しています。

    監査手順から返された行ごとに、パスワードを設定します。

    SELECT User,host
    FROM mysql.user
    WHERE authentication_string='';

    さらに、パスワード検証プラグインをインストールして、より安全なポリシーを実装できます。

    INSTALL PLUGIN validate_password SONAME 'validate_password.so';
    
    SHOW VARIABLES LIKE 'default_password_lifetime';
    SHOW VARIABLES LIKE 'validate_password%';

    良いスタートは次のとおりです。

    plugin-load=validate_password.so
    validate-password=FORCE_PLUS_PERMANENT
    validate_password_length=14
    validate_password_mixed_case_count=1
    validate_password_number_count=1
    validate_password_special_char_count=1
    validate_password_policy=MEDIUM

    もちろん、これらの設定はビジネスニーズによって異なります。

    リモートアクセス監視

    ホスト名内でのワイルドカードの使用を避けることは、特定のユーザーがデータベースに接続して対話できる特定の場所を制御するのに役立ちます。

    すべてのユーザーが特定のホストからのみMySQLに接続できることを確認する必要があります。同じユーザーに対していつでも複数のエントリを定義できます。これにより、ワイルドカードの必要性を減らすことができます。

    次のSQLステートメントを実行して、この推奨事項を評価します(行が返されないことを確認してください)。

    SELECT user, host FROM mysql.user WHERE host = '%';

    テストデータベース

    デフォルトのMySQLインストールには、testと呼ばれる未使用のデータベースが付属しており、テストデータベースはすべてのユーザー、特に匿名ユーザーが利用できます。このようなユーザーは、テーブルを作成して書き込むことができます。これは、それ自体で問題になる可能性があります。書き込みにより、オーバーヘッドが追加され、データベースのパフォーマンスが低下します。テストデータベースを削除することをお勧めします。テストデータベースが存在するかどうかを確認するには、次を実行します。

    SHOW DATABASES LIKE 'test';

    テストデータベースが存在することに気付いた場合は、テストデータベース(およびその他のセキュリティ関連のアクティビティ)を削除するmysql_secure_installationスクリプトが実行されなかった可能性があります。

    データファイルの読み込み

    サーバーとクライアントの両方にLOADDATALOCAL INFILEを実行する機能がある場合、クライアントはローカルファイルからリモートのMySQLサーバーにデータをロードできます。 local_infileパラメーターは、MySQLクライアントのコンピューターにあるファイルをLOADDATAINFILEまたはSELECTlocal_fileを介してロードまたは選択できるかどうかを指定します。

    これは、潜在的に、クライアントがアクセスできるファイルを読み取るのに役立ちます。たとえば、アプリケーションサーバーでは、HTTPサーバーがアクセスできる任意のデータにアクセスできます。これを回避するには、my.cnfでlocal-infile=0を設定する必要があります。

    次のSQLステートメントを実行し、[値]フィールドが[オフ]に設定されていることを確認します。

    SHOW VARIABLES WHERE Variable_name = 'local_infile';

    暗号化されていないテーブルスペースを監視する

    MySQL 5.7.11以降、InnoDBは、ファイルごとのテーブルスペースに格納されているテーブルのデータ暗号化をサポートしています。この機能は、物理表領域データファイルの保存時の暗号化を提供します。テーブルが暗号化されているかどうかを確認するには、次のコマンドを実行します。

    mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
           WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
    
    +--------------+------------+----------------+
    | TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
    +--------------+------------+----------------+
    | test         | t1         | ENCRYPTION="Y" |
    +--------------+------------+----------------+

    暗号化の一環として、バイナリログの暗号化も検討する必要があります。 MySQLサーバーはバイナリログに多くの情報を書き込みます。

    暗号化接続の検証

    一部の設定では、すべての接続がUnixソケットを介してローカルで管理されている場合、ネットワークを介してデータベースにアクセスできないようにする必要があります。このような場合、my.cnfに「skip-networking」変数を追加できます。スキップネットワーキングは、MySQLがTCP / IP接続を使用できないようにし、LinuxではUnixソケットのみが可能になります。

    ただし、ネットワーク経由でMySQLにアクセスするのが一般的であるため、これはかなりまれな状況です。次に、接続が暗号化されていることを監視する必要があります。 MySQLは、MySQLサーバー(レプリケーション)間およびMySQLサーバーとクライアント間の両方のトラフィックを暗号化する手段としてSSLをサポートしています。 Galeraクラスターを使用する場合は、同様の機能を利用できます。クラスター内通信とクライアントとの接続の両方をSSLを使用して暗号化できます。 SSL暗号化を使用しているかどうかを確認するには、次のクエリを実行します。

    SHOW variables WHERE variable_name = 'have_ssl'; 
    select ssl_verify_server_cert from mysql.slave_master_info;

    今のところ以上です。これは完全なリストではありません。本番データベースで現在行っている他のチェックがあるかどうかをお知らせください。


    1. Microsoft SQL Serverエラー926を修正する方法?-解決しました

    2. MySQLデータベースがクラッシュしたのはなぜですか?新しいMySQLフリーズフレームで洞察を得る

    3. MySQL Group_Concat()とT-SQL String_Agg()

    4. MySQLおよびMariaDBサーバーで人気のあるDockerイメージ