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

MySQLとMariaDBとPerconaサーバー:セキュリティ機能の比較

    データのセキュリティは、どの組織にとっても重要です。これは、データベース環境の設計に大きな影響を与える可能性のある重要な側面です。使用するMySQLフレーバーを決定するときは、さまざまなサーバーベンダーが提供するセキュリティ機能を考慮する必要があります。このブログ投稿では、Oracle、Percona Server、MariaDBのMySQLCommunityEditionの最新バージョンの簡単な比較を行います。

    mysqld  Ver 5.7.20-19 for Linux on x86_64 (Percona Server (GPL), Release 19, Revision 3c5d3e5d53c)
    mysqld  Ver 5.7.21 for Linux on x86_64 (MySQL Community Server (GPL))
    mysqld  Ver 10.2.12-MariaDB for Linux on x86_64 (MariaDB Server)

    オペレーティングシステムとしてCentos7を使用します。ここに示す結果は、DebianやUbuntuなどの他のディストリビューションでは若干異なる場合があることに注意してください。また、違いに焦点を当てたいので、共通点については説明しません-Percona ServerとMariaDBはMySQLのフレーバーであるため、セキュリティ機能の一部(MySQLファイルのアクセス権限がどのように見えるかなど)はそれらの間で共有されます。

    初期セキュリティ

    ユーザー

    PerconaServerとMySQLCommunityServerの両方に、rootユーザー用にランダムに生成された一時パスワードが付属しています。 MySQLのエラーログの内容を確認して見つける必要があります:

    2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g

    ログインすると、パスワードの変更が強制されます:

    [[email protected] ~]# mysql -uroot -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.21
    
    Copyright (c) 2000, 2018, 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.
    
    mysql> select * from mysql.user;
    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    パスワードは十分に強力である必要があります。これはvalidate_passwordプラグインによって適用されます:

    mysql> alter user [email protected] identified by 'password123.';
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    mysql> alter user [email protected] identified by 'password123.A';
    Query OK, 0 rows affected (0.00 sec)

    MariaDBはランダムなrootパスワードを生成せず、ローカルホストから(そしてlocalhostからのみ)rootアカウントへのパスワードなしのアクセスを提供します。

    [[email protected] ~]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 12
    Server version: 10.2.12-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> SELECT CURRENT_USER();
    +----------------+
    | CURRENT_USER() |
    +----------------+
    | [email protected] |
    +----------------+
    1 row in set (0.00 sec)

    DBAは後でデータベースへのアクセスを構成して保護することになっているため(たとえば、mysql_secure_installationを実行することにより)、これは初期展開フェーズでは大きな問題ではありません。ここでのより大きな問題は、MariaDBによってグッドプラクティスが強制されないことです。 rootユーザーに強力なパスワードを設定する必要がない場合は、後で誰もパスワードを変更せず、パスワードなしのアクセスが維持される可能性があります。そうすると、これは深刻なセキュリティ上の脅威になります。

    私たちが注目したいもう1つの側面は、匿名のパスワードなしのアクセスです。匿名ユーザーは誰でも参加できます。事前定義されたユーザーである必要はありません。そのようなアクセスがパスワードなしの場合、それは誰でもMySQLに接続できることを意味します。通常、このようなアカウントにはUSAGE権限しかありませんが、それでも、MySQLバージョン、文字セットなどの情報を含むステータス('\ s')を出力できます。さらに、' test'スキーマが使用可能な場合、そのようなユーザーは次のことができます。そのスキーマに書き込みます。

    MySQL Community ServerとPerconaサーバーの両方に、MySQLで定義された匿名ユーザーはありません:

    mysql> select user, host, authentication_string from mysql.user;
    +---------------+-----------+-------------------------------------------+
    | user          | host      | authentication_string                     |
    +---------------+-----------+-------------------------------------------+
    | root          | localhost | *EB965412B594F67C8EB611810EF8D406F2CF42BD |
    | mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
    | mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
    +---------------+-----------+-------------------------------------------+
    3 rows in set (0.00 sec)

    一方、MariaDBは、匿名のパスワードなしのアクセスに対応しています。

    MariaDB [(none)]> select user,host,password from mysql.user;
    +------+-----------------------+----------+
    | user | host                  | password |
    +------+-----------------------+----------+
    | root | localhost             |          |
    | root | localhost.localdomain |          |
    | root | 127.0.0.1             |          |
    | root | ::1                   |          |
    |      | localhost             |          |
    |      | localhost.localdomain |          |
    +------+-----------------------+----------+
    6 rows in set (0.00 sec)

    それに加えて、「テスト」スキーマが利用可能です。これにより、匿名ユーザーがデータベースへの書き込みを発行できるようになります。

    [[email protected] ~]# mysql -umyanonymoususer
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 14
    Server version: 10.2.12-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> use test;
    Database changed
    MariaDB [test]> CREATE TABLE mytab (a int);
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [test]> INSERT INTO mytab VALUES (1), (2);
    Query OK, 2 rows affected (0.02 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    MariaDB [test]> SELECT * FROM mytab;
    +------+
    | a    |
    +------+
    |    1 |
    |    2 |
    +------+
    2 rows in set (0.00 sec)

    これは深刻な脅威であり、整理する必要があります。それ以外の場合は、書き込みでサーバーを過負荷にしようとするために簡単に悪用される可能性があります。

    トランジットセキュリティのデータ

    MySQL Community Serverとその両方のフォークは、転送中のデータを暗号化するためのSSLの使用をサポートしています。これはワイドエリアネットワークにとって非常に重要ですが、ローカルネットワークでも見落とされるべきではありません。 SSLは、クライアント側とサーバー側の両方で使用できます。サーバー側の構成(たとえば、マスターからスレーブへのトラフィックを暗号化するため)に関しては、全体的に同じように見えます。ただし、MySQL 5.7で導入されたクライアント側のSSL暗号化に関しては、違いがあります。 5.7より前は、SSLキーとCAを生成し、サーバーとクライアントの両方の構成でそれらを定義する必要がありました。これは、MariaDBの10.2SSLセットアップがどのように見えるかです。 MySQL CommunityServer5.7とPerconaServer5.7(MySQL 5.7に基づく)の両方で、キーを事前に生成する必要はありません。それはすべて、バックグラウンドで自動的に行われます。必要なのは、正しい「--ssl-mode」を設定してクライアントでSSLを有効にすることだけです。 MySQLのCLIクライアントの場合、デフォルトでSSLが有効になるため、これは必要ありません。

    [[email protected] ~]# mysql -p -h127.0.0.1
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 6
    Server version: 5.7.21 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, 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.
    
    mysql> \s
    --------------
    mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper
    
    Connection id:        6
    Current database:
    Current user:        [email protected]
    SSL:            Cipher in use is DHE-RSA-AES256-SHA
    Current pager:        stdout
    Using outfile:        ''
    Using delimiter:    ;
    Server version:        5.7.21 MySQL Community Server (GPL)
    Protocol version:    10
    Connection:        127.0.0.1 via TCP/IP
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    TCP port:        3306
    Uptime:            2 days 21 hours 51 min 52 sec
    
    Threads: 1  Questions: 15  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.000
    --------------

    一方、SSLはデフォルトで無効になっているため、MariaDBでは追加の構成が必要になります。

    [[email protected] ~]# mysql -h127.0.0.1
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 18
    Server version: 10.2.12-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> \s
    --------------
    mysql  Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1
    
    Connection id:        18
    Current database:
    Current user:        [email protected]
    SSL:            Not in use
    Current pager:        stdout
    Using outfile:        ''
    Using delimiter:    ;
    Server:            MariaDB
    Server version:        10.2.12-MariaDB MariaDB Server
    Protocol version:    10
    Connection:        127.0.0.1 via TCP/IP
    Server characterset:    latin1
    Db     characterset:    latin1
    Client characterset:    utf8
    Conn.  characterset:    utf8
    TCP port:        3306
    Uptime:            2 days 22 hours 26 min 58 sec
    
    Threads: 7  Questions: 45  Slow queries: 0  Opens: 18  Flush tables: 1  Open tables: 12  Queries per second avg: 0.000
    --------------

    保存データの暗号化

    まず第一に、バックアップ-xtrabackupやMariaDB Backup(xtrabackupのフォーク)のような無料で利用できるバックアップツールがあります。これらにより、このブログ投稿で説明する3つのMySQLフレーバーすべての暗号化されたバックアップを作成できます。

    3つのフレーバーはすべて、実行中のデータベースの暗号化をサポートしていますが、暗号化されるデータには違いがあります。

    MySQL Community Serverは、InnoDBテーブルスペースの暗号化のみをサポートします。暗号化に使用されるキーはファイルに保存されます(これは規制に準拠していません-キーはボールトに保存する必要があります-MySQL Enterpriseがサポートするものです)。 PerconaServerはMySQLCommunityServerに基づいているため、InnoDBテーブルスペースの暗号化もサポートしています。最近、Percona Server 5.7.20で、一般的なテーブルスペースの暗号化のサポートが追加されました(以前のバージョンおよびMySQL Community Editionの個々のテーブルスペースのみと比較して)。バイナリログの暗号化のサポートも追加されました。 Percona Serverにはkeyring_vaultプラグインが付属しており、これを使用してHashicorp Vaultサーバーにキーを保存できるため、PerconaServer5.7.20は保存データの暗号化に関する規制要件に準拠しています。

    MariaDB 10.2は、より高度な保存データ暗号化をサポートしています。表領域とバイナリ/リレーログの暗号化に加えて、InnoDBREDOログの暗号化をサポートしています。現在、これはデータ暗号化に関するより完全なソリューションです。

    監査ログ

    3つのMySQLフレーバーはすべて、監査ログをサポートしています。それらのスコープはほぼ同等です。接続イベントと切断イベント、実行されたクエリ、アクセスされたテーブルです。ログには、そのようなイベントに参加したユーザー、ユーザーがログインしたホスト、発生時刻、および同様の情報に関する情報が含まれています。このようなイベントは、syslogを介してログに記録し、外部ログサーバーに保存して、ログの分析と解析を可能にすることもできます。

    データマスキング、SQLファイアウォール

    説明したすべてのMySQLフレーバーは、データマスキングの実装を可能にし、いくつかのルールに基づいてSQLトラフィックをブロックできるある種のツールで動作します。データマスキングは、データベースの外部で、クライアントに到達する前に一部のデータを難読化する方法です。例として、データベースにプレーンテキストで保存されているクレジットカードデータがありますが、開発者がそのようなデータをクエリしたい場合、数字の代わりに「xxxxxxxx...」が表示されます。ここで話しているツールは、ProxySQLとMaxScaleです。 MaxScaleはMariaDBCorporationの製品であり、サブスクリプションベースです。 ProxySQLは、無料で使用できるデータベースプロキシです。どちらのプロキシも、どのMySQLフレーバーでも使用できます。

    今日はこれですべてです。詳細については、MySQLおよびMariaDBデータベースを保護するためのこれらの10のヒントを確認してください。


    1. ストアドプロシージャから複数のテーブルを返す

    2. MariaDBでモジュロを返す3つの方法

    3. 左側のvarcharを特定の長さにパディングする最も効率的なT-SQLの方法は?

    4. OracleからPostgreSQLへ:START WITH / CONNECT BY