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 はフォームの定期的な検証を実装します (検証後にのみ送信)

推薦する

Linux での mysql および mysql.sock のインストールに関する問題

最近、Linux に Aphace、mysql、php をインストールするときに多くの問題に遭遇しま...

MySQL マスタースレーブレプリケーションの原理からインストールと設定までを包括的に解説します。

マスタースレーブレプリケーションがなぜ必要なのでしょうか? 1. 複雑な業務システムでは、SQL 文...

MySQL における TIMESTAMPDIFF ケースの詳細な説明

1.構文TIMESTAMPDIFF(unit,begin,end); 単位に従って時間差を返します。...

Vue は小数点付きの星評価を実装します

この記事では、小数点付きの星評価を実装するためのVueの具体的なコードを参考までに共有します。具体的...

データバインディングとリストデータの表示にはVue3を使用する

目次1. Vue2との比較1. Vue3の新機能2. Vue2とVue3の応答原理の比較3. 配列の...

Mac M1 での Nginx のマルチサイト構成の実装

注: nginxはbrew経由でインストールされますウェブサイトのルートディレクトリ: /opt/h...

MySQL データベースの基礎: 基本コマンドの概要

目次1. ヘルプ情報を使用する2. データベースの作成、削除、表示3. データベースに接続する4. ...

HTML タイトル属性をラップする方法

数日前にプログラムを書いていたとき、プロンプト情報 (TITLE) を新しい行で囲みたいと思いました...

MySQL 5.6.22 のインストールと設定方法のグラフィックチュートリアル

このチュートリアルでは、MySQL5.6.22のインストールと設定方法の具体的なコードを参考までに共...

ウェブページ上の小さなスペースに大きな画像を配置する方法

出典: www.bamagazine.comウェブページのバナー、ニュースの見出しの周りのスペース、...

Nginx の場所と proxy_pass パスの設定の問題の概要

目次1. Nginxロケーションの基本設定1.1 Nginx 設定ファイル1.2 Pythonスクリ...

HTML ウェブページの段落レイアウトと改行

Web ページの外観はレイアウトに大きく左右されます。ページ内に長い段落のテキストがある場合、通常は...

Docker はすべてのコンテナをバッチ起動して閉じます

Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...

ウェブデザインにおけるポップアップウィンドウとフローティングレイヤーのデザイン

従来のソフトウェアから Web ウェアへの段階的な移行の傾向の中で、デザイン パターンとテクノロジは...

jQueryはすべての選択と逆選択操作ケースを実装します

この記事では、全選択と逆選択操作を実装するためのjQueryの具体的なコードを参考までに共有します。...