インターネットに接続されたコンピュータで MySQL を使用するユーザはすべて、このセクションを読んで、頻発しているセキュリティ侵害を回避するようにしてください。
盗聴傍受、改ざん、再生、サービス妨害など、あらゆるタイプの攻撃に対して、MySQL サーバだけでなく、サーバホスト全体を、最大限の努力をもって保護することが必要です。ここでは、可用性および耐障害性のすべてについてはカバーしていません。
MySQL では、すべての接続、クエリなど、ユーザが実行する可能性のある操作に対して、そのセキュリティを、アクセス制御リスト(ACL)をベースにして保護しています。MySQL クライアントとサーバ間の SSL 暗号化接続もサポートしています。ここで説明する概念の多くは、MySQL 固有ではありません。ほとんどすべてのアプリケーションに当てはまります。
MySQL を実行する際には、可能な限り以下のガイドラインに従ってください。
mysql root
ユーザ以外のだれにも mysql
データベースの user
テーブルへのアクセス権を与えないこと。これは非常に重要である。
MySQL
では、暗号化されたパスワードが実際のパスワードである。
user
テーブル内のリストに含まれているパスワードを知り得、そのアカウントのリストに含まれているホストに対するアクセス権を持つ者はだれでも、簡単にそのユーザとしてログインできる。
MySQL
アクセス権限システムを理解すること。MySQL
へのアクセスを制御するには
GRANT
コマンドと
REVOKE
コマンドを使用する。必要以上の権限をユーザに設定しないこと。すべてのホストに対する権限は決して与えないこと。
チェックリスト
mysql -u root
を試す。パスワードなしでサーバに正常に接続できるようだと問題がある。この場合、すべての権限を持つ
root
ユーザとして、MySQL
サーバに接続できるということである。
特に root
パスワードの設定に関する項目に注意して、MySQL
インストール手順を見直すこと。
SHOW GRANTS
コマンドを使用して、だれが何にアクセスできるかをチェックする。REVOKE
コマンドを使用して不要な権限を削除する。
データベースには、テキスト形式のパスワードを保存しないこと。コンピュータがクラックされたとき、パスワードの完全なリストが奪われて不正使用される結果になる。MD5()
、SHA1()
、または別の一方向ハッシング関数を使用する。
辞書を使用してパスワードを選択しない。特殊プログラムで解読されてしまう。``xfish98'' のようなパスワードも良くない。標準 QWERTY キーボードで ``fish'' を 1 列左でタイプした ``duag98'' などを推奨。また、``Mary had a little lamb'' の頭文字を取って ``Mhall'' とするのも良い。 この方法だと覚えやすく、また部外者が類推することも困難。
ファイアウォールに投資する。これにより、少なくとも 50% の攻撃を防ぐことができる。MySQL をファイアウォール内つまり非武装地帯に配置する。
チェックリスト
nmap
などのツールを使用して、インターネットから自分のポートをスキャンしてみる。MySQL
はデフォルトでポート 3306
を使用する。このポートは、信頼されていないホストからアクセスできてはいけない。他にも、MySQL
ポートが開いているかどうか確かめる簡単な方法として、リモートコンピュータから以下のコマンドを実行するという方法がある。ここで、server_host
は MySQL サーバのホスト名である。
shell> telnet server_host 3306
接続できて意味不明な文字が返ればポートが開いている。開いておく正当な理由がない限り、ファイアウォールまたはルータで閉じておく。telnet
がハングするか、接続が拒否されれば正常である。つまり、ポートは閉じている。
ユーザが入力するデータを信頼しないこと。Web
フォーム、URL、その他のアプリケーションから特殊文字またはエスケープ文字シーケンスが入力され、不正操作が行われる可能性がある。ユーザが
``; DROP DATABASE mysql;
''
などのような入力をしても、アプリケーションが安全に保たれるようにしなければならない。これは極端な例であるが予防策を講じておかないと、クラッカーによる同様の手段によって、重大なセキュリティリークやデータの紛失が発生する可能性がある。
また、数値データもチェックすること。文字列だけを保護するのは、よくあるミスである。公開されているデータのみのデータベースは保護する必要がないという考えもよくある考えだが、これも間違っている。そのようなデータベースにも、サービス妨害タイプの攻撃が可能である。このタイプの攻撃を防ぐ最もシンプルな方法は、数値定数をアポストロフィで囲むこと。SELECT
* FROM table WHERE ID=234
ではなく、SELECT * FROM table WHERE
ID='234'
のようにする。 MySQL
は自動的のこの文字列を数値に変換し、非数値記号を削除する。
チェックリスト
すべての Web アプリケーション
すべての Web フォームで
‘'
’ および
‘"
’
を入力してみる。何らかの MySQL
エラーが発生した場合は、すぐにその問題を調べる。
URL で
%22
(‘"
’)、%23
(‘#
’)、および
%27
(‘'
’)を追加して動的
URL の修正を試みる。
前の例の文字を含む動的 URL のデータ型を数値型から文字型に変更する。このような攻撃があってもアプリケーションが影響されないようにする。
数値フィールドに数値ではなく、文字、スペース、および特殊記号を入力してみる。MySQL に渡すことなくアプリケーションがそれらの値を削除するか、エラーを生成することが必要である。値がチェックされずに MySQL に渡ると非常に危険である。
MySQL に渡す前にデータサイズをチェックする。
管理目的で使用するユーザ名とは別のユーザ名で、アプリケーションをデータベースに接続させる。アプリケーションに、必要以上のアクセス権を設定しない。
PHP のユーザ
addslashes()
関数をチェックする。 PHP 4.0.3
より、mysql_escape_string()
関数が利用可能になっている。これは、MySQL
C API
の同じ名前の関数をベースにしている。
MySQL C API のユーザ
mysql_real_escape_string()
API
呼び出しをチェックする。
MySQL++ のユーザ
クエリストリームの
escape
および
quote
の修飾子をチェックする。
Perl DBI のユーザ
quote()
メソッドをチェックするか、プレースホルダを使用する。
Java JDBC のユーザ
PreparedStatement
オブジェクトおよびプレースホルダを使用する。
インターネット上で暗号化されていないデータを送信しないこと。これらのデータは、悪意のある第三者によって盗聴され、悪用される可能性がある。SSL や SSH などの暗号化プロトコルを使用する。MySQL では、バージョン 4.0.0 より内部 SSL 接続をサポートしている。 SSH ポート転送を使用して、暗号化(および圧縮)された通信トンネルを作成できる。
tcpdump
ユーティリティおよび
strings
ユーティリティの使用法を理解すること。ほとんどの場合、以下のようなコマンドで、MySQL
データストリームが暗号化されているかどうかをチェックできる。
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
これは、Linux システムで有効。他のシステムでも、少し修正するだけで使用できる。 警告: データを見ることができなくても、必ずしも実際に暗号化されているとは限らない。高度なセキュリティが必要な場合は、専門家に相談すること。
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.