c2.21 シークレットをコードの外に保つ
コードにシークレットをハードコードすると、リポジトリを読める者にクレデンシャルが露出するおそれがあります。シークレットは実行時に AWS Secrets Manager から取得し、コードをスキャンして、コミットされたシークレットを出荷前に捕捉します。
実装ガイダンス
シークレットをハードコードしない
コード中のシークレットは、リポジトリにアクセスできる誰もが読め、公開リポジトリに簡単に漏れ、ローテーションも困難です。ハードコードされたシークレットがアクセスキーなら、代わりにロールによる一時的な認証情報を優先してください。
長期のシークレットは実行時に取得する
コードが本物の長期シークレット(データベースのパスワード、サードパーティの API キーなど)を必要とする場合は、AWS Secrets Manager に保存し、実行時に取得します。ワークロードには IAM ロール(インスタンスプロファイル、Lambda/ECS の実行ロール)を通じてシークレットの読み取り権限を与え、コードにクレデンシャルを埋め込まないようにします。Secrets Manager は対応するシークレットを自動でローテーションできます。ベストプラクティスを参照してください。
出荷前にシークレットを捕捉する
git-secrets などのツールでコミットされたシークレットをスキャンし、シークレットスキャンをパイプラインに組み込んで、検出されたシークレットが昇格をブロックするようにします。Amazon Q Developer もコード記述中にシークレットを指摘します。
実行時に取得し、コミット前にスキャンする
ハードコードせず、実行時にシークレットを取得します:
aws secretsmanager get-secret-value \
--secret-id prod/db/password \
--query SecretString --output text
コミットされたシークレットがパイプラインをブロックするよう、リポジトリのスキャンを追加します:
git secrets --install
git secrets --register-aws
git secrets --scanHow to validate
- データベースのパスワードなどのシークレットの保存とローテーションに AWS Secrets Manager(または同等品)を使っていますか?
- シークレットがコードにコミットされるのを防いでいますか(スキャン、pre-commit チェック)?
- 開発者はコードにシークレットを保存しないよう訓練されていますか?
- シークレットが検出されるとパイプラインは停止しますか?
Threats addressed
- コード中のシークレットは、読み取り権限を持つ者(テスター、レビュアー)が取得し、コード外で使ったり攻撃者に売ったりできます。
- 開発者がコードを GitHub などの公開リポジトリにプッシュしてクレデンシャルを露出させることがあります。攻撃者はそれを求めてリポジトリを積極的に収集します。
- ハードコードされたシークレットは迅速なローテーションが難しく、既知の侵害時に最も問題になります。同じリスクは、コードとともにコミットされた設定ファイル内のシークレットにも当てはまります。
AWS サービス
料金
AWS Secrets Manager はシークレット 1 件あたり月額 0.40 USD に加え、API 呼び出し 10,000 件あたり 0.05 USD で、30 日間の無料トライアルがあります。Secrets Manager の料金を参照してください。
Cloud Security Maturity Model