こんにちは。FLINTERSアドベントカレンダー1日目を担当します、堀越です。
はじめに
セキュリティに対する意識の高まりを感じる昨今、機密情報(以降、Secretsと称します)の管理の重要性が増してきているように感じます。 代表的な Secrets としてデータベースの認証情報などが挙げられますよね。弊社のポリシーとして定期的にパスワードを更新しましょうというのがあるのですが そもそも更新作業自体が手間だし、更新すると認証情報の保管庫やローカルのGUIアプリの設定も合わせて更新せねばならず...といった感じで辛い部分が多いです。
わたしのチームではWebアプリをAWSで動かす機会が多く、データベースにはRDSを採用していますが AWS Secret Manager が提供する Secrets の自動ローテション機能が上記辛みの軽減になりそうだったので試してみることにしました。
準備
RDS準備
手順は割愛しますがコンソールからポチポチとRDSを準備しました。検証用に用意しただけなのでパブリックアクセスを許可しちゃってます。
接続情報は以下のようになりました。
自動ローテーションを試していく
Secret Manager に RDS の Secrets を登録
AWSのコンソールから Secret Manager のコンソールに飛び 新しいシークレットを保存する
をクリックします。
RDSの情報を入力していきます。
次にシークレットの名前を入力します。
最後にローテーションの設定を行います。
Secret Manager の設定はこれで終了です。
ローテーションされ...ない!!!
シークレットを作成後にすぐにローテーションする設定を有効にしたのでRDSのパスワードが更新されているかと思いきや、されてませんでした...。なんでや!!
しばらく待ってみてもビクともしないので すぐにシークレットをローテーションさせる
をクリックしてみたところ以下のようなエラーとなってしまいました。
ローテーションを担う Lambda のログを見てみてもいまいちピンと来ず。
VPC から Secret Manager の API にアクセスできなければならない
この事象のトラブルシューティングについてはすでにクラメソさんのブログに上がっていました。
AWS Secrets Managerでシークレットが正常にローテーションできなかった時の対応方法 | DevelopersIO
RDS、Lambda のセキュリティーグループの不備や、VPC から Secret Manager のエンドポイントに到達できないといったことが原因でローテーションが正常に完了しないということがあるみたく、今回は後者でした。
なので Lambda が起動する VPC に Secret Manager のエンドポイントを作成しました(詳細な作成手順は割愛します)。*1
ローテーションされ...た!!!
これでようやくRDSのパスワードがローテションされるようになりました。
以降、4時間毎に自動ローテションされていることが確認できました。
IntelliJ から RDS へのアクセスに Secret Manager を使う
さて、わたしは普段 RDS へクエリ打ったりする際には IntelliJ の機能を利用しているのですが、 RDSのパスワードが自動ローテーションされるようになったのでパスワードを直接入力して認証する場合は4時間毎にパスワードを更新する作業が必要になってしまいました。
さすがに不毛ですね。AWS Toolkit for JetBrains を使えば Secret Manager を経由して認証できるようになるということだったので試してみたいと思います。
プラグインインストール
IntelliJ の Preferences → Plugins → Marketplace から AWS Toolkit for JetBrains をインストールします。
詳しくインストールの手順を把握したい方は Installing the AWS Toolkit for JetBrains - AWS Toolkit for JetBrains をご参照ください。
データベースへのアクセス設定
以下の画像のように設定します。Credentials
に指定するのは aws configure --profile ...
等のコマンドによってローカルにセットアップされたプロファイルです。
以上で、設定は終了です。
アクセスできました。
もはやRDSのパスワード、それどころかURLやユーザー名までどこかに保管したり管理する必要はありません。
まとめ
- Secret Manager で RDS のパスワードを4時間毎にローテーションできるようにした。
- ローテーションを実行する Lambda は VPC 内に立ち上がるので Secret Manager のエンドポイントへのルートが必要だった。
- AWS Toolkit for JetBrains を使って IntelliJ から RDS へアクセスする際、 Secret Manager に認証を任せることができた。
気になったこと
ECSとかでバックエンド動かす時に Secret Manager から Secrets を読みこむのは王道パターンだと思うのだが、コンテナ実行中にローテーションされちゃった場合は良しなにやってくれたりするのだろうか?
参考文献
- How to configure rotation and rotation windows for secrets stored in AWS Secrets Manager | AWS Security Blog
- Installing the AWS Toolkit for JetBrains - AWS Toolkit for JetBrains
- Connecting to an Amazon RDS database - AWS Toolkit for JetBrains
- AWS Secrets Managerでシークレットが正常にローテーションできなかった時の対応方法 | DevelopersIO
最後に
もう、RDS の Secrets を管理するのはやめよう!!
明日は、CTOの @kawachi の記事が投稿されます。お楽しみに。