PHPからRDSのMySQLに対してSSL接続する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。 RDSのMySQLにはSSLを使って接続することができます。今日はPHPから接続するところまで試したので、その設定手順をまとめます。

MySQLにSSL接続を行うことで、暗号化の処理の分パフォーマンスが悪化することが想定されます。
それなりの負荷のあるプロダクション環境で利用する際は、期待したパフォーマンスが得られるかどうかの検証を行った方がよいと思います。

RDSおよびMySQLの設定

RDSについては、何も設定を変更する必要はありません。通常通りRDSのMySQLインスタンスを立ち上げてください。
SSL接続のみ受け付けるユーザを作成する場合は、以下のコマンドを実行して、SSL接続のみを許可するユーザを作成して下さい。

GRANT USAGE ON *.* TO 'encrypted_user'@'%' REQUIRE SSL

CA証明書の取得

SSL接続を行うために、AWSからCA証明書を取得する必要があります。下記ページから取得して下さい。

https://rds.amazonaws.com/doc/mysql-ssl-ca-cert.pem

PHPプログラム

PDOを利用してPHPから接続をしてみます。SSLでの接続に成功しているかどうかを判定してみましょう。

<?php

$dbhost = 'sampledb.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com';
$dbname = 'sampledb';
$dsn = 'mysql:host='.$dbhost.';dbname='.$dbname;
$user = 'username';
$pass = 'password';
$options = array(
	PDO::MYSQL_ATTR_SSL_CA => '/home/ec2-user/mysql-ssl-ca-cert.pem' // CA証明書の指定
);

$client = new PDO($dsn,$user,$pass,$options);

$sql = "show status like 'ssl_cipher'";
$result = $client->query($sql);

foreach($result as $row) {
	echo ($row["Value"]);  
}

ポイントは、8行目から10行目の$optionsPDO::MYSQL_ATTR_SSL_CAの値をPDOオブジェクトのコンストラクタに渡しています。この値を設定することでPHPからSSL接続を行うことになります。

このPHPをコンソールから実行します。SSLでの接続に成功しているとAES256-SHAと表示されます。

[ec2-user@ip-10-0-0-181 ~]$ php sample.php
AES256-SHA

まとめ

RDSでは特に設定変更を行うことなく、SSLでの接続が可能になります。要件によってはDBにSSLで接続する必要があるかと思いますが、その際には参考にしてみてください。