RDS の接続情報を AWS Secrets Manager でを管理する

SecretManager

AWS Secrets Manager とは

AWS Secrets Manager は、データベースの認証情報、API キー、その他のシークレット情報を容易に管理、取得できるようにするための AWS のサービスです。

AWS Secrets Manager を使用するメリット

一番のメリットはアプリケーションにシークレット情報を保存する必要がなくなることです。
これまでは、データベースにアクセスするための認証情報をアプリケーションに保存しておき、データベースにアクセスする際にその情報を利用するのが一般的でした。

この方法の場合、githubのようなバージョン管理ツールからパスワードの情報が参照な状態となってしまいます。また、データベースの認証情報を更新するためには、アプリケーションの修正が必要となります。変更に伴うリスクやコストから、長期間同じ認証情報を使用するようになり、セキュリティー的にもあまり良くありません。

AWS Secrets Manager を使用することでこれらの問題を解消することが可能となります。

AWS Secrets Manager の使用方法

1. シークレットの登録

AWSコンソールで SecretManager にアクセスし、「新しいシークレットを保存する」をクリックします。

下記の情報を入力し、「次」をクリックします。
① シークレットの種類を選択: RDSデータベースの認証情報
② ユーザー名/パスワード: RDSに接続可能な認証情報を入力
③ このシークレットがアクセスするRDSデータベースを選択してください: 接続するRDSを選択

下記の情報を入力し、「次」をクリックします。
① シークレットの名前: 任意の名前を入力

下記の情報を入力し、「次」をクリックします。
① 自動ローテーションを設定する: 自動ローテーションを無効にする

設定した内容を確認し、問題がなければ、「保存」をクリックします。

2. 作成したシークレットの確認

事前に awscli および jq をインストールしておきます。
RDS に接続するために必要な認証情報が確認できます。

[[email protected] ~]$ aws secretsmanager get-secret-value --secret-id secret-test --region ap-northeast-1 | jq .SecretString | jq fromjson
{
  "username": "admin",
  "password": "83TShltVPEXfdgRu2znr",
  "engine": "mysql",
  "host": "secret-test.cluster-cyrkvcvnv6zk.ap-northeast-1.rds.amazonaws.com",
  "port": 3306,
  "dbname": "testdb",
  "dbClusterIdentifier": "secret-test"
}
[[email protected] ~]$

認証情報を変数に格納し、RDS にアクセスします。

[[email protected] ~]$ secret=`aws secretsmanager get-secret-value --secret-id secret-test --region ap-northeast-1 | jq -r .SecretString`
[[email protected] ~]$ user=`echo $secret | jq -r .username`
[[email protected] ~]$ pass=`echo $secret | jq -r .password`
[[email protected] ~]$ host=`echo $secret | jq -r .host`
[[email protected] ~]$ mysql -h $host -u $user -p$pass
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.7.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.
    
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

3. シークレットのローテーションを有効化

シークレットのローテーションを有効化します。
作成したシークレットを選択し、「ローテーションを編集」をクリックします。

下記の情報を入力し、「保存する」をクリックします。
① 自動ローテーションを有効にする: 選択
② 新しいAWS Lambda関数名: 任意の名前を入力

保存するをクリックすると、裏で Cloudformation が実行されて、認証情報ローテション用の Lambda が作成されます。

作成される Lambda は、下記の設定をRDSから引き継いで作成されます。

  • 作成先VPC
  • 作成サブネット
  • アタッチするSG

Lambda を使用して認証情報をローテションするためには、下記の条件が満たされている必要があります。これらの条件が満たされていないと Lambda が timed out で異常終了してします。

  • Lambda 関数が RDS にアクセスできるように設定されていること
    • SG の設定が厳しい場合には、設定を見直し、アクセスできるようにする
  • Lambda関数が Secrets Manager のエンドポイントと通信できるように設定されていること
    • Secrets Manager のエンドポイントにアクセスできるように、NAT G/Wを作成する
    • Secrets Manager の VPC エンドポイントを作成する
ローテーション関数へのネットワークアクセス - AWS Secrets Manager
Secrets Manager は、Lambda 関数を使用してシークレットをローテーションします。シークレットをローテーションするために、Lambda 関数では、シークレット、およびデータベース (またはサービス) の両方にアクセスできる必要があります。

Lambda が作成されると、作成された Lambda の情報が表示されます。
作成されても処理が正常に終了しているとは限りませんので、CloudWatch Logs で処理が正常に実行できているか確認しましよう。

4. ローテーション後のシークレットの確認

シークレットの情報を確認すると、パスワードが変更されています。

[[email protected] ~]$ aws secretsmanager get-secret-value --secret-id secret-test --region ap-northeast-1 | jq .SecretString | jq fromjson
{
  "username": "admin",
  "password": "$^10MciA`8T=yn|D8py-29.:8JCGSri-",
  "engine": "mysql",
  "host": "secret-test.cluster-cyrkvcvnv6zk.ap-northeast-1.rds.amazonaws.com",
  "port": 3306,
  "dbname": "testdb",
  "dbClusterIdentifier": "secret-test"
}
[[email protected] ~]$

再度、認証情報を変数に格納し、RDS にアクセスします。

[[email protected] ~]$ secret=`aws secretsmanager get-secret-value --secret-id secret-test --region ap-northeast-1 | jq -r .SecretString`
[[email protected] ~]$ user=`echo $secret | jq -r .username`
[[email protected] ~]$ pass=`echo $secret | jq -r .password`
[[email protected] ~]$ host=`echo $secret | jq -r .host`

更新された認証情報で、正常にアクセスできることが確認できます。

[[email protected] ~]$ mysql -h $host -u $user -p$pass
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

まとめ

AWS Secrets Manager を使用することで、比較的簡単にDBの認証情報をセキュアに管理できることが確認できました。
セキュリティレベルの高い案件では必須の、定期パスワード変更についてもこの機能を使用することで問題なくクリア可能です。
今後は、これらの機能を有効活用し、セキュアのシステムの構築を心がけるようにします。

コメント

タイトルとURLをコピーしました