MySQL 8.0 リファレンスマニュアル


23.5.17.2 NDB Cluster および MySQL の権限

このセクションでは、NDB Cluster に関連して MySQL 特権システムがどのように機能するか、および NDB Cluster をセキュアに保つためのこれの影響について説明します。

標準 MySQL 権限は、「NDB Cluster」テーブルに適用されます。 これには、データベース、テーブル、およびカラムのレベルで付与されるすべての MySQL 権限タイプ (SELECT 権限、UPDATE 権限、DELETE 権限など) が含まれます。 その他の MySQL サーバーの場合と同様に、ユーザーおよび権限の情報は mysql システムデータベースに格納されます。 NDB テーブル、このようなテーブルを含むデータベース、およびこのようなテーブル内のカラムに対する権限を付与および取り消すために使用される SQL ステートメントは、(その他の) MySQL ストレージエンジンを含むデータベースオブジェクトとの接続に使用される GRANT および REVOKE ステートメントとすべての点で同じです。 CREATE USER および DROP USER ステートメントについても、同じことが当てはまります。

デフォルトでは、MySQL 付与テーブルは MyISAM ストレージエンジンを使用することに注意してください。 このため、これらのテーブルは通常、NDB Cluster 内の SQL ノードとして機能する MySQL サーバー間で複製または共有されません。 言い換えると、デフォルトでは、ユーザーおよびそれらの権限を変更しても自動的に SQL ノード間に反映されません。 必要に応じて、NDB Cluster SQL ノード間での MySQL ユーザーおよび特権の自動配布を有効にできます。詳細は、セクション23.5.12「NDB_STORED_USER での分散 MySQL 権限」 を参照してください。

逆に、MySQL には権限を拒否する方法がないため (権限は最初の場所で取り消すことも付与しないこともできますが、拒否することもできません)、ある SQL ノード上の NDB テーブルに対する特別な保護はありません (これは、ユーザー権限の自動配布を使用していない場合でも当てはまります)。 これを示す明確な例として、任意のデータベースオブジェクトに対して任意のアクションを実行できる MySQL の root アカウントが挙げられます。 このアカウントを config.ini ファイルの空の [mysqld] または [api] セクションと組み合わせると、著しく危険になる可能性があります。 その理由を理解するために、次のようなシナリオを検討します。

  • config.ini ファイルには、少なくとも 1 つの空の [mysqld] または [api] セクションが含まれています。 つまり、NDB Cluster 管理サーバーは、MySQL Server (またはほかの API ノード) が NDB Cluster にアクセスするホストのチェックを実行しません。

  • ファイアウォールが存在しないか、ファイアウォールが NDB Cluster へのアクセスをネットワーク外部のホストから保護できません。

  • NDB Cluster 管理サーバーのホスト名または IP アドレスは既知であるか、ネットワークの外部から決定できます。

これらの条件が true の場合、だれでも --ndbcluster --ndb-connectstring=management_host を使用して MySQL Server を起動し、この NDB Cluster にアクセスできます。 MySQL root アカウントを使用すると、このユーザーは次のアクションを実行できます。

  • SHOW DATABASES ステートメント (サーバー上のすべての NDB データベースのリストを取得する) または SHOW TABLES FROM some_ndb_database ステートメントなどのメタデータステートメントを実行して、特定のデータベース内のすべての NDB テーブルのリストを取得します。

  • 検出された任意のテーブルに対して、次のような有効な MySQL ステートメントを実行します:

    • 任意のテーブルからすべてのデータを読み取る SELECT * FROM some_table

    • テーブルからすべてのデータを削除する DELETE FROM some_table

    • テーブルスキーマを確認する DESCRIBE some_table または SHOW CREATE TABLE some_table

    • テーブルカラムに不正データを入力する UPDATE some_table SET column1 = some_value。これは実際に、単にすべてのデータを削除するよりも、はるかに大きな損害が発生する可能性があります

      より狡猾なバリエーションには、次のようなステートメントが含まれることがあります。

      UPDATE some_table SET an_int_column = an_int_column + 1

      または

      UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)

      このような悪意のあるステートメントは、攻撃者の想像力でしか制限されません。

    このような種類の攻撃を受けるおそれのない唯一のテーブルは、NDB 以外のストレージエンジンを使用して作成され、そのために不正な SQL ノードから見えないテーブルです。

    root としてログインできるユーザーは、INFORMATION_SCHEMA データベースとそのテーブルにもアクセスできるため、データベース、テーブル、ストアドルーチン、スケジュール済イベント、およびメタデータが INFORMATION_SCHEMA に格納されているその他のデータベースオブジェクトに関する情報を取得できます。

    また、分散特権を使用していないかぎり、異なる NDB Cluster SQL ノード上の root アカウントに異なるパスワードを使用することをお勧めします。

つまり、ローカルネットワークの外部から直接アクセスできる場合は、安全な NDB Cluster を持つことはできません。

重要

MySQL の root アカウントのパスワードは空のままにしないでください。 これは、NDB Cluster SQL ノードとして MySQL を実行している場合と同様に、スタンドアロン (非クラスタ) MySQL Server として実行している場合にも当てはまり、NDB Cluster で MySQL Server を SQL ノードとして構成する前に、MySQL インストールプロセスの一部として実行するようにしてください。

NDB Cluster 分散特権機能を採用する場合は、NDB ストレージエンジンを手動で使用するように mysql データベース内のシステムテーブルを変換するだけではありません。 代わりに、この目的のために提供されているストアドプロシージャーを使用してください。セクション23.5.12「NDB_STORED_USER での分散 MySQL 権限」を参照してください。

それ以外の場合、SQL ノード間で mysql システムテーブルを同期する必要がある場合は、標準の MySQL レプリケーションを使用してこれを実行することも、スクリプトを使用して MySQL サーバー間でテーブルエントリをコピーすることもできます。

サマリー.  NDB Cluster に関する MySQL 特権システムについて覚えておくべきもっとも重要な点を次に示します:

  1. ある SQL ノード上で確立されたユーザーおよび権限は、クラスタ内のその他の SQL ノードで自動的に存在することも、有効になることもありません。 逆に、クラスタ内のある SQL ノード上のユーザーまたは権限を削除しても、その他の SQL ノードからユーザーまたは権限は削除されません。

  2. NDB Cluster 配布でこの目的のために提供されている SQL スクリプトとそれに含まれているストアドプロシージャーを使用して、MySQL ユーザーおよび権限を SQL ノード間で配布できます。

  3. NDB Cluster 内のある SQL ノードから NDB テーブルに対する権限が MySQL ユーザーに付与されると、そのユーザーは、権限配布を使用していない場合でも、データの元となった SQL ノードに関係なく、そのテーブル内の任意のデータを「参照」できます。


関連キーワード:  NDB, テーブル, ndbinfo, ノード, ndb, 権限, データ, 管理, 構成, データベース