シークレットをコードとログから排除する

開発者のための AWS セキュリティ活用

Rahul Singh

Technical Product Manager

機密だからといってシークレットとは限らない

3種類の文字列

  • シークレット: 他人があなたになりすませる
  • 機密データ: 個人情報が露出する
  • 設定: 盗んでも得るものがない

シークレット、機密データ、設定を比較した3段の図。各行に例の値が2つずつ示され、他人がそれを使って何ができるかを、なりすましから何もできない場合まで示している。

開発者のための AWS セキュリティ活用

機密だからといってシークレットとは限らない

3種類の文字列

  • シークレット: 他人があなたになりすませる
  • 機密データ: 個人情報が露出する
  • 設定: 盗んでも得るものがない

個人データを表す2つの用語

  • PII: 個人を特定できる情報
  • PHI: 保護対象の医療情報

シークレット、機密データ、設定を比較した3段の図。各行に例の値が2つずつ示され、他人がそれを使って何ができるかを、なりすましから何もできない場合まで示している。

開発者のための AWS セキュリティ活用

シークレットが漏れる4つの経路

実行中のシステムのシークレットが4つの番号付きの出口に分岐する図。マーカー1はソースコードとその履歴、マーカー2は環境変数、マーカー3はアプリケーションログ、マーカー4はエラー出力とトレースを指す。4つすべてが「誰かに読み取られる」というボックスに収束する。

  1. ソースコードとその履歴
  2. 環境変数
開発者のための AWS セキュリティ活用

シークレットが漏れる4つの経路

実行中のシステムのシークレットが4つの番号付きの出口に分岐する図。マーカー1はソースコードとその履歴、マーカー2は環境変数、マーカー3はアプリケーションログ、マーカー4はエラー出力とトレースを指す。4つすべてが「誰かに読み取られる」というボックスに収束する。

  1. ソースコードとその履歴
  2. 環境変数
  3. アプリケーションログ
  4. エラー出力とトレース
開発者のための AWS セキュリティ活用

保存時の暗号化は非公開を意味しない

安心に見える選択肢

  • 保存時は常に暗号化
  • AWS KMS キー、デフォルトは AWS 管理

環境変数を保持する Lambda 関数から2つの経路に分岐する図。ディスク上では AWS KMS キーで保存時に暗号化され、緑色で示されている。API 経由で GetFunctionConfiguration を呼び出すと値は平文で返され、赤色で示されている。両方の経路は「保護されているのは一方の経路だけ」という注記に収束する。

開発者のための AWS セキュリティ活用

保存時の暗号化は非公開を意味しない

安心に見える選択肢

  • 保存時は常に暗号化
  • AWS KMS キー、デフォルトは AWS 管理

GetFunctionConfiguration が返す値

  • 値はそのまま平文

アクセス制御の課題にストレージの対策で答えている

環境変数を保持する Lambda 関数から2つの経路に分岐する図。ディスク上では AWS KMS キーで保存時に暗号化され、緑色で示されている。API 経由で GetFunctionConfiguration を呼び出すと値は平文で返され、赤色で示されている。両方の経路は「保護されているのは一方の経路だけ」という注記に収束する。

開発者のための AWS セキュリティ活用

どちらのストアを選ぶべきか、その理由

2つのサービス、それぞれ専門の役割

  • Secrets Manager: シークレット専用
  • Parameter Store: 設定情報専用で、SecureString パラメータは KMS キーで暗号化される

スペクトル図。左に Secrets Manager、右に Systems Manager Parameter Store があり、その間に4本の横線が伸びている。各線には番号付きのマーカーがあり、1は左端、2は中央よりやや左、3は中央線上、4は右端に配置されている。4本目の線の両端にはコストの数値があり、「ローテーションが決め手」という注記が添えられている。

開発者のための AWS セキュリティ活用

どちらのストアを選ぶべきか、その理由

2つのサービス、それぞれ専門の役割

  • Secrets Manager: シークレット専用
  • Parameter Store: 設定情報専用で、SecureString パラメータは KMS キーで暗号化される

決め手となる4つの要素

  1. マネージドローテーション
  2. アカウント間共有
  3. バージョン管理
  4. コスト

スペクトル図。左に Secrets Manager、右に Systems Manager Parameter Store があり、その間に4本の横線が伸びている。各線には番号付きのマーカーがあり、1は左端、2は中央よりやや左、3は中央線上、4は右端に配置されている。4本目の線の両端にはコストの数値があり、「ローテーションが決め手」という注記が添えられている。

開発者のための AWS セキュリティ活用

最新の値を取得し、短時間だけキャッシュする

実行中のプロセスが、マーカー1でシークレットストアに対して GetSecretValue を呼び出す。マーカー2では、1つのシークレット ARN と kms:Decrypt に限定されたロールを使用する。マーカー3では、返された値をメモリ内キャッシュに保持してから、データベースやパートナー API を呼び出す。

  1. 起動時に GetSecretValue を呼び出す
  2. ロールは1つのシークレット ARN と kms:Decrypt に限定
開発者のための AWS セキュリティ活用

最新の値を取得し、短時間だけキャッシュする

実行中のプロセスが、マーカー1でシークレットストアに対して GetSecretValue を呼び出す。マーカー2では、1つのシークレット ARN と kms:Decrypt に限定されたロールを使用する。マーカー3では、返された値をメモリ内キャッシュに保持してから、データベースやパートナー API を呼び出す。

  1. 起動時に GetSecretValue を呼び出す
  2. ロールは1つのシークレット ARN と kms:Decrypt に限定
  3. 値をメモリにキャッシュする

キャッシュし続けると、ローテーションで動かなくなる

開発者のための AWS セキュリティ活用

ローテーションは気づかぬうちに値を変える

なぜ一度の切り替えではなく4段階なのか

  • 新しい値は誰かが使う前に検証される
  • 一度に切り替えると、すべてのクライアントが同時に動かなくなる

ページを縦に流れる3つの列、ローテーションの手順、ラベル、キャッシュを示す図。Secrets Manager が createSecret、setSecret、testSecret を実行し、破線が finishSecret によってラベルが移動する瞬間を示している。破線の上では、ラベルは AWSCURRENT が古い値を指しており、キャッシュは正しい状態。破線の下では、ラベルは AWSCURRENT が新しい値を指しているが、同じキャッシュは赤い斜線で無効を示している。図の最後には2つの対策が示されている、短いキャッシュ有効期間と、認証失敗時の再取得。

開発者のための AWS セキュリティ活用

ローテーションは気づかぬうちに値を変える

なぜ一度の切り替えではなく4段階なのか

  • 新しい値は誰かが使う前に検証される
  • 一度に切り替えると、すべてのクライアントが同時に動かなくなる

4段階、1回の引き継ぎ

  • AWSPENDING、AWSCURRENT、AWSPREVIOUS

ページを縦に流れる3つの列、ローテーションの手順、ラベル、キャッシュを示す図。Secrets Manager が createSecret、setSecret、testSecret を実行し、破線が finishSecret によってラベルが移動する瞬間を示している。破線の上では、ラベルは AWSCURRENT が古い値を指しており、キャッシュは正しい状態。破線の下では、ラベルは AWSCURRENT が新しい値を指しているが、同じキャッシュは赤い斜線で無効を示している。図の最後には2つの対策が示されている、短いキャッシュ有効期間と、認証失敗時の再取得。

開発者のための AWS セキュリティ活用

ローテーションは気づかぬうちに値を変える

なぜ一度の切り替えではなく4段階なのか

  • 新しい値は誰かが使う前に検証される
  • 一度に切り替えると、すべてのクライアントが同時に動かなくなる

4段階、1回の引き継ぎ

  • AWSPENDING、AWSCURRENT、AWSPREVIOUS

キャッシュには何も知らされない

  • 有効期間は数分、その後再読み込み
  • 認証失敗時に再取得

ページを縦に流れる3つの列、ローテーションの手順、ラベル、キャッシュを示す図。Secrets Manager が createSecret、setSecret、testSecret を実行し、破線が finishSecret によってラベルが移動する瞬間を示している。破線の上では、ラベルは AWSCURRENT が古い値を指しており、キャッシュは正しい状態。破線の下では、ラベルは AWSCURRENT が新しい値を指しているが、同じキャッシュは赤い斜線で無効を示している。図の最後には2つの対策が示されている、短いキャッシュ有効期間と、認証失敗時の再取得。

開発者のための AWS セキュリティ活用

マスクと削除で、デバッグ可能な状態を保つ

リクエストID、カード番号全体、トークンを含む生のログ1行が赤枠で示されている。その下には、同じ3つのフィールドを処理した後の状態が示されている。リクエストIDはそのまま、カード番号は下4桁のみ表示にマスクされ、トークンは削除済みを示すマーカーに置き換えられている。下には「デバッグには十分な情報が残っている」という注記がある。

書き込む前に無害化する

  • マスク: 形式は保持し、値は隠す
開発者のための AWS セキュリティ活用

マスクと削除で、デバッグ可能な状態を保つ

リクエストID、カード番号全体、トークンを含む生のログ1行が赤枠で示されている。その下には、同じ3つのフィールドを処理した後の状態が示されている。リクエストIDはそのまま、カード番号は下4桁のみ表示にマスクされ、トークンは削除済みを示すマーカーに置き換えられている。下には「デバッグには十分な情報が残っている」という注記がある。

書き込む前に無害化する

  • マスク: 形式は保持し、値は隠す
  • 削除: 値を消し、マーカーだけ残す
開発者のための AWS セキュリティ活用

マスクと削除で、デバッグ可能な状態を保つ

リクエストID、カード番号全体、トークンを含む生のログ1行が赤枠で示されている。その下には、同じ3つのフィールドを処理した後の状態が示されている。リクエストIDはそのまま、カード番号は下4桁のみ表示にマスクされ、トークンは削除済みを示すマーカーに置き換えられている。下には「デバッグには十分な情報が残っている」という注記がある。

書き込む前に無害化する

  • マスク: 形式は保持し、値は隠す
  • 削除: 値を消し、マーカーだけ残す

オンコール担当者が必要なのは設定情報、部外者が欲しいのはそれ以外

開発者のための AWS セキュリティ活用

練習しましょう!

開発者のための AWS セキュリティ活用

Preparing Video For Download...