MySql:読み取り専用オプションを付与しますか?


97

データベーススキーマに対するすべてのREAD権限を付与したいユーザーがいます。

1つの方法はこれです。

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

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


特権はSHOW VIEWではSHOW_VIEWなくですがSHOW CREATE VIEW、ビューでのアクセスを許可しない限り、これをユーザーに付与する必要はありませんSELECT。特権のみを持つビューから選択できます。「すべての読み取り操作をグループ化して許可する」とはどういう意味ですか?
マイケル-sqlbot 2013年

データベースに対するALL READ操作を表す単一の特権がある場合。それらがきめの細かいアクセスを提供していることを理解していますが、便利な高レベルの抽象化が私たちを助けたでしょう。
Ajeet Ganga 2013

回答:


161

データベースに対するALL READ操作を表す単一の特権がある場合。

「すべての読み取り」をどのように定義するかによって異なります。

テーブルとビューからの「読み取り」がSELECT特権です。それがあなたが「すべて読んだ」という意味であれば、そうです:

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

しかし、それはあなたがすべてを「見る」ことができる、「見ることはできるが触ることはできない」ということを意味しているように思えます。だから、ここに思い浮かぶ他の種類の読書があります:

ビューの定義を「読み取る」ことがSHOW VIEW特権です。

他のユーザーが現在実行しているクエリのリストを「読み取る」ことがPROCESS特権です。

現在のレプリケーション状態を「読み取る」ことがREPLICATION CLIENT特権です。

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

それが目的の読みである場合は、それらのいずれか(または使用可能な他の特権)を1つの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動的SQLを使用してステートメントを作成するか、許可テーブル自体を直接操作します。

データベース管理者にこの最近の質問、他のユーザーを変更することができ、ユーザーはかなりの定義によって、あるではない- 、ポスターはもちろん、正常に行うことができるものではありません、他のユーザーを変更する権限を持たないユーザーのための能力を、望んでいました非特権ユーザー-ただし-ストアドプロシージャは、DEFINERユーザーのセキュリティコンテキストでEXECUTE実行され、プロシージャの特権を持つユーザーがエスカレートされた特権を一時的に引き受けて、特定のことを実行できるようにするので、その場合に優れたソリューションを提供しました手順が完了します。


1
ありがとう。素晴らしい答えは別として、私はあなたのパスワードも気に入りました。:)
Ajeet Ganga 2015

2
注目に値する:PROCESSおよびREPLICATION CLIENTは「グローバル」権限タイプであるため、「データベースごと」の除外で定義すると構文は失敗します。mydb。*のGRANT PROCESS ONは無効ですが、GRANT PROCESS ON *。*はOKです。
Bee Kay

GRANT OPTIONを指定してdb_name。*のSELECTを 'demo' @ '%'に付与します。
ムーサ

16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

これにより、SELECTビューを含むすべてのデータベースに対する権限を持つユーザーが作成されます。


9

ユーザーに付与できるさまざまな権限は

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

特定のユーザーに権限を付与するには、次のフレームワークを使用できます。

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

私が見つかりました。この記事は非常に役立ちます


3

ここで見つけた段階的なガイド。

MySQLの読み取り専用データベースユーザーアカウントを作成するには

UNIXプロンプトで、MySQLコマンドラインプログラムを実行し、次のコマンドを入力して管理者としてログインします。

mysql -u root -p

rootアカウントのパスワードを入力します。mysqlプロンプトで、次のいずれかの手順を実行します。

ユーザーが任意のホストからデータベースにアクセスできるようにするには、次のコマンドを入力します。

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

コレクターをデータベースと同じホストにインストールする場合は、次のコマンドを入力します。

grant select on database_name.* to 'read-only_user_name' identified by 'password';

このコマンドは、ローカルホストからのみデータベースへの読み取り専用アクセスをユーザーに与えます。コレクターがインストールされるホストのホスト名またはIPアドレスがわかっている場合は、次のコマンドを入力します。

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

ホスト名は、DNSまたはローカルホストファイルによって解決できる必要があります。mysqlプロンプトで、次のコマンドを入力します。

flush privileges;

と入力しquitます。

次に、コマンドと確認メッセージの例を示します。

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

ユーザーでも答えがあり、@ Michael-sqlbotは投稿のほとんどのポイントを非常にうまくカバーしていますが、1つのポイントが欠けているので、カバーしようとしています。

単純なユーザー(管理者ではない)に読み取り権限を付与する場合-

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

注:ここではEXECUTEが必要です。これにより、レポートを作成する(選択ステートメントがほとんどない)ストアドプロシージャがある場合に、ユーザーがデータを読み取ることができます。

localhostを、ユーザーがDBに接続する特定のIPに置き換えます。

追加の読み取り権限は、

  • SHOW VIEW:ビュースキーマを表示したい場合。
  • REPLICATION CLIENT:ユーザーがレプリケーション/スレーブのステータスを確認する必要がある場合。ただし、すべてのDBに許可を与える必要があります。
  • PROCESS:ユーザーが実行中のプロセスを確認する必要がある場合。すべてのDBでのみ機能します。


0

MySQL 8の場合は異なります。

次の2つの手順で行う必要があります。

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.