PHPからRDSのMySQLに対してSSL接続する
こんにちは。望月です。 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行目の$optionsでPDO::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で接続する必要があるかと思いますが、その際には参考にしてみてください。