データベースのセキュリティ設定は,標準のSQLステートメントを使用して行うものだ。そのため,どのデータベースでも同様に行えるのが建前だ。しかし,それぞれのデータベースごとにユーザーIDの取り扱いなどで異なる点があり,実施には大きく異なる。今回は,MySQL 5系も含めてセキュリティ設定に関して解説する。

ユーザーID

 MySQLのユーザーIDは,ユーザー名とホスト名の組み合わせとなっている。ユーザーID自身にどのホストからアクセス可能なのか明示しているので,わかりやすい面がある。「%」は,ワイルドカードとなっている。そのためホスト名に指定すれば,ホストを特定しないユーザーIDとなる。

 次の例では,同じユーザー名で4つの例を挙げている。

ユーザーIDの例


satou@'%'		すべてのホストからアクセス可能
satou@localhost		ローカルホスト(サーバーそのもの)のみアクセス可能
satou@'192.168.1.103'	IPアドレス192.168.1.103のホストよりアクセス可能
satou@'zend.co.jp'	ドメイン名zend.co.jpからアクセス可能

 4つ目の例では,ドメイン名を指定しているわけだが,外部からの接続を行うケースは少ないと思う。また,ドメイン名は,ネットワーク上の名前解決に依存するため,動作が安定しない可能性もある。

権限の対象

 MySQLは,権限を設定する対象(範囲)が4段階ある。各ユーザーIDの用途に応じて必要な範囲で設定することを薦める(図1)。


図1●権限の対象(範囲)
[画像のクリックで拡大表示]

設定可能な権限

 さて,各対象に対する設定可能な権限は,表1のようになっている。シェードがかかっている部分は,MySQL 5.0以降で追加された権限だ。

表1●設定可能な権限

権限 内容
ALL すべての権限を設定
ALTER ALTER TABLEの許可
ALTER ROUTINE ALTER ROUTINEの許可(ストアドプロシージャ)
CREATE CREATE TABLEの許可
CREATE VIEW CREATE VIEWの許可(ビュー)
CREATE TEMPORARY TABLES CREATE TEMPORARY TABLEを許可
CREATE ROUTINE CREATE ROUTINEの許可(ストアドプロシージャ)
CREATE USER CREATE USERの許可
DELETE DELETEの許可
DROP DROP TABLE の許可
EXECUTE ストアドプロシージャ実行の許可
FILE SELECT ... INTO OUTFILE および LOAD DATA INFILE の許可
INDEX CREATE INDEX および DROP INDEX の許可
INSERT INSERTの許可
LOCK TABLES SELECT 権限を持つテーブルで LOCK TABLES の許可
PROCESS SHOW FULL PROCESSLISTの許可
REFERENCES 将来のために予約
RELOAD FLUSHの許可
REPLICATION CLIENT スレーブおよびマスタのサーバーを知る権利を付与
REPLICATION SLAVE レプリケーションのスレーブに必要
SELECT SELECTの許可
SHOW DATABASES SHOW DATABASESの許可
SHOW VIEW SHOW CREATE VIEWの許可
SHUTDOWN mysqladmin shutdown の許可
SUPER コマンド CHANGE MASTER、KILL thread、mysqladmin debug、PURGE MASTER LOGS、および SET GLOBAL の許可
最大接続数に達していても接続を 1 つだけ許可
TRIGGER トリガーの作成と削除の許可
UPDATE UPDATEの許可
USAGE 接続権限のみを設定

実際のユーザー追加

 ユーザーIDを追加する場合,できるだけGRANTステートメントまたはMySQL Administratorを使用して追加することをお勧めする。

 MySQLでは,データベース「mysql」内のテーブル「user」「db」「columns_priv」をユーザーおよび権限を管理するために使用している。これらのテーブルに直接INSERTステートメントによって,レコードを追加する方法もある。しかし,INSERTステートメントとして問題なくてもユーザーIDの設定として問題がある場合に問題点を把握するまで時間がかかってしまう。そうであれば,最初からGRANTステートメントやMySQL Administratorを使用すべきだ。

リスト1●GRANTステートメントによるユーザー追加例

(1)ローカルホストからアクセスするユーザー名「satou」を作成しすべての権限を与える
mysql> GRANT ALL PRIVILEGES ON *.* TO satou@localhost IDENTIFIED BY 'password';
Query OK,0 rows affected (0.06 sec)

(2)(1)と同様だがすべてのホストからアクセスできる
mysql> GRANT ALL PRIVILEGES ON *.* TO satou@'%' IDENTIFIED BY 'password';
Query OK,0 rows affected (0.00 sec)

(3)ドメイン「zend.co.jp」からアクセスできるユーザー名「tanaka」を作成し各権限を与える
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON test.*
-> TO tanaka@'zend.co.jp'
-> IDENTIFIED BY 'password';
Query OK,0 rows affected (0.08 sec)

(4)IPアドレス「192.168.11.4」からアクセスできるユーザー名「suzuki」を作成し各権限を与える
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON test.*
-> TO suzuki@'192.168.11.4'
-> IDENTIFIED BY 'password';
Query OK,0 rows affected (0.00 sec)

(5)IPアドレス「192.168.11.4」からアクセスできるユーザー名「watanabe」を作成し各権限(一部列指定)を与える
mysql> GRANT SELECT(name),INSERT(Tel),UPDATE,DELETE,CREATE,DROP
-> ON test.table1
-> TO watanabe@'192.168.11.4'
-> IDENTIFIED BY 'password';
Query OK,0 rows affected (0.01 sec)

 5つ目の例は,列に対する権限の設定を行っている。このように細かい設定を行うケースは少ないと思うが,参考にしてほしい。

MySQL Administratorによるユーザー管理

 MySQL Administratorは,MySQLサーバーを管理するための様々な機能を持っている。勿論,ユーザーを管理(参照,作成,更新,削除)する機能も搭載している。

 例として,先のGRANTステートメントによるユーザー追加後にMySQL Administratorで確認すると写真1のようになる。異なるホストが登録された場合には,ツリー表示となる。


写真1●MySQL Administratorのユーザー管理機能
[画像のクリックで拡大表示]

 MySQL Administratorでは,データベースに対する権限の設定が可能である。GUIによる設定なので,容易にデータベースを設定できる(写真2)。


写真2●MySQL Administratorのユーザー管理機能(データベースに対する権限)
[画像のクリックで拡大表示]

 ユーザーID「suzuki@192.168.11.4」は,データベース「test」に対して権限「SELECT」「INSERT」「UPDATE」「DELETE」「CREATE」「DROP」が設定されている。

 MySQLは,セキュリティ強化のための機能として暗号化通信機能を提供している。これに関しては,本コラムの第19回で紹介しているのでぜひ参照してほしい。

■著者紹介 佐藤栄一(さとうえいいち)
ゼンド・ジャパン株式会社 アーキテクト MySQL担当。PHPのコア技術者が設立したイスラエルZend Technologiesと提携関係にあり,Zend製品の販売,サポートおよびLAMPおよびLAPPによるシステム構築を推進しているMySQL ABのリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。