MySQL ストアド プロシージャの権限の問題の概要

MySQL ストアド プロシージャの権限の問題の概要

MySQL ストアド プロシージャは、確かに、非常にまれな使用シナリオのように見えます。この問題は、いくつかの権限を有効にする必要のある許可申請の作業指示書を提出した開発者から発生しました。

これはごく普通の操作ですが、私の意見ではむしろ緊急かつ差し迫ったものです。正直に言うと、私は方向性の計画と開発に忙しく、この基本的な操作機能を見落としていました。そのため、現在の実装方法のいくつかを見た後でも、これらの反復的なタスクを解放するためにいくつかの小さなことをしたいと考えています。

もちろん、基本的な作業の一部は私が引き継ぐことにしました。一方では同僚の負担を軽減するため、他方では完全な体験を生み出すためでした。多くのニーズや問題点は実践を通じて簡単に把握できるからです。無理だと思うなら、このプロセスには必ず改善の余地があるでしょう。たとえば、展開とインストール、権限の有効化などです。データベース権限を有効にするのは比較的一般的なケースですが、ストアド プロシージャの権限を有効にすると、人々の生活に疑問が生じることもあります。

問題のシナリオはまだ非常に基本的です。開発者はいくつかの基本的な権限を開き、権限をマークするときに追加、削除、変更、クエリに必要な権限と、削除、変更、作成などの DDL 権限を宣言する必要があります。これを見たとき、何かおかしいと感じました。どのような操作にこのような広範な権限が必要なのでしょうか?

私は単に自分の立場を述べました。開発者の考えは管理を容易にすることだったので、私は彼を直接雇いました。簡単なコミュニケーションの後、彼らの需要シナリオは実際には非常に日常的であることがわかりました。彼らはいくつかの日常的なテーブルを動的に作成する必要があり、評価後に作成権限を付与することができました。一般ユーザーには、作成権限は推奨されません。主な出発点は、SQL の基本的な監査を実行できるようにすることです。手動監査やプラットフォーム監査も必要なプロセスです。そこで、何度かやり取りした後、有効になっている権限はすぐに削減できることがわかりました。また、特定のシナリオでは、ロジックをより柔軟に制御したいと考えているため、ストアド プロシージャのロジックを変更する必要もありました。

さて、これが基本的な背景の紹介です。基本テーブルとストアド プロシージャに権限を付与します。ストアド プロシージャに関して注意すべき重要な点は、SQL セキュリティです。デフォルトの作成は定義者です。他のユーザーに公開する必要がある場合は、呼び出し者に設定することをお勧めします。

つまり、簡単な文は次のようになります。

xxx.xxx に対する実行、変更プロシージャを xxx@'xxxx' に許可します。

残念ながら、開発者からは、SQLyog または Navicator でストアド プロシージャを開いたときにその内容が表示されないという報告がありました。

手順を選択したり、手順を表示したりする権限がないため、介入する方法はほとんどありません。

この問題は、コマンドラインを使用して再現できます。

ストアド プロシージャの実質的な内容はありません。しばらく苦労した後、それが 10 年以上前の古い問題であることがわかりました。

参考:

この問題の解決策は実は非常に簡単で、次の文だけが必要です。

mysql.proc に対する選択権限を xxxx@'xxxx' に付与します。

きめ細かい権限制御は非常に複雑ですが、確かに効果的です。

たとえば、MySQL のすべての権限は非常に大きな権限であることはわかっていますが、そこにいくつの種類の権限が含まれているかについては明確な概念がない場合があります。

きめ細かな権限制御によって、これを完全に元に戻すことができます。

たとえば、ユーザーを作成し、すべての権限を付与します。

mysql> 'jeanron100' によって識別される 'jeanron'@'%' に test.* のすべての権限を付与します。 
クエリは正常、影響を受けた行は 0 行、警告は 1 件 (0.00 秒)

含まれる権限は次のとおりです。

mysql> jeanron の権限を表示します。 
+---------------------------------------------------+ 
| jeanron@% への助成金 | 
+---------------------------------------------------+ 
| *.* の使用権限を 'jeanron'@'%' に付与 | 
| `test`.* のすべての権限を 'jeanron'@'%' に付与します | 
+---------------------------------------------------+ 
セット内の 2 行 (0.00 秒)

縮約してみましょう。

mysql> test.* への挿入を jeanron@'%' から取り消します。 
クエリは正常、影響を受けた行は 0 行 (0.00 秒) 
これで、すべての権限の許可が明らかになりました。
mysql> jeanron の権限を表示します。 
| jeanron@% への助成金 
+------------------------------------------------------------------------------------------------------ 
| *.* の使用権限を 'jeanron'@'%' に付与 
| 'jeanron'@'%' に対して、SELECT、UPDATE、DELETE、CREATE、DROP、REFERENCES、INDEX、ALTER、CREATE TEMPORARY TABLES、LOCK TABLES、EXECUTE、CREATE VIEW、SHOW VIEW、CREATE ROUTINE、ALTER ROUTINE、EVENT、TRIGGER ON の権限を 'test'.* に付与します |

したがって、上記の質問では、*.* の select に実際に必要なきめ細かい権限が既に含まれている場合、mysql.proc です。これを解明すると、基本的にはこのルーチンになります。

補足: MySQLストアドプロシージャ作成権限の問題を見てみましょう

まず、MySQL ストアド プロシージャが登場したときに、さらに 5 つのユーザー権限が追加されました。そのうち 3 つはストアド プロシージャに関連していました。

  • ALTER ROUTINE ストアドプロシージャを編集または削除する
  • CREATE ROUTINE ストアドプロシージャを作成する
  • EXECUTEはストアドプロシージャを実行します

これら 3 つの権限は、GRANT を使用してユーザーを作成するときに割り当てられます。 デフォルトでは、ストアド プロシージャは作成者の権限で実行されます。

ユーザーがストアド プロシージャを作成する権限を持っている場合、選択、更新、または削除の権限を持っていない場合は、データを操作するためのストアド プロシージャを作成することはできますが、ストアド プロシージャを実行する権限を持っていても、ストアド プロシージャの呼び出しは失敗し、権限エラーが返されることに注意してください。したがって、誰かが、選択、更新、削除の権限がなく、CREATE ROUTINE 権限のみを持つユーザーを作成した場合は、その人を叱ってください。それは故意に行われたことだからです。

もちろん、そのようなユーザーが作成したストアド プロシージャは完全に使用できないわけではありません。ストアド プロシージャの作成には、ストアド プロシージャがランナーの権限を使用できるようにする機能句があります。ストアド プロシージャを作成したら、SQL SECURITY INVOKER 機能句を追加するだけです。

次のように。

CREATE PROCEDURE p() SQL SECURITY INVOKER 這、2 つのグループのユーザーを割り当てることができます。1 つのグループには開発者としてストアド プロシージャを作成する権限が与えられ、もう 1 つのグループにはテスターとしてストアド プロシージャを実行し、権限を選択、更新、および削除する権限が与えられます。 (頭がおかしい) このような権限の割り当てでは、MySQL のセキュリティを機能レベルで保護する必要はありません。ストアド プロシージャはルート ユーザーで作成しましたが、ストアド プロシージャを実行する権限のみを持つユーザーで機能レベルで呼び出しました。したがって、機能レイヤーからデータベースのユーザー名とパスワードを取得し、IP をシミュレートしても、必要なものは何も取得できません。 権限があれば、セキュリティの問題を心配することなくストアド プロシージャを使用できます。

要約する

上記は、私が紹介した MySQL ストアド プロシージャのアクセス許可の問題の概要です。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ関連の権限変更の問題

<<:  インターフェースなしで Centos7 に JDK と Tomcat をデプロイするチュートリアル

>>:  ネイティブ js はフォームの定期的な検証を実装します (検証後にのみ送信)

推薦する

Docker が占有するディスク領域をクリーンアップする方法

Docker は多くのスペースを占有します。コンテナを実行したり、イメージを取得したり、アプリケー...

HTMLのマーキータグは、シームレスなスクロールマーキー効果を実現します。

<marquee> タグはペアで表示されるタグです。最初のタグ <marquee...

JavaScriptはXiaomi Mall公式サイトの完全なページ実装プロセスを模倣します

目次1. ホームページ制作1. ダウンロードアプリの制作2. ナビゲーションバーの制作3. カルーセ...

Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明

サーバーも 2 つあります。準備:コンテナのホスト名を設定する consul: kv タイプのストレ...

Ubuntu LinuxにOracle Java 14をインストールする方法

最近、Oracle は Java 14 (または Oracle JDK 14) の一般公開を発表しま...

デジタル時計効果を実現するJavaScript

この記事では、デジタル時計効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...

Ubuntu での mysql のインストールと使用 (一般版)

Ubuntu のバージョンに関係なく、MySQL データベースのインストールは基本的に同じです。具...

HTMLタグの説明

HTMLタグの説明1. HTMLタグタグ: !DOCTYPE説明: HTML ドキュメントが準拠する...

dockerエラーの原因分析 終了しました (1) 4分前

Dockerエラー1. 原因を確認するdocker ログ ネクサス2. エラーの原因OpenJDK ...

Vueで背景色と透明度を設定する方法

背景色と透明度の設定上記のように、最初の画像の場合は、灰色の背景と左上隅に白い「カバー」という文字を...

JS の toFixed() メソッドの丸め精度の問題の詳細な説明

目次落とし穴充填方法何の穴ですか?要約する落とし穴最近、仕事で商品の割引価格を計算すると、いつも1セ...

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

目次1. ジョブ実行のフォールトトレランス1.1 タスクフェイルオーバー戦略1.2 ジョブ再開戦略2...

Vueはログイン認証コードを実装する

この記事では、ログイン認証コードを実装するためのvueの具体的なコードを例として紹介します。具体的な...

アリババの中秋節ロゴとウェブサイトのデザインプロセス

<br />まずアイデアを考え、次にスケッチを描き、次にマウスでスケッチし、最後にフラッ...

ウェブページ HTML 特殊記号 HTML 特殊文字比較表

特殊記号名前付きエンティティ10進数エンコード特殊記号名前付きエンティティ10進数エンコードアルファ...