# MySQLの権限周りの話はややこしい1
Category: "MySQL, Oracle, データベース" , Tags: grant, MySQL, ユーザ, ユーザID, 権限
しゃちょーどす。
いやーMySQLのこと書くのとか面倒くさくなってきたな。なんちって。
今回はユーザの権限周りの話。
その4:MySQLの権限周りの話はややこしい1
これはいつもいつも結構引っかかってる人多いですな。
特にOracle経験者の方。
MySQLの権限のコントロールは下記のような感じ(厳密にはそういうサイトにどうぞ)で行われる
・接続時にユーザID(ユーザ+ホスト)で接続する権限があるかをチェック
・接続後のすべてのリクエスト時にユーザID(ユーザ+ホスト)にリクエストを実行する権限があるかをチェック
これを分解して説明してみる。
・接続時にユーザID(ユーザ+ホスト)で接続する権限があるかをチェック
単純なことなんだが、MySQLが接続チェックに使用するキーは、ユーザではなくてユーザ+ホストであるということ。
権限を設定するのも当然ユーザ単位ではなくてユーザ+ホスト単位であるということ。
このユーザ+ホストの組み合わせをMySQLではユーザIDと言っている。
shachoユーザがアクセスするときの例としてはこんな感じ
shacho@'%' すべてのホストからアクセス可能
shacho@localhost ローカルホスト(サーバーそのもの)のみアクセス可能
shacho@'192.168.1.99' IPアドレス192.168.1.99のホストよりアクセス可能
shacho@'tracksys.jp' ドメイン名tracksys.jpからアクセス可能
上記4例はMySQLが接続チェックする際にはすべて別のユーザIDとして扱われる。
例えば下記のGrant文を実行した際には、shachoユーザはlocalhostからのみすべてのDBにすべての権限でアクセスできる。
GRANT ALL ON *.* TO shacho@localhost IDENTIFIED BY 'password'
分解すると
ALL: すべての権限を付与
ON *.*: すべてのDBのすべてのオブジェクトへのアクセスを許可
TO shacho@localhost:shachoユーザに付与。ただしlocalhostからのアクセスに限る
となる。
localhostだけではなくて同じサブネットのホストからもアクセスできるように設定する
GRANT SELECT ON *.* TO shacho@'192.168.1.%' IDENTIFIED BY 'password'
権限をSELECTのみに設定したため、shachoユーザがlocalhost以外の同一サブネットから接続した場合には検索しかできない。
このように、ユーザIDに対して異なる権限を設定できるのだが、ここでユーザIDとユーザ(shachoとかrootとか)を混同していると、きわめて深い沼に沈むことになる。
しかしここだけ押さえておけば権限の設定はカラム単位までとか設定できるけども、細かく作業していくだけなのでそんなに問題は無いかと。
これについては次回、接続後の権限チェックの説明でもうちょっとだらだら説明する。
個人的にはもう面倒くさいのでExcelか何かでユーザ設定表を作っておいて、マクロでわーっとGrant文作成するのがおすすめ。
でも、権限周りの仕組みを理解してからね。


