MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

MySQL は information_schema オブジェクトの付与をバイパスし、ERROR 1044 (4200) エラーを報告します

この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のようなビジネス要件があります (以下は彼の原文です)。

MySQL の多くの機能は主キーに依存しているため、zabbix ユーザーを使用してビジネス データベース内のすべてのテーブルを監視し、主キーが確立されているかどうかを確認したいと考えています。

監視ステートメントは次のとおりです。

information_schema.tables t1から 
    左外部結合 information_schema.table_constraints t2 
          t1.table_schema = t2.table_schema の場合 
            かつ t1.テーブル名 = t2.テーブル名 
            AND t2.constraint_name IN ( 'PRIMARY' ) 
t2.table_name が NULL の場合 
    t1.table_schema が ( 'information_schema'、 'myawr'、 'mysql'、 に含まれない) 
                  'パフォーマンススキーマ', 
                  'slowlog'、'sys'、'test' ) 
    かつ t1.table_type = 'ベーステーブル'

しかし、zabbix ユーザーがビジネス データベース内のデータを読み取ることができるようにしたくありません。 Zabbix ユーザーにビジネス データベース データの読み取り権限が付与されなくなると、information_schema.TABLES および information_schema.TABLE_CONSTRAINTS にはビジネス データベースのテーブル情報が含まれなくなり、ビジネス データベース テーブルに主キーがあるかどうかをカウントできなくなります。ビジネス データベース テーブルに主キーが確立されていないかどうかを監視しているときに、Zabbix がビジネス データベース データを読み取らないようにする方法はありますか?

まず、次の事実を知っておく必要があります。information_schema の下のビューは特定のユーザーに許可できません。下記の通り

mysql> information_schema.TABLES に対して test@'%' への SELECT 権限を付与します。
エラー 1044 (42000): ユーザー 'root'@'localhost' によるデータベース 'information_schema' へのアクセスが拒否されました

この問題の詳細については、mos のこの記事を参照してください: INFORMATION_SCHEMA の権限設定が機能しない理由 (ドキュメント ID 1941558.1)

適用対象:

MySQL サーバー - バージョン 5.6 以降

このドキュメントの情報は、どのプラットフォームにも適用されます。

ゴール

INFORMATION_SCHEMA に対する MySQL 権限がどのように機能するかを決定します。

解決

単純な GRANT ステートメントは次のようになります。

mysql> information_schema.* に対する select、execute 権限を 'dbadm'@'localhost' に付与します。

エラー 1044 (42000): ユーザー 'root'@'localhost' によるデータベース 'information_schema' へのアクセスが拒否されました

このエラーは、スーパーユーザーにinformation_schemaアクセス権限を変更する権限がないことを示しています。

これは、SUPER 権限を持つ root アカウントの場合に通常起こることとは矛盾しているようです。

このエラーが発生する理由は、information_schema データベースが実際にはサービスの開始時に構築される仮想データベースであるためです。

これは、サーバーのメタデータ、つまりデータベース サーバー内のすべてのテーブル、プロシージャなどの詳細を追跡するように設計されたテーブルとビューで構成されています。

したがって、上記のコマンドを具体的に見ると、この特殊なデータベースに SELECT 権限と EXECUTE 権限を追加しようとしていることがわかります。

ただし、すべてのユーザーが information_schema データベース内のテーブルを読み取ることができるため、SELECT オプションは不要であり、これは冗長です。

この特別なデータベースではプロシージャを作成することは許可されていないため、EXECUTE オプションは意味がありません。

また、INSERT、UPDATE、DELETE などの観点からテーブルを変更する機能もないため、権限はユーザーごとに管理されるのではなく、ハードコードされています。

では、この認証の問題をどのように解決すればよいのでしょうか? 直接的な認証は機能しないため、この問題を回避して間接的に認証を実装することしかできません。考え方は次のとおりです。まず、主キーのないテーブルの数を見つけるストアド プロシージャ (ユーザー データベース) を作成し、それをテスト ユーザーに付与します。

区切り文字 //
CREATE DEFINER=`root`@`localhost` PROCEDURE `moitor_without_primarykey`()
始める
   選択カウント(*) 
information_schema.tables t1から 
    左外部結合 information_schema.table_constraints t2 
          t1.table_schema = t2.table_schema の場合 
            かつ t1.テーブル名 = t2.テーブル名 
            AND t2.constraint_name IN ( 'PRIMARY' ) 
t2.table_name が NULL の場合 
    t1.table_schema が ( 'information_schema'、 'myawr'、 'mysql'、 に含まれない) 
                  'パフォーマンススキーマ', 
                  'slowlog'、'sys'、'test' ) 
    AND t1.table_type = 'ベーステーブル';
終わり //
区切り文字 ;
 
 
mysql> プロシージャ moitor_without_primarykey の実行権限を 'test'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

この時点で、テストは information_schema の下のオブジェクトを間接的にクエリできます。

mysql> current_user() を選択します。
+----------------+
| 現在のユーザー() |
+----------------+
| テスト@% |
+----------------+
セット内の 1 行 (0.00 秒)
 
mysql> moitor_without_primarykey を呼び出します。
+----------+
| カウント(*) |
+----------+
| 6 |
+----------+
セット内の1行(0.02秒)
 
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

テストユーザーの権限を確認します。

mysql> test@'%' の権限を表示します。
+---------------------------------------------------------------------------------+
| テスト@% の助成金 |
+---------------------------------------------------------------------------------+
| `test`@`%` に *.* の使用権限を付与 |
| プロシージャ `zabbix`.`moitor_without_primarykey` の実行権限を `test`@`%` に付与します |
+---------------------------------------------------------------------------------+
セット内の 2 行 (0.00 秒)

MySQL が information_schema 内のオブジェクトの付与をバイパスし、ERROR 1044 (4200) を報告することについての記事はこれで終わりです。MySQL ERROR 1044 (4200) に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • mysql データベース内の information_schema と mysql を削除できますか?
  • MySQLのinformation_schemaデータベースの解析
  • MySQL information_schema データベースの詳細な説明

<<:  JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

>>:  Dockerfile テキストファイルの使用例の分析

推薦する

Nginx のリロード プロセスの背後にある真実を探る

本日の記事では、主にNginxのリロードプロセスについて紹介します。実は前回の記事では、nginx ...

Linuxファイアウォールiptablesの詳細な紹介、設定方法と事例

1.1 iptablesファイアウォールの概要Netfilter/Iptables (以下、Ipta...

アニメーションの再生と一時停止を制御するための CSS のヒント (非常に実用的)

今日は、CSS を使用してアニメーションの再生と一時停止を制御する非常に簡単なトリックを紹介します。...

Dockerコンテナのセルフスタートを実装する方法

コンテナの自動起動Docker は、コンテナが終了したとき、または Docker が再起動されたとき...

MySQLのインデックスシステムがB+ツリーを使用する理由の分析

目次1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 3. インデック...

VMWare ネットワーク アダプタの 3 つのモードの実装プロセスの分析

3つのモードブリッジ(ブリッジ モード)、NAT(ネットワーク アドレス変換モード)、ホストオンリー...

Ubuntu 16.04 64 ビット版の VMware Tools のインストールと構成のグラフィック チュートリアル

この記事では、VMware Toolsのインストールと構成に関するグラフィックチュートリアルを参考と...

VueのRender関数

目次1. ノード、ツリー、仮想DOM 2. 仮想DOM 2.1 データオブジェクトの詳細2.2 制約...

特殊効果メッセージボックスを実現するネイティブJS

この記事では、ネイティブ JS で実装された特殊効果メッセージ ボックスを紹介します。効果は次のとお...

MySQL に大量のデータを挿入する 4 つの方法の例

序文この記事では主に、MySQLに大量のデータを挿入する4つの方法を紹介し、参考と学習のために共有し...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...

JSアルバム画像の揺れと拡大表示効果のサンプルコード

前回の記事では、JS を使って簡単な揺れ効果を実現する方法を紹介しました。ご興味があればクリックして...

マウスをホバーすると画像が折りたたまれる効果を実現する CSS

マウスをホバーすると画像が折りたたまれる効果を実現する CSS 1. 実施のポイント折り畳みは複数の...

Linuxでシンボリックリンクを削除(削除)するコマンド

Linux では、シンボリック リンクを作成または削除する必要がある場合があります。もしそうなら、何...

Windows環境でのMySQL 8.0.13無料インストールバージョンの設定チュートリアル

目次圧縮ファイルをダウンロードするアドレス: https://dev.mysql.com/downl...