イラストで理解するSecrets Manager
はじめに
今回はSecrets Managerの概要について学んでいきます。
AWSの資格試験に出てくるので、なんとなく存在は知っていましたが
あらためてSecrets Managerのなにが便利なのか、見ていきたいと思います。
Secrets Managerってなに?
まずは、簡単にSecrets Managerとは
パスワードなどの機密情報(シークレット)を管理してくれるAWSのサービスです。
上記の図のように
データベースの認証情報や、アプリケーションのAPIキー、それ以外にもOAuthのトークンなど
様々な文字列をJSON形式で管理できます。
こちらはSecrets Managerのコンソール画面からシークレットを新規作成する際の画面です。
ここでシークレットのタイプを選択することができます。
さらにSecrets Managerはこれらのデータを自動でローテーション(新しいものに入れ替え)したり、暗号化することも可能です。
なんて便利なんでしょう!
Secrets Managerがない世界
まずは、Secrets Managerがない世界を想像してみましょう。
以下のような、よくあるアプリケーションとデータベースの構成があります。
この構成でデータベースの認証情報を管理する場合、どのようなことが考えられるでしょう。
- アプリケーションと同じところで認証情報を管理
- 認証情報を更新せずに放置
- 他で使っている認証情報の使い回し
- 情報を平文で管理
他にもあると思います、認証情報を管理するのは意外と大変ですね。
みなさんもパソコンのパスワード、アプリのパスワード、使い回しているものありませんか?
何年も何十年も同じパスワードを使っていませんか?
そこで、この大変な管理を請け負ってくれる素晴らしいサービスが「Secrets Manager」というわけです。
シークレットの面倒な管理をズバババッっと解決してくれる頼もしいやつです。
私たちの身の回りで例えると、
ブラウザやスマートフォンのパスワードマネージャーと考えると分かりやすいかもしれません。
シークレットを保管する専用のストレージ
では、ここからSecrets Managerの具体的な機能について考えていきます。
まずは、Secrets Manager自体がシークレットを保管するためのストレージになるという点です。
先ほどの例だと、認証情報を保管する場所がアプリケーションと同じ場所でした。
EC2が複数だと認証情報の更新時に各EC2で変更する必要があります。
それ以外にも、この状態でサーバーに不正アクセスされると認証情報も漏洩するリスクがあります。
そこで、認証情報は専用の場所(Secrets Manager)にまとめましょう!!
そうすることで、管理が楽になります。
万が一、サーバーが攻撃を受けても被害を抑えられます。
ローテーション
Secrets Managerではシークレットを自動でローテーションしてくれる機能があります。
例えば、データベースの認証情報です。
同じパスワードを使い続けると、気付かないうちにパスワードを盗まれて
長期に渡って不正なアクセスを受ける可能性があります。
これを防ぐためにも定期的なパスワードの変更が必要です。
そこで、Secrets Managerでは数時間単位から定期的にローテーションを行なってくれます。
変更されたパスワードはDBに反映されるの?
ここで私は、認証情報が変更されても、データベース側の情報も変わらないと意味ないのでは?
と思いました。
もちろん、これはしっかりカバーさています。
認証情報の変更時には裏でLambdaが起動して、データーベースの情報も一緒に更新してくれます。
こちらは、コンソール画面からシークレットを新規作成する画面です。
Lambdaを選択する部分がありますね。
ちなみに、このLambdaは裏側でCloudFormationによって自動的に作成されます。
シークレットの暗号化
Secrets ManagerではKMSを使ったシークレットの暗号化にも対応しています。
暗号時の鍵はデフォルトで「aws/secretsmanager」というAWSマネージドキーが作成されます。
もちろん自分が作成したKMSキーを使うこともできます。
AWSのマネージドキーなので、料金がかかりません。
キーポリシーを細かく制御したい等の要件がなければデフォルトでいいでしょう。
料金
Secrets Managerはどこに料金が発生するのでしょうか。
料金は以下の2つに対して発生します。
- シークレットの呼び出し
- シークレットの保管
Parameter Storeとの違い
AWSには、Secrets Managerに似たサービスで「Parameter Store」というサービスがあります。
どちらも機密情報をセキュアに保存することができ、あまり違いがないように思います。
しかし、Parameter Storeには「ローテーション機能」がありません。
データベースの認証情報のように定期的な更新が必要な要件ではSecrets Managerがよいでしょう。
フルマネージドサービスなので、ヒューマンエラーによる機密情報の更新忘れが防げます。
高度なセキュリティ要件を求められる場合はSecrets Manager
セキュリティはそこそこに、料金を抑えたいという場合はParameter Store
が向いているのかな?と感じました。
疑問に思ったこと
最後に、私が疑問に思ったことを書きます。
可用性
Secrets Managerは障害発生時にアクセスできなくなることはあるのかな?
Secrets Managerはリージョン毎に保存されているので、リージョンの障害時にはアクセスできなくなる可能性があります。
これに対応するには、マルチリージョン設計が必要です。
高可用性が必要な場合はリージョン間でのレプリケート機能があるので、そちらを使いましょう。
手動ローテーション
なにかしらの都合で手動ローテーションをしたい場合、手動でできるのか?
(そもそもそんなことはあるのか?)
できます。ただし、ローテーションが有効の場合です。
注意点として、手動でローテーションを行うと、その時点からローテーションの期間が再スタートになります。
まとめ
Parameter Storeは何度か触ったことがありましたが、Secrets Managerは高機能、高額というイメージで遠目に見てるだけでした。
実際に機能を調べてみるとそこまで高額という感じもなく、機能も非常に分かりやすいと感じました。
今度は実際にアプリケーションからの呼び出し、ローテーションをやってみたいと思います。
参考資料
Discussion