MySQL ストアド プロシージャ関連の権限変更の問題

MySQL ストアド プロシージャ関連の権限変更の問題

MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変更または削除できないという問題によく遭遇します。通常、ストアド プロシージャの定義者には、そのストアド プロシージャを変更および削除する権限がありますが、他のユーザーには対応する権限が必要です。権限がなければ、他のユーザーはストアド プロシージャを表示したり呼び出したりすることはできません。

MySQL で、ユーザー A がストアド プロシージャを作成します。次に、別のユーザー B が A が作成したストアド プロシージャを変更したいと考えています。この状況に基づいて、次のレコードが生成されます。

OTO3 ライブラリに対するユーザー A の権限:

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

ユーザー B の権限:

mysql> 'swper'@'%' の権限を表示します。
+----------------------------------------------------------------------+
| swper@% への助成金 |
+----------------------------------------------------------------------+
| *.* の使用権限を 'swper'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER 権限を 'swper'@'%' に付与します |
+----------------------------------------------------------------------+
セット内の 2 行 (0.00 秒)

ユーザー B として MySQL にログインします。

[root@mysql ~]# mysql -h10.0.10.110 -uswper -p123456

ストアド プロシージャ リストを確認すると、権限がないというメッセージが表示されます。

mysql> mysql.proc から `name` を選択します。ここで、db = 'OTO3'、`type` = 'PROCEDURE' です。
エラー 1142 (42000): テーブル 'proc' に対する SELECT コマンドがユーザー 'swper'@'mysql' に拒否されました

ルートとして、ユーザー B にストアド プロシージャを表示する権限を追加します。

mysql> mysql.proc に対する 'swper'@'%' への選択権限を付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
 
mysql> 'swper'@'%' の権限を表示します。
+----------------------------------------------------------------------+
| swper@% への助成金 |
+----------------------------------------------------------------------+
| *.* の使用権限を 'swper'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER 権限を 'swper'@'%' に付与します |
| `mysql`.`proc` に対する 'swper'@'%' への SELECT 権限を付与します |
+----------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

ユーザー B に戻り、ストアド プロシージャの一覧を表示します。

mysql> mysql.proc から `name` を選択します。ここで、db = 'OTO3'、`type` = 'PROCEDURE' です。
+------------------------+
| 名前 |
+------------------------+
| プロセスcs |
+------------------------+
セット内の 1 行 (0.00 秒)

この時点では、追加の mysql データベースが見つかりますが、mysql.proc に対するクエリ権限のみが使用可能です。

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|OTO3|
|mysql |
+--------------------+
セット内の 3 行 (0.00 秒)

mysqlライブラリにはprocというテーブルが1つだけあります。

mysql> mysqlを使用する
mysql> テーブルを表示します。
+-----------------+
| MySQL のテーブル |
+-----------------+
|プロセス|
+-----------------+
セット内の 1 行 (0.00 秒)

ストアド プロシージャの詳細も確認できます。

mysql> プロシージャ proc_cs\G の作成を表示します
************************** 1. 行 ****************************
      プロシージャ: proc_cs
      sql_mode: STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION
  プロシージャの作成: CREATE DEFINER=`a`@`%` PROCEDURE `proc_cs`()
始める

ストアド プロシージャの構成を変更してみます。

mysql> ALTER PROCEDURE proc_cs は SQL データを変更します SQL SECURITY INVOKER;
エラー 1370 (42000): ルーチン 'OTO3.proc_cs' のユーザー 'b'@'%' によるルーチン変更コマンドが拒否されました

表示を容易にするために、Navicat ツールでストアド プロシージャを変更し、保存時に次の権限の問題を報告してください。

1227 - アクセスが拒否されました。この操作には SUPER 権限 (少なくとも 1 つ) が必要です。

ストアド プロシージャを追加して、アクセス許可情報を報告してみます。

1044 - ユーザー 'b'@'%' によるデータベース 'OTO3' へのアクセスが拒否されました

これは、ユーザー b に OTO3 の承認済みストアド プロシージャを変更する権限がないことを意味します。

ユーザー B として次のストアド プロシージャを呼び出してみます。

手順の実行に失敗しました
1370 - ルーチン 'OTO3.proc_cs' のユーザー 'b'@'%' への実行コマンドが拒否されました

走る許可がないのは明らかです。

元のユーザー定義ストアド プロシージャ a を削除しようとすると、次のように権限情報も報告されます。

1370 - ルーチン 'OTO3.proc_cs' のユーザー 'b'@'%' によるルーチン変更コマンドが拒否されました

ユーザー B にはストアド プロシージャを呼び出す権限すらないことを確認できます。ここでは、まず実行権限を追加します。

次に、ストアド プロシージャを実行するための権限を追加します。

mysql> OTO3.* の実行権限を 'b'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
 
mysql> 'b'@'%' の権限を表示します。
+---------------------------------------------------------------------------------+
| b@% への助成金 |
+---------------------------------------------------------------------------------+
| *.* の使用権限を 'b'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER、EXECUTE 権限を 'b'@'%' に付与します |
| `mysql`.`proc` に対する 'b'@'%' への SELECT 権限を付与 |
+---------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

ストアド プロシージャを再度実行し、成功したことを確認します。

時間: 0.080ms
手順は正常に実行されました
影響を受ける行: 0

次に、ストアド プロシージャを作成して追加するための権限を追加します。

mysql> OTO3.* の CREATE ROUTINE を 'b'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql> 'b'@'%' の権限を表示します。
+-------------------------------------------------------------------------------------------------+
| b@% への助成金 |
+-------------------------------------------------------------------------------------------------+
| *.* の使用権限を 'b'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER、EXECUTE、CREATE ROUTINE 権限を 'b'@'%' に付与します |
| `mysql`.`proc` に対する 'b'@'%' への SELECT 権限を付与 |
+-------------------------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

上記の権限を追加したら、ストアド プロシージャを作成できます。

CREATE DEFINER=`b`@`%` PROCEDURE `aaaa`() を作成します
始める
  #ルーチン本体はここに記述します...
mysql.user から * を選択します。
終わり

ただし、作成したものは削除できません。

1370 - ルーチン 'OTO3.aaaa' のユーザー 'b'@'%' に対するルーチン変更コマンドが拒否されました

次に、変更権限を追加します。この権限は削除することもできます。

mysql> OTO3.* の ROUTINE の変更権限を 'b'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

ユーザー権限の表示

mysql> 'b'@'%' の権限を表示します。
+----------------------------------------------------------------------------------------------------------------+
| b@% への助成金 |
+----------------------------------------------------------------------------------------------------------------+
| *.* の使用権限を 'b'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER、EXECUTE、CREATE ROUTINE、ALTER ROUTINE 権限を 'b'@'%' に付与します |
| `mysql`.`proc` に対する 'b'@'%' への SELECT 権限を付与 |
+----------------------------------------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

上記の alter ROUTINE 権限を追加すると、すべての OTO3 ストアド プロシージャの削除権限が付与されます (独自に定義したストアド プロシージャの追加、削除、変更)。他のユーザーが定義したストアド プロシージャは削除できますが、変更することはできません。他のユーザーが定義したストアド プロシージャを変更すると、次のプロンプトが表示されます。

1227 - アクセスが拒否されました。この操作には SUPER 権限 (少なくとも 1 つ) が必要です。

この SUPER 権限がどこにあるか説明していただけますか?ユーザー権限を確認すると、次のことがわかります。

mysql> mysql.user から * を選択し、user='b'\G を指定します。
************************** 1. 行 ****************************
         ホスト: %
         ユーザー: b
      選択権限: N
      挿入権限: N
      更新権限: N
      削除権限: N
      作成権限: N
       ドロップ権限: N
      リロード権限: N
     シャットダウン権限: N
     プロセス権限: N
       ファイル権限: N
      権限付与: N
    参照権限: N
      インデックス権限: N
      権限変更: N
     表示_db_priv: N
      スーパー特権: N
 作成_tmp_table_priv: N
   ロックテーブル権限: N
     実行権限: N
    Repl_slave_priv: N
   Repl_client_priv: N
   作成ビュー権限: N
    表示権限: N
  作成ルーチン権限: N
  ルーチン権限の変更: N
   ユーザー権限の作成: N
      イベント特権: N
     トリガー権限: N
テーブルスペース作成権限: N
       SSL_タイプ:
      SSL暗号:
      x509_発行者:
     x509_件名:
     最大質問数: 0
      最大更新回数: 0
    最大接続数: 0
 最大ユーザー接続数: 0
        プラグイン:mysql_native_password
 認証文字列: *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175
   パスワードの有効期限: N
 パスワード最終変更日時: 2017-03-06 11:37:35
   パスワードの有効期間: NULL
    アカウントロック: N
セット内の 1 行 (0.00 秒)

SUPER 権限を追加してみてください:

mysql> OTO3.* の SUPER 権限を 'b'@'%' に付与します。
エラー 1221 (HY000): DB GRANT および GLOBAL PRIVILEGES の使用方法が正しくありません
 
mysql> *.* に対する SUPER 権限を 'b'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

SUPER は MySQL 全体に対するグローバル権限であるため、指定されたデータベースではこの権限を実行できません。

mysql> 'swper'@'%' の権限を表示します。
+----------------------------------------------------------------------------------------------------------------+
| swper@% への助成金 |
+----------------------------------------------------------------------------------------------------------------+
| 'swper'@'%' に *.* の SUPER 権限を付与 |
| 'swper'@'%' に `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER、EXECUTE、CREATE ROUTINE、ALTER ROUTINE 権限を付与します |
| `mysql`.`proc` に対する 'swper'@'%' への SELECT 権限を付与します |
+----------------------------------------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

再度確認すると、Super_priv: Y が変更されていることがわかります。次に、他の人が定義したストアド プロシージャを変更します。

mysql> mysql.user から * を選択し、user='b'\G を指定します。

すべてのデータベースをチェックしたところ、mysql データベース内の proc テーブルのうち 1 つだけに読み取り権限があることがわかりました。SUPER は思ったほど強力ではありませんでした。

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|OTO3|
|mysql |
+--------------------+
セット内の 3 行 (0.00 秒)

よく見ると、実行ステートメントが見つかります。

mysql> mysql.user から * を選択し、user='b'\G を指定します。

Create_routine_priv: N と Alter_routine_priv: N があることがわかります。これら 2 つの権限は明らかにストアド プロシージャの権限です。SUPER なしでこれら 2 つの権限を使用できますか?

この SUPER 権限を取り戻します。

mysql> 'b'@'%' から *.* のスーパー権限を取り消します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

Alter_routine_priv、Create_routine_priv を追加

mysql> *.* の ALTER ROUTINE、CREATE ROUTINE 権限を 'b'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

ユーザーbの権限を表示する

mysql> 'b'@'%' の権限を表示します。
+----------------------------------------------------------------------------------------------------------------+
| b@% への助成金 |
+----------------------------------------------------------------------------------------------------------------+
| *.* の CREATE ROUTINE、ALTER ROUTINE を 'b'@'%' に付与 |
| `OTO3`.* に対する SELECT、UPDATE、DELETE、DROP、ALTER、EXECUTE、CREATE ROUTINE、ALTER ROUTINE 権限を 'b'@'%' に付与します |
| `mysql`.`proc` に対する 'b'@'%' への SELECT 権限を付与 |
+----------------------------------------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

同じ権限の問題が依然として報告されていることがわかりました。

1227 - アクセスが拒否されました。この操作には SUPER 権限 (少なくとも 1 つ) が必要です。

上記の権限を実行すると、他のシステム ライブラリが表示されます。[たとえば、sys ライブラリにはストアド プロシージャもあります。これら 2 つの権限はグローバルであるためです]

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|OTO3|
|mysql |
| パフォーマンススキーマ |
|システム|
| テスト |
+--------------------+
セット内の 6 行 (0.00 秒)

これら 2 つの権限はより強力です。システム ライブラリ sys 内のストアド プロシージャを表示、変更、削除することさえ可能であり、非常に危険です。権限を再度取り消すことにしました。

ルーチンの作成、ルーチンの変更。
mysql> 'b'@'%' から *.* の create ルーチン、alter ルーチンを取り消します。

SUPER 権限を使用する方が安全です。

上記のテストから以下の結論が導き出されました。

  • ストアド プロシージャの権限を表示します。SELECT # は mysql.proc テーブルの権限です。
  • ストアド プロシージャの実行権限: EXECUTE # は指定されたデータベースに対する権限です。
  • ストアド プロシージャ権限の作成: CREATE ROUTINE # は指定されたデータベースに対する権限です。
  • ストアド プロシージャの権限を変更します。ALTER ROUTINE # は、指定されたデータベースにストアド プロシージャを定義します。
  • 他の人が定義したストアド プロシージャの権限を変更します。SUPER # は MySQL 全体のグローバル権限です。

つまり、ユーザー A はデータベース OTO3 にストアド プロシージャを定義します。次に、ユーザー B を使用してストアド プロシージャを実行および変更したいと考えています。ユーザー B に次の権限を追加する必要があります。

MYSQL.PROC に対する SELECT 権限を 'B' に付与します。
`OTO3`.* に対する EXECUTE、CREATE ROUTINE、ALTER ROUTINE 権限を 'B' に付与します。
*.* の SUPER 権限を 'B' に付与します。

したがって、ユーザー B の最も基本的な権限は次のようになります。

mysql> 'b'@'%' の権限を表示します。
+----------------------------------------------------------------------------------------+
| b@% への助成金 |
+----------------------------------------------------------------------------------------+
| *.* の SUPER 権限を 'b'@'%' に付与 |
| `OTO3`.* に対する SELECT、ALTER、EXECUTE、CREATE ROUTINE、ALTER ROUTINE 権限を 'b'@'%' に付与します |
| `mysql`.`proc` に対する 'b'@'%' への SELECT 権限を付与 |
+----------------------------------------------------------------------------------------+
セット内の 3 行 (0.00 秒)

この時点で、別のユーザーが MySQL で他のユーザーによって定義されたストアド プロシージャを変更する権限を持っていることは明らかです。

ストアド プロシージャが別のユーザーとして呼び出されていない場合は、ルート権限を使用してストアド プロシージャの定義者を変更できます。これは、Linux で所有者の権限を変更することと同じです。

mysql.proc を更新し、DEFINER='b'@'%' WHERE NAME='proc_cs' AND db='OTO3' を設定します。

これで、MySQL の変更されたストアド プロシージャに関連する権限の問題に関するこの記事は終了です。MySQL ストアド プロシージャの権限に関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLユーザー権限テーブルについての簡単な説明
  • MySQL ユーザー権限管理の実装
  • MySQLユーザー権限管理の詳細な説明
  • MySQL 権限制御の詳細分析
  • MySQL 権限制御の詳細な説明
  • MySQLでユーザーを作成し、ユーザーに権限を付与する方法の詳細なチュートリアル
  • MySQL 8.0 でリモートアクセス権限を設定する方法
  • MySQL 権限とデータベース設計のケーススタディ

<<:  Iframe の内外のページで JS がどのように動作するかの概要

>>:  Alibaba Cloud Disk を無制限に有効化するための招待コードを 6 つ共有します。信じられないかもしれませんが、Alibaba Cloud Disk を有効化できます。

推薦する

Dockerレジストリイメージ同期の実装アイデア

はじめに以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。...

海外の無料写真素材サイトベスト9

良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...

ブートストラップ学習体験のまとめ - CSS スタイル デザイン共有

プロジェクトのニーズにより、ブートストラップ フレームワークを慎重に学習する予定です。以前から少しは...

MySQLインデックスとは何ですか?わからない場合は聞いてください

目次概要二分木からB+木へクラスター化インデックス非クラスター化インデックスジョイントインデックスと...

MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

目次問題の説明解決問題分析問題の説明MySQL で delete ステートメントを使用してデータを削...

MySQL 8.0.12 インストール グラフィック チュートリアル

MySQL8.0.12 インストールチュートリアルをみんなで共有します。 1. インストール1.イン...

Vue.js スロットにおけるスコープ付きスロットの使用法の詳細な説明

目次スロットなしVue2.x スロットスロット付き名前付きスロットスロット属性なしスロットの簡単なサ...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

Linux 7.6 バイナリに MySQL 8.0.27 をインストールする詳細な手順

目次1. 環境整備1.1 オペレーティング システムのバージョン1.2 ディスク容量1.3 ファイア...

大量のデータを含むエレメントのシャトルボックスで「すべて選択」をクリックするとスタックする問題の解決方法

目次解決策1: EUIの転送コンポーネントをコピーして変更し、プロジェクトディレクトリに導入する解決...

テーブルはセルとimg画像を結合してtd HTML全体を埋めます

ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...

type=fileファイル変更フォームの名前が正常にエコーされない問題を解決

easyui フレームワークのコードは次のとおりです。 css: .ファイルボックス{ フロート:...

onfocus="this.blur()" は視覚障害のあるウェブマスターに嫌われている

スクリーン リーダー ソフトウェアの操作ページについて話しているとき、彼はフロントエンドの学生たちに...

CocosCreatorの共通知識ポイントを整理する

目次1. シーンの読み込み2. ノードを見つける1. ノード検索2. その他のノード操作3. 再生ア...

HTML Webページ作成チュートリアル iframeタグを慎重に使用してください

iframe を使用すると、他の Web サイトのページを簡単に呼び出すことができますが、注意して使...