MySQL サーバとクライアント プログラムの間で SSL 接続を行うには、まずシステムが OpenSSL または yaSSL のいずれかに対応しているか、そして、使用中の MySQL バージョンが SSL に対応しているかどうかを確認してください。
MySQL は、セキュリティを確保した接続を簡単に行うために、yaSSL とのバンドルになっています。(MySQL と yaSSL は同一のライセンス モデルを採用、OpenSSL は Apache のライセンス。) yaSSL 対応のプラットフォームには限りがありましたが、現在では、MySQL AB サポートのプラットフォームすべてで利用できます。
MySQL と SSL を扱うときの接続安全を確保するには、次の手順に従います。
SSL 対応の MySQL のバイナリ配布を使用していない環境で、バンドルの yaSSL ライブラリではなくて、OpenSSL を使用するという場合は、まず OpenSSL をインストールする。(MySQL では OpenSSL 0.9.6 でテスト済。) OpenSSL は、http://www.openssl.org からインストールする。
SSL 対応の MySQL のバイナリ配布を使用していない場合、MySQL のソース配布で SSL を使用できるように設定する。MySQL を設定するときは、configure スクリプトを次のように呼び出す。
shell> ./configure --with-ssl
ここでは、バンドルの yaSSL
ライブラリを使用できるようにソース配布を設定している。OpenSSL
を使用する場合には、OpenSSL ヘッダ
ファイルとライブラリがあるデイレクトリのパスで
--with-ssl
オプションを指定する。
shell> ./configure --with-ssl=path
MySQL 5.1.11 より前のバージョンを使用している場合は、適切なオプションを使用して、使用する SSL ライブラリを選択する。
yaSSL:
shell> ./configure --with-yassl
OpenSSL:
shell> ./configure --with-openssl
ノート: Unix 対応の yaSSL
では、真の乱数を読み出すために、/dev/urandom
または /dev/random
のどちらかを用意する。Solaris 2.8 や HP-UX
より前のバージョンンでの yaSSL
に関する追加情報などは、Bug#13164
を参照のこと。
権限テーブルのアップグレードに、mysql.user
テーブルの SSL
関連カラムを権限テーブルに含めていることを確認する。MySQL
4.0
より古いバージョンの権限テーブルでは、この作業が必要です。アップグレード手順は
項4.5.4. 「mysql_upgrade — MySQL アップグレードのテーブル チェック」 を参照のこと。
SSL 対応でサーバ
バイナリをコンパイルしていることを確認するには、--ssl
オプションで呼び出す。サーバが SSL
非対応の場合は、エラーが出る。
shell> mysqld --ssl --help
060525 14:18:52 [ERROR] mysqld: unknown option '--ssl'
mysqld サーバが SSL
対応していることを確認するには、have_openssl
システム変数を調べる。
mysql> SHOW VARIABLES LIKE 'have_openssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
+---------------+-------+
SSL 接続対応であれば、値は
YES
。値が
DISABLED
である場合は、--ssl-
オプションで起動すると SSL
対応になるということ
(このセクションの後述を参照のこと)。SSL
接続対応であれば、値は
xxx
YES
。
SSL 接続を有効にするには、適切な SSL 関連コマンド オプションを使用します。(項4.8.7.3. 「SSL コマンド オプション」 を参照のこと。)
MySQL サーバを起動して、クライアントが SSL 経由で接続できるようにするには、キーを識別するオプションとサーバの接続確立に必要な証明ファイルを使用します。
shell>mysqld --ssl-ca=
cacert.pem
\--ssl-cert=
server-cert.pem
\--ssl-key=
server-key.pem
ssl-ca
で CA 証明書
を認識する。
ssl-cert
で、サーバのパブリック
キーを認識する。これをクライアントに送信すると、そこにある
CA 証明書を認証する。
ssl-key
がサーバ プライベート
キーを認識する。
SSL 対応の MySQL
サーバとの接続安全を確立するには、クライアント指定のオプションが、クライアントで使用するユーザ
アカウントの SSL
条件に依存します。項12.5.1.3. 「GRANT
構文」 で
REQUIRE
節に関する記述を参照してください。
アカウントに特別の SSL
条件がない場合、または REQUIRE
SSL
オプションを含む
GRANT
ステートメントでアカウントを作成している場合は、--ssl-ca
オプションで、クライアント接続が安全に行えます。
shell> mysql --ssl-ca=cacert.pem
クライアント証明書の指定も必要な場合は、アカウントを
REQUIRE X509
オプションを使用して作成します。そのとき、そのクライアントでも適切なクライアント
キーと証明ファイルを指定する必要があります。これをしないと、サーバが接続を拒否します。
shell>mysql --ssl-ca=
cacert.pem
\--ssl-cert=
client-cert.pem
\--ssl-key=
client-key.pem
これは、サーバに使用するものと同様のオプションであることを示します。ノート: CA 証明書が同じである必要があります。
クライアントで、サーバとの現在の接続で SSL
を使用しているかどうかを決定します。ここでは、Ssl_cipher
ステータス変数の値をチェックします。SSL
を使用していない場合、Ssl_cipher
の値は空白です。SSL
を使用してる場合、値は空白ではありません。例示のようになります。
mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value |
+---------------+--------------------+
| Ssl_cipher | DHE-RSA-AES256-SHA |
+---------------+--------------------+
mysql
クライアントでは、STATUS
または
★\s
★
コマンドを使用して、SSL
のラインをチェックします。
mysql> \s
...
SSL: Not in use
...
または
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
クライアント
プログラム内で接続安全を確立するには、mysql_ssl_set()
C API
関数を使用して、mysql_real_connect()
関数を呼び出す前に、適切な証明オプションをセットします。(項23.2.3.67. 「mysql_ssl_set()
」
を参照のこと。)
接続を確立したら、mysql_get_ssl_cipher()
を使用して、SSL
が使える状態になっているかどうかを確認します。戻値が
NULL
ではない場合は、接続が安全であることを示し、SSL
暗号鍵を指します。戻値が NULL
である場合は、SSL
が使用できていないことを示します。項23.2.3.33. 「mysql_get_ssl_cipher()
」
を参照してください。