MySQL サーバに接続するとき、通常はパスワードを使用します。パスワードはテキスト形式で送信されるわけではありませんが、暗号化アルゴリズムはそれほど強力なものではありません。クライアントとサーバ間のトラフィックを盗聴できれば、クラッカーは少しの努力でパスワードを探り当てることができます。クライアントとサーバ間の接続が信頼されていないネットワークを通る場合には、SSH トンネルを使用して通信を暗号化してください。
その他の情報はすべてテキストとして転送されるので、その接続を見ることができる人はだれでもそれらの情報を読むことができます。これに不安を感じる場合は、圧縮プロトコル(MySQL
バージョン 3.22
以降)を使用してトラフィックの解読をより困難にすることができます。セキュリティをさらに高めるには、ssh
を使用してください。オープンソース
の ssh
クライアントは
http://www.openssh.org/
に、商用 ssh
クライアントは
http://www.ssh.com/
にあります。これを使用すると、MySQL サーバと
MySQL クライアント間で暗号化 TCP/IP
接続を利用できます。
MySQL 4.0 を使用している場合、内部 OpenSSL サポートも利用できます。 See 項4.4.10. 「安全な接続の使用」。
MySQL システムのセキュリティを確保するためには、以下の事項を強く推奨します。
すべての MySQL
ユーザにパスワードを使用する。other_user
にパスワードが設定されていなければ、だれでも
mysql -u other_user db_name
として簡単に他人になりすましてログインできる。クライアント/サーバ型のアプリケーションでは、クライアント側で任意のユーザ名を指定できるのが一般的。mysql_install_db
スクリプトを実行前に編集することにより、すべてのユーザのパスワードを変更できる。また、MySQL
root
ユーザのパスワードのみ変更するには、以下のように行う。
shell>mysql -u root mysql
mysql>UPDATE user SET Password=PASSWORD('new_password')
->WHERE user='root';
mysql>FLUSH PRIVILEGES;
MySQL デーモンを Unix root
アカウントで実行しないこと。このことは、FILE
権限のあるユーザであればだれでも
root
(たとえば
~root/.bashrc
)としてファイルを作成できてしまうので、非常に危険である。これを防ぐため、--user=root
オプションを使用して直接指定された場合を除き、mysqld
は root
として実行することを拒否するようになっている。
mysqld
は、普通の権限なしユーザとして実行できる。
新しい Unix アカウント mysql
を作成してさらにセキュリティを高めることもできる。別の
Unix アカウントで mysqld
を実行する場合、user
テーブル内の root
ユーザ名を変更する必要はない。MySQL
ユーザ名と Unix
アカウント名はお互い関係ない。別の Unix
アカウントで mysqld
を開始するには、サーバのデータディレクトリにある
my.cnf
または
/etc/my.cnf
のオプション設定ファイルの
[mysqld]
グループに、アカウント名を指定する
user
行を追加する。次に例を示す。
[mysqld] user=mysql
これで、サーバを手動で起動した場合も、mysqld_safe
または mysql.server
を使用して起動した場合でも、指定のアカウントでサーバが起動する。
詳細については、項A.3.2. 「一般ユーザで MySQL を実行する方法」
を参照のこと。
テーブルへのシンボリックリンクをサポートしない(これは
--skip-symlink
オプションで無効にできる)。このことは、root
で mysqld
を実行する場合、mysqld
データディレクトリへの書き込み権限があるすべてのユーザが、システムのすべてのファイルを削除できることになるので、特に重要である。
See 項5.6.1.2. 「Unix 上のテーブルに対するシンボリックリンクの使用」。
mysqld
を実行する Unix
アカウントだけに、データベースディレクトリの読み取り権限と書き込み権限があることを確認する。
PROCESS
権限をすべてのユーザには与えない。mysqladmin
processlist
の出力には、現在実行中のクエリのテキストが表示される。そのため、このコマンドを実行できるユーザは、UPDATE
user SET password=PASSWORD('not_secure')
クエリを実行する他のユーザを特定できる可能性がある。
mysqld
は、PROCESS
権限を持つユーザ用に特別接続枠を予約しているので、すべての通常接続が使用中の場合でも、MySQL
root
ユーザはログインしてサーバの状態をチェックできる。
FILE
権限をすべてのユーザには与えない。この権限を持つユーザは、mysqld
デーモンの権限でファイルシステムのどの場所にでもファイルを書き込める。安全対策として、SELECT
... INTO OUTFILE
で生成されるファイルについてはだれでも書き込み可能だが、既存のファイルには書き込めないようになっている。
FILE
権限は、サーバを実行している Unix
ユーザがアクセスできるすべての読み取り可能ファイルを読む場合にも使用される。また、ユーザが何らかの権限を持っているカレントデータベースに任意のファイルを読み込むことができる。
これは、不正使用される可能性がある。たとえば、LOAD
DATA
を使用して
/etc/passwd
をテーブルにロードし、SELECT
で読むことができる。
DNS を信頼しない場合、権限テーブルで、ホスト名ではなく IP アドレスを使用すること。いずれにしても、ワイルドカードを含むホスト名を使用して権限テーブルを作成する際には特に注意が必要である。
単一ユーザの接続数を制限する場合は、mysqld
で max_user_connections
変数を設定する。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.