データベースのセキュリティ設定は,標準の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)と同様だがすべてのホストからアクセスできる
(3)ドメイン「zend.co.jp」からアクセスできるユーザー名「tanaka」を作成し各権限を与える
(4)IPアドレス「192.168.11.4」からアクセスできるユーザー名「suzuki」を作成し各権限を与える
(5)IPアドレス「192.168.11.4」からアクセスできるユーザー名「watanabe」を作成し各権限(一部列指定)を与える |
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のリセーラとしてライセンス,サポート,コンサルティングの提供を行っている。 |