サーバーレスアプリケーションにおけるシークレット管理のベストプラクティス
2019年6月13日
0 分で読めますサーバーレスアプリケーションを構築する場合、関数から、APIキー、トークン、パスワードなど、保存しているシークレットやその他の機密情報にアクセスする必要があることが多いでしょう。しかし、こうしたシークレットを適切に管理するのは、難しい場合があります。
キー管理サービスを導入しないと、シークレットがソースコードやマニフェストファイルに保存されてしまうことがあります。その結果、ソースコードの公開や改ざんによるシークレットの漏えいに加え、キーのローテーションや廃止など、シークレット管理が複雑になる可能性があります。
サーバーレスセキュリティのチートシートをPDFでダウンロードするか、オンライン版のブログ記事を読むことができます。
以下は、シークレットの安全でない取り扱い方の例です。
まず、この構成の良い点を確認しましょう。helloWorld関数では、関数を分離する原則が適切に実践されています。環境変数GITHUB_API_KEYを利用できるのは呼び出された関数のみであり、このコード内のほかの関数、ここではgoodbyeWorldからは利用できません。
一方、GITHUB_API_KEYのシークレットトークンはserverless.ymlマニフェストファイルにハードコードされています。設定とシークレットに関する情報が混在するため、このマニフェストファイルが公開されたり、ほかのユーザーと共有されたりすると、情報漏えいにつながるおそれがあります。
次の例では、AWS Parameter Storeで安全に暗号化されたシークレットを取得するために設計されたAWS Systems Managerを使用します。この例では、SSM変数を使って事前に作成した特定の値にアクセスし、環境変数を介して関数から利用できるようにしています。
${ssm:/github/api-key}はキーの暗号化された値を返します。復号して実際の値を返すには、${ssm:/github/api-key~true}を指定する必要があります。
Parameter StoreとKey Management Service(KMS)の詳細については、AmazonのParameter Storeのドキュメントをご覧ください。
アプリケーションのシークレット管理において、セキュリティと柔軟性をさらに高めるには、プロセスの再起動が必要な環境変数を使うのではなく、実行時にシークレットやその他の設定情報へアクセスする方法を検討してください。
キーと認証情報を定期的にローテーションする
シークレットをストレージに保存するとキーの漏えいリスクは下がりますが、完全になくなるわけではありません。関数でシークレットストレージを利用していれば、キーそのものが何であるかを気にする必要はありません。つまり、キーを定期的にローテーションできます。キーが漏えいしたり盗まれたりしても、期限切れになるまでの短い期間しか悪用されません。
KMSを利用していれば、キーのローテーションは簡単で、定期的に実行できます。ただし、ほかのシステムとの連携では、少し難しくなる場合があります。サードパーティーシステムへのアクセスにキーが必要な場合は、そのシステムのAPIを調べ、自動でキーをローテーションする方法があるか確認しましょう。可能であれば、新しいキーを作成してKMS内のトークンを更新し、次の反復処理で古いキーを期限切れにするかブラックリストに登録する定期ジョブを作成します。こうすれば、常に有効なキーは2つだけになります。関数の実行時間は非常に短いため、新しいキーはすぐに反映されます。その後、古いキーを期限切れにして、毎日、あるいは毎時間でも、新たなキーのローテーションを開始できます。
まとめ
まとめると、シークレットや機密性の高い認証情報には、大手クラウド事業者やFaaSベンダーがサポートする安全なストレージソリューションを使用することをおすすめします。あるいは、HashicorpのVaultなど、独自のソリューションを導入することもできます。シークレットストレージにキーを保存すれば、ソースコードリポジトリ内の静的ファイルや環境変数に機密情報を保存するリスクを軽減し、情報漏えいの可能性を大幅に下げられます。シークレット管理ツールとベストプラクティスの詳細はこちら。
今すぐ無料のSnykアカウントを作成して、プロジェクトのセキュリティを強化しましょう。
キャプチャー・ザ・フラッグを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、キャプチャー・ザ・フラッグの課題の解き方を学びましょう。
