1. ホーム
  2. mysql

[解決済み] MySql : 読み取り専用オプションの付与?

2022-08-09 18:18:23

質問

ある DB スキーマのすべての READ 権限を付与したいユーザがいます。

一つの方法はこれです。

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

すべての読み取り操作をグラントでグループ化する方法はありますか?

どのように解決するのですか?

データベースに対するすべてのREAD操作に対応する単一権限がある場合。

すべての読み取りをどのように定義するかによります。

"テーブルやビューからの読み込み"は SELECT の特権です。もし、それが "すべての読み取り" という意味であれば、そうです。

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

しかし、あなたが言っているのは、すべてのものを「見る」能力、つまり「見るが触れない」能力のようですが、では、他にどんな読み方があるのか、考えてみましょう。

"読む" ビューの定義が SHOW VIEW の特権です。

"他のユーザが現在実行しているクエリのリストを読む" は PROCESS の特権です。

"Reading"は、現在のレプリケーションの状態が REPLICATION CLIENT の特権です。

これらのいずれか、またはすべてが、問題のユーザーの性質によっては、意図した以上の情報を公開する可能性があることに注意してください。

もしあなたがそうしたいのであれば、これらのうちのどれか(あるいは他の 利用可能な特権 ) を一つの GRANT ステートメントを使用します。

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

しかし、あなたが求めているような、他の特権のサブセットを付与する単一の特権は存在しません。

もしあなたが手作業で物事を行い、あるクラスのユーザーに対して通常行う正確な権限を覚えておく必要がなく、より簡単な方法を探しているなら、同等のユーザーの権限を再生成する文を調べ、同様の権限を持つ新しいユーザーを作成するように変更することができます。

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

not_leet' と 'localhost' を追加したい新しいユーザーに合わせて変更し、パスワードも変更すると、再利用可能な GRANT ステートメントを使用して新しいユーザーを作成することができます。

もしあなたが、限られた権限のセットを設定し、ユーザーに付与し、そしておそらく未使用の権限を削除するための単一の操作を望むなら、それはあなたがやりたいことすべてをカプセル化したストアドプロシージャを作成することによって行うことができます。 プロシージャの本文の中に GRANT ステートメントを構築し、直接グラントテーブルを操作します。

このデータベース管理者の最近の質問 において、投稿者は非特権ユーザーが他のユーザーを変更する能力を欲していました。もちろん、これは通常できることではありません -- 他のユーザーを変更できるユーザーは、定義上、非特権ユーザーではありません -- しかしながら、ストアドプロシージャはこの場合、良い解決策になります。 DEFINER ユーザーのセキュリティコンテキストで実行されるため、誰でも EXECUTE を持つユーザは、一時的に昇格した権限を持つことになり、 そのプロシージャが達成する特定のことを行うことができるようになります。