👴

【RDS】ローカル環境からAmazon RDSインスタンスへSSL接続してみた

2022/01/30に公開

はじめに

開発者見習い1年目のkuraoと申します。
ある日突然RDSと繋がりたくなったため、自身のローカル環境からAmazon RDSインスタンスへ接続しようとしたことがありました。
前提条件が意外とあったり(当たり前)したため、忘れないようその接続方法について備忘録的に残しておこうと思います。
ちなみに、公式のリファレンス参考のみで全然上手くいきます。が、SSL化

何か誤った認識や記述をしている箇所などあれば、ご指摘頂けますと幸いです。


環境

  • Mac OS 10.15
  • MySQL 8.0.26

進め方

  1. SSL接続する理由について
  2. SSL証明書のダウンロード
  3. 自身のローカルPCからRDSインスタンスへ接続可能かのチェック
  4. 必須な設定項目についての確認
    • 各項目について、設定の仕方を説明します
  5. 設定完了後、接続コマンドの実行
  6. 非SSLでRDSインスタンスへ接続(おまけ)

1. SSL接続する理由

簡潔に言いますと、なりすまし攻撃からインスタンスを保護するためです。
(参考:SSL/TLS を使用した DB instance への接続の暗号化

2. SSL証明書のダウンロード

以下のリンクをクリックするとローカルへダウンロードされます。
こちらの証明書を使って、インスタンへ接続します。

https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

3. RDSインスタンスへ接続可能かのチェック

RDSインスタンスへ接続可能かどうかチェックします。

成功しているようであれば、そのまま「接続コマンドの実行」まで飛ばしてしまってください。

接続確認コマンドの実行

ローカルPCから以下のコマンドを叩いて確認できます。
RDSインスタンスのエンドポイント・ポート番号をどこで見るかについては、この下で示します。

nc -zv <RDSインスタンスのエンドポイント> <RDSポート番号>


# 接続可能な場合、以下のようなサクセスメッセージが表示されます。
Connection to <RDSインスタンスのエンドポイント> port <ポート番号> [tcp/mysql] succeeded!

# 接続不可能な場合、エラーが表示されるので設定が必要ということです。
Connection to <RDSインスタンスのエンドポイント> port <ポート番号> (tcp) failed: <エラーメッセージ>

エンドポイントとポート番号の確認

こちらの確認方法ですが、以下の2つの方法のどちらかで確認できます。(別の方法については試していないので、ここでは割愛します)

1. AWS CLIで確認する場合

以下のコマンドをそのままコピペして実行ですぐに確認できます。
エンドポイントをコピペする際、ダブルクォーテーションはいりません。

aws rds describe-db-instances \
  --filters "Name=engine,Values=mysql" \                  
  --query "*[].[DBInstanceIdentifier,Endpoint.Address,Endpoint.Port,MasterUsername]"


# 出力結果(例)
[
    [
        "mydb1",
        "mydb1.123456789012.us-east-1.rds.amazonaws.com",
        3306,
        "admin"
    ],
    [
        "mydb2",
        "mydb2.123456789012.us-east-1.rds.amazonaws.com",
        3306,
        "admin"
    ]
]

2. AWSマネージドコンソールで確認する場合

  1. AWSマネージドコンソールへログインし、Amazon RDS コンソール を開きます。
  2. サイドバーから、データベース を選択してDB インスタンスのリストを表示します。
  3. 確認したいRDSインスタンスの名前を選択して、その詳細を表示します。
  4. 接続とセキュリティタブを開くと、エンドポイントポートが表示されているはずですので、そちらを使用してください。

4. 必須な設定項目の確認

  • 4.1. ローカルPC
    • 4.1.1. MySQLコマンドラインクライアントが使用できる。
  • 4.2. RDS インスタンス
    • 4.2.1. RDSインスタンスのエンジンがMySQLであること。
    • 4.2.2. RDSインスタンスの設定が「パブリックにアクセス可能」であること。
    • 4.2.3. RDSインスタンスの「セキュリティグループのインバウンドルール」に「マイIP」として自身の環境のIPアドレスが追加されていること。
    • 4.2.4. 上記の設定が済んだ上で、RDSインスタンスの「ステータス」が利用可能であること。開始中や停止中だと接続できません。

では、1個ずつ確認していきましょう。

4.1. ローカルPC

4.1.1. MySQLコマンドラインクライアントが使用できる

ターミナルを開き、以下のコマンドを実行してバージョン表示がされることを確認。

mysql: command not foundと出力されて場合は、インストールする必要があります。(インストール方法については割愛)

mysql --version

mysql  Ver 8.0.26 for macos10.15 on x86_64 (Homebrew)

4.2. RDS インスタンス

4.2.1. RDSインスタンスのエンジンがMySQL

確認手順は以下です。

  1. Amazon RDSコンソールを開きます
  2. サイドバーのテータベースをクリックすると、使用しているインスタンスについて表示されるので、今回使用するRDSインスタンスの名前をクリックします
  3. 詳細ページが開きます。概要部分にエンジンの項目があるのでそこで確認します。

4.2.2. RDSインスタンスの設定「パブリックにアクセス可能」であること

  1. 上記と同様インスタンスの詳細ページを開きます。
  2. 接続とセキュリティタブを選択します。
  3. パブリックアクセス可能の欄があるのでそこで確認します。(ありになっていれば大丈夫です)

「パブリックアクセス」の設定

もしありになっていない場合、設定が必要です。設定の手順については以下です。

  1. 同じく詳細ページにて、上部にある変更ボタンをクリック

  2. 設定画面が表示されるので、接続の項目までスクロールし、追加設定のトグルをクリックして開きます。するとパブリックアクセスの選択項目が現れるので、パブリックアクセス可能を選択します。

  3. ページ下部の続行をクリックで設定を更新して、この項目の設定は完了です。

4.2.3. RDSインスタンスの「セキュリティグループのインバウンドルール」に「マイIP」として自身の環境のIPアドレスが追加されていること

  1. こちらも上記同様、詳細ページを開きます。
  2. 接続とセキュリティタブを開きます。
  3. セキュリティ欄にあるVPCとセキュリティグループのリンクをクリックします。
  4. セキュリティグループに関する設定画面が表示されたと思います。こちらの下段にインバウンドルールという項目があるので、そちらを選択します。
  5. 既に設定されているインバウンドルールの中に、自身のPCが所属しているIPアドレスを持つインバウンドルールが存在するかどうかを確認してください。あればOK。なければ設定が必要です。

インバウンドルールの設定

インバウンドルールに自身のIPアドレスを設定する手順について説明します。

  1. 上記と同様のページを開きつつ、インバウンドルールタブを開き、インバウンドのルールを編集をクリックします。

  2. インバウンドのルールを編集という画面が開きます。ページ内にあるルールを追加をクリックします。

  3. ここで、以下の項目を選択します。

    • タイプ:カスタムTCP → MySQL/Aurora
    • ソース:カスタム → マイIP
  4. ルールを保存をクリックして設定を保存してください。

4.2.4. 上記の設定が済んだ上で、RDSインスタンスの「ステータス」が利用可能であること。

  1. 上記同様、詳細ページを開きます。
  2. 概要にて確認します。

以上で設定が完了しました。次はローカルPCからRDSインスタンスへ接続してみましょう。

5. 接続用のコマンドを実行

RDSインスタンスへSSL接続

RDSインスタンスへSSLで接続するには、以下のコマンドを実行します。
--ssl-caというオプションに、「SSL証明書のダウンロード」にてダウンロードした、SSL証明書のフルパスを渡します。

mysql -h <DBインスタンスのエンドポイント> -u root -p --ssl-ca=/<フルパス>/global-bundle.pem --ssl-mode=VERIFY_IDENTITY

パスワードを要求されるので、入力して実行します。成功したら以下のように見慣れたが画面が表示されます。

Enter password: 


# 成功
Welcome to the MySQL monitor.  Commands end with ; or \g.

・・・

mysql>

無事にSSL接続できました👏

最後に接続のSSL化が有効になっているかの確認

mysql> SHOW VARIABLES LIKE 'have_ssl';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   |
+---------------+-------+
1 row in set (0.04 sec)

6. 非SSLでの接続(おまけ)

非SSLで接続する場合は、以下をチェック。

クライアントとサーバーが同じ VPC にあり、ネットワークが信頼されている場合に限り、暗号化されていない MySQL 接続を使用します。暗号化された接続の使用については、「SSL を使用した MySQL コマンドラインクライアントからの接続 (暗号化)」を参照してください。
from 公式リファレンス

コマンドについては、SSL接続の時よりも単純で、以下になります。

mysql -h <DBインスタンスのエンドポイント> -P <ポート番号> -u root -p

パスワードを入力して実行しましょう。

Enter password: 


# 成功
Welcome to the MySQL monitor.  Commands end with ; or \g.

・・・

mysql>

説明については以上になります。

参考

MySQL データベースエンジンを実行している DB インスタンスへの接続
VPC のパブリックサブネットまたはプライベートサブネットを使用する Amazon RDS DB インスタンスへの接続問題を解決するには、どうすれば良いですか?
Amazon RDS のトラブルシューティング
SSL証明書を使用してRDSインスタンスへ接続する
SSL 接続を使用して Amazon RDS インスタンスに正常に接続するにはどうすればよいですか?
Amazon RDS for MySQL または Aurora DB インスタンスに接続するときの ERROR 2026 SSL 接続エラーを解決する方法を教えてください。

Discussion