インターネットに接続したコンピュータ上で MySQL を使用するすべてのユーザーは、セキュリティーに関するもっとも一般的な間違いを回避するために、このセクションを読むようにしてください。
セキュリティーについて検討する際、該当するすべての種類の攻撃 (盗聴、改変、プレイバック、およびサービス妨害) から、(MySQL サーバーだけでなく) サーバーホスト全体を完全に保護することを考慮する必要があります。ここでは可用性およびフォールトトレランスのすべての側面について扱うことはしません。
MySQL では、ユーザーが実行を試行できるすべての接続、クエリー、およびその他の操作に対して、アクセス制御リスト (ACL) に基づくセキュリティーが使用されています。また、MySQL クライアントとサーバーの間で SSL に対応した接続のサポートもあります。ここで説明されている多くの概念は MySQL に固有のものではなく、同じような一般的な考え方は、ほぼすべてのアプリケーションに該当します。
MySQL を実行するときは、次のガイドラインに従ってください。
mysql
データベース内のuser
テーブルに対するアクセス権限を (MySQLroot
アカウント以外の) すべてのユーザーに絶対に付与しないでください。これはきわめて重要です。-
MySQL アクセス権限システムのしくみについて学習してください (セクション6.2「MySQL アクセス権限システム」を参照してください)。MySQL へのアクセスを制御するには、
GRANT
およびREVOKE
ステートメントを使用します。必要以上の権限を付与しないでください。すべてのホストに権限を付与してはいけません。チェックリスト:
mysql -u root
を試してください。パスワードを尋ねられずにサーバーへの接続に成功する場合、すべてのユーザーが、完全な権限を持つ MySQLroot
ユーザーとして MySQL サーバーに接続できます。root
パスワードの設定に関する情報に特に注意して、MySQL インストール手順を見直してください。セクション2.10.2「最初の MySQL アカウントのセキュリティー設定」を参照してください。SHOW GRANTS
ステートメントを使用して、どのアカウントが何にアクセスできるかをチェックします。REVOKE
ステートメントを使用して、不要な権限を削除します。
-
平文パスワードをデータベースに保管しないでください。コンピュータのセキュリティーが損なわれた場合、侵入者はすべてのパスワードのリストを取得して使用することができます。代わりに、
SHA2()
、SHA1()
、MD5()
、またはその他の一方向のハッシュ機能を使用して、ハッシュ値を保管してください。レインボーテーブルを使用したパスワードのリカバリを避けるために、これらの関数をプレーンテキストパスワードに使用しないようにしてください。代わりに、ソルトとして使用する何らかの文字列を選択して、hash(hash(パスワード)+ソルト) 値を使用してください。
辞書からパスワードを選択しないでください。パスワードを解読する特殊なプログラムが存在します。「xfish98」 のようなパスワードでさえも、非常に悪いものです。同じ 「fish」 という単語を、標準 QWERTY キーボードでキー 1 個分左にずらしてタイプした 「duag98」 の方が、ずっと優れています。別の方法は、文の各単語の先頭文字を取ったパスワードを使用することです (たとえば、「Four score and seven years ago」 からは 「Fsasya」 というパスワードができます)。パスワードは覚えやすく入力も簡単ですが、文を知らない人は推測が困難です。この事例で、数字を示す単語をさらに数値に置き換えて 「4 score and 7 years ago」 という句を作成し、「4sa7ya」 というさらに推測困難なパスワードを得ることができます。
-
ファイアウォールに投資します。これにより、あらゆる種類のソフトウェアの悪用のうち、少なくとも 50% から保護されます。MySQL をファイアウォールの背後または非武装地帯 (DMZ) に配置します。
チェックリスト:
-
nmap
などのツールを使用して、インターネットから自分のポートをスキャンしてみてください。MySQL はデフォルトでポート 3306 を使用します。このポートは信頼できないホストからアクセス可能であってはいけません。MySQL ポートが開いているかどうかを検査する簡単な方法として、いずれかのリモートマシンから次のコマンドを試行します。ここで、server_host
は MySQL サーバーが実行しているホストのホスト名または IP アドレスです。shell> telnet server_host 3306
telnet がハングするか、接続が拒否されれば、ポートはブロックされており、これは期待どおりの結果です。接続を取得して、何らかの文字化けした文字が得られた場合、ポートは開いているため、ポートを開いたままにしておく十分な理由が実際にある場合を除き、ファイアウォールまたはルーターで閉じるようにしてください。
-
MySQL にアクセスするアプリケーションは、ユーザーから入力されるすべてのデータを信頼しないようにし、適切な防御的プログラミング技術を使用して記述するようにします。セクション6.1.7「クライアントプログラミングのセキュリティーガイドライン」を参照してください。
プレーンの (暗号化されていない) データをインターネット経由で送信しないでください。この情報は、情報を傍受する時間と能力を持ち、自身の目的のために情報を使用するすべての人物からアクセスできます。代わりに、SSL や SSH などの暗号化されたプロトコルを使用してください。MySQL は、内部 SSL 接続をサポートします。別の技術として、SSH ポートフォワーディングを使用して、暗号化された (および圧縮された) 通信用トンネルを作成する方法があります。
-
tcpdump や strings などのユーティリティーの使用法について学習します。ほとんどの場合、次のようなコマンドを発行することによって、MySQL データストリームが暗号化されていない状態であるかどうかを検査できます。
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
これは Linux で動作するほか、ほかのシステムでもわずかな変更を行うことで動作するはずです。
警告平文データが表示されない場合、これは情報が実際に暗号化されていることを必ずしも意味しているわけではありません。セキュリティーを強化する必要がある場合、セキュリティーの専門家に相談してください。