なにがどう違うの!
GRANT ALL PRIVILEGES ON *.* TO 'ユーザ'@'%'; GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
前者は「グローバル権限」、後者は「データベース権限、ただし、全データベース」。
権限のスコープレベルをデータベースレベルに落としているのに、「%」つまり全データベースに対して許しているので、データベースレベルで可能な権限はすべて使える。「ほとんど」なんでもできちゃう?
だ・か・ら!何が違うの?
まずは
atsuizo.hatenadiary.jp
のおさらい。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.1.4 GRANT 構文
に一覧がありますが、権限によってグローバルレベルで付与できるもの、データベースレベルで付与できるが違います。
これをもう少し噛み砕くと、以下のような表になります。
権限 | GLOBAL | DB |
---|---|---|
ALL[PRIVILEGES] | ◯ | ◯ |
ALTER | ◯ | ◯ |
ALTER ROUTINE | ◯ | ◯ |
CREATE | ◯ | ◯ |
CREATE ROUTINE | ◯ | ◯ |
CREATE TABLESPACE | ◯ | - |
CREATE TEMPORARY TABLES | ◯ | ◯ |
CREATE USER | ◯ | 1 |
CREATE VIEW | ◯ | ◯ |
DELETE | ◯ | ◯ |
DROP | ◯ | ◯ |
EVENT | ◯ | ◯ |
EXECUTE | ◯ | ◯ |
FILE | ◯ | - |
INDEX | ◯ | ◯ |
INSERT | ◯ | ◯ |
LOCK TABLES | ◯ | ◯ |
PROCESS | ◯ | 2 |
PROXY | ◯ | - |
REFERENCE | ◯ | ◯ |
RELOAD | ◯ | - |
REPLICATION CLIENT | ◯ | - |
REPLICATION SLAVE | ◯ | - |
SELECT | ◯ | ◯ |
SHOW DATABASES | ◯ | 3 |
SHOW VIEW | ◯ | ◯ |
SHUTDOWN | ◯ | 4 |
SUPER | ◯ | - |
TRIGGER | ◯ | ◯ |
UPDATE | ◯ | ◯ |
USAGE | ◯ | - |
GRANT OPTION | ◯ | ◯ |
公式ドキュメントから読み取るとこうなるのですが、MySQL Workbenchの「Users and Privileges」を見ると、
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
で付与したユーザーには、DB列で◯がついていない所にも権限が付与されているように見えます。
ほんとは全部について挙動確認して解説したいんだけど、今回は無理。
上記の表で番号の入っている箇所にフォーカスして違いを説明します。
1.CREATE USER
グローバルのCREATE USERを付与した時と同様、ユーザ作れます。作った直後の権限状態も「USAGE ON *.*」で全く同じ。
2.PROCESS
ここ重要!
SHOW FULL PROCESSLISTコマンドで、接続中のユーザ(ユーザ名、ホスト)、状態、実行中のクエリなどを取得できるわけですが、「グローバルで付与されていないと、他のユーザーの情報が見えない」という仕様になっています。
自分の情報だけ見えても役に立たないです。投げてるコマンドも「SHOW FULL PROCESSLIST」って表示されるだけですし。わかっとるわっ、っていう。
3.SHOW DATABASES
グローバルのSHOW DATABASEを付与した時と同様、SHOW DATABASEコマンドで一覧取得できます。
4.SHUTDOWN
「mysqladmin -u ユーザ -p shutdown」で、シャットダウンすることができるようになる権限ですが、これも、PROCESSと同様に、データベース単位の話ではなく、MySQLサーバー全体の話なので、「グローバル」での付与が必要なものです。
GRANT ALL PRIVILEGES ON `%`.* TO 'ユーザ'@'%';
な権限を付与されたユーザで実行するとPROCESSのように「コマンドは通るけど情報が少ない」ではなく、完全に「実行不可」です。
Linuxであればservice(init.d)で起動・停止することも多いですし、「mysqladmin shutdown」を手打ちで実行することって、あんまり無いですけどね。
まとめ
データベース単位で制御できるものは、データベースレベル「%.*」でも同じ効果が期待できるけど、
データベース単位ではない制御に関係するものは、グローバルレベル「*.*」で付与しないとやりたいことができないこともあるよ!
権限はしっかり確認して設定しよう!
- 作者: Baron Schwartz,Peter Zaitsev,Vadim Tkachenko,菊池研自,株式会社クイープ
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/11/25
- メディア: 大型本
- この商品を含むブログ (7件) を見る