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 ツールでストアド プロシージャを変更し、保存時に次の権限の問題を報告してください。
ストアド プロシージャを追加して、アクセス許可情報を報告してみます。
これは、ユーザー b に OTO3 の承認済みストアド プロシージャを変更する権限がないことを意味します。 ユーザー B として次のストアド プロシージャを呼び出してみます。
走る許可がないのは明らかです。 元のユーザー定義ストアド プロシージャ a を削除しようとすると、次のように権限情報も報告されます。
ユーザー 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 秒) ストアド プロシージャを再度実行し、成功したことを確認します。
次に、ストアド プロシージャを作成して追加するための権限を追加します。 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 から * を選択します。 終わり ただし、作成したものは削除できません。
次に、変更権限を追加します。この権限は削除することもできます。 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 ストアド プロシージャの削除権限が付与されます (独自に定義したストアド プロシージャの追加、削除、変更)。他のユーザーが定義したストアド プロシージャは削除できますが、変更することはできません。他のユーザーが定義したストアド プロシージャを変更すると、次のプロンプトが表示されます。
この 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 秒) 同じ権限の問題が依然として報告されていることがわかりました。
上記の権限を実行すると、他のシステム ライブラリが表示されます。[たとえば、sys ライブラリにはストアド プロシージャもあります。これら 2 つの権限はグローバルであるためです] mysql> データベースを表示します。 +--------------------+ | データベース | +--------------------+ | 情報スキーマ | |OTO3| |mysql | | パフォーマンススキーマ | |システム| | テスト | +--------------------+ セット内の 6 行 (0.00 秒) これら 2 つの権限はより強力です。システム ライブラリ sys 内のストアド プロシージャを表示、変更、削除することさえ可能であり、非常に危険です。権限を再度取り消すことにしました。 ルーチンの作成、ルーチンの変更。 mysql> 'b'@'%' から *.* の create ルーチン、alter ルーチンを取り消します。 SUPER 権限を使用する方が安全です。 上記のテストから以下の結論が導き出されました。
つまり、ユーザー 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Iframe の内外のページで JS がどのように動作するかの概要
>>: Alibaba Cloud Disk を無制限に有効化するための招待コードを 6 つ共有します。信じられないかもしれませんが、Alibaba Cloud Disk を有効化できます。
1. ページ要件1) 標準のヘッダーとフッターを使用するXML/HTML コードコンテンツをクリップ...
序文最近、いくつかのフロントエンド プロジェクトに取り組んでおり、ページにいくつかのテーブルを表示す...
1. まず、公式ウェブサイト https://www.python.org/downloads/so...
環境セントロス6.6 MySQL 5.7インストールシステムがインストールされている場合は、まずアン...
目次1. 機能紹介2. キーコード2.1 ホームページの機能2.2 製品情報を追加する2.3 データ...
最近、セキュリティ製品をテストする必要があったため、mariadb の起動ユーザーを root に調...
JavaScript を使用すると、ハイパーリンクがジャンプするのを防ぐことができます。方法は次の...
目次環境説明DockerのインストールゴグのインストールDocker で .NetCore サービス...
SVN は Subversion の略称で、ブランチ管理システムを使用して効率的に管理するオープンソ...
例示するシステムを自分でインストールする場合は、通常、システム言語をカスタマイズできます。ただし、ク...
Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...
地球の円周率と半径、検索ポイントの経度と緯度から、検索ポイントと検索データテーブル間の距離はNキロメ...
最近、仕事中に問題が発生しました。Docker コンテナがホストの redis にアクセスできず、t...
Dockerコンテナのインストール時に遭遇しやすい2つの問題1.ポートはすでに割り当てられています(...
1. nginxをダウンロードする [root@localhost my.Shells]# dock...