なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

MySQLの「ALL権限」のレベル

なにがどう違うの!

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」を手打ちで実行することって、あんまり無いですけどね。

まとめ

データベース単位で制御できるものは、データベースレベル「%.*」でも同じ効果が期待できるけど、
データベース単位ではない制御に関係するものは、グローバルレベル「*.*」で付与しないとやりたいことができないこともあるよ!


権限はしっかり確認して設定しよう!


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版