ロール、一時的な認証情報、SigV4

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

Rahul Singh

Technical Product Manager

タスクより長生きするキー

作業を効率化するため、スクリプト内でキーを作成し、設定ファイルに保存します。

そのファイルの中では:

  • ローテーションされない
  • 失効されない
  • 期限切れにならない

1つのアクセスキーが6つの保存場所に広がり、右側の時間軸では18か月目でも有効であることを示す図

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

タスクより長生きするキー

作業を効率化するため、スクリプト内でキーを作成し、設定ファイルに保存します。

そのファイルの中では:

  • ローテーションされない
  • 失効されない
  • 期限切れにならない

 

18か月後も、まだ有効です

1つのアクセスキーが6つの保存場所に広がり、右側の時間軸では18か月目でも有効であることを示す図

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

自動で失効する認証情報

AWS STSで失効をデフォルトにする

  1. ロールをリクエストし、内蔵の時計を持つ認証情報を取得します

  2. Security Token Service (STS): 失効時刻が付与され、デフォルトは1時間

アプリケーションがAWS STSに対してAssumeRoleを呼び出し、STSが内蔵の時計を持つ認証情報を返す図

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

自動で失効する認証情報

AWS STSで失効をデフォルトにする

  1. ロールをリクエストし、内蔵の時計を持つ認証情報を取得します

  2. 一時的な認証情報はASIAで始まり、セッショントークンを伴います

  3. Security Token Service (STS): 失効時刻が付与され、デフォルトは1時間

アプリケーションがAWS STSに対してAssumeRoleを呼び出し、内蔵の時計を持つ認証情報を受け取る図。下には2種類の認証情報を並べて表示。AKIAで始まりセッショントークンを持たず失効しない長期キーと、ASIAで始まりセッショントークンを持ち1時間で失効する一時的な認証情報

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

自動で失効する認証情報

AWS STSで失効をデフォルトにする

  1. ロールをリクエストし、内蔵の時計を持つ認証情報を取得します

  2. 一時的な認証情報はASIAで始まり、セッショントークンを伴います

  3. 同じ呼び出しが、受け入れられる場合とそうでない場合がある

  4. Security Token Service (STS): 失効時刻が付与され、デフォルトは1時間

アプリケーションがAWS STSに対してAssumeRoleを呼び出し、内蔵の時計を持つ認証情報を受け取る図。下にはAKIAで始まり失効しない長期キーと、ASIAで始まりセッショントークンを持ち1時間で失効する一時的な認証情報。さらにその下には、同じGetObject呼び出しが10時には200 OKを返し、11時5分にはExpiredTokenを返す様子

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

コードが認証情報を見つける仕組み

認証情報プロバイダーチェーンを確認する

  • コード内のライブラリであるAWS SDKが検索を行います
  • 固定リストを順番にチェックします
  • 最初に一致した時点で停止します

認証情報の検索順序を示す図。コード内で渡されたキーはチェーンの上に取り消し線で示され、検索は環境変数、設定ファイル、コンテナの認証情報へと進み、最初に一致した時点で停止し、インスタンスメタデータには到達しない

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

コードが認証情報を見つける仕組み

認証情報プロバイダーチェーンを確認する

  • コード内のライブラリであるAWS SDKが検索を行います
  • 固定リストを順番にチェックします
  • 最初に一致した時点で停止します

 

ハードコードされたキーが最初にチェックされるため、削除する必要があります

認証情報の検索順序を示す図。コード内で渡されたキーはチェーンの上に取り消し線で示され、検索は環境変数、設定ファイル、コンテナの認証情報へと進み、最初に一致した時点で停止し、インスタンスメタデータには到達しない

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

チェーンを一つずつたどる

1. explicit      a key passed in your code
2. environment   AWS_* variables, and on Lambda
                 that is the execution role
3. config file   ~/.aws/credentials
4. container     ECS or EKS task role
5. instance      EC2 instance profile, via IMDS
  • 最初に一致したものが優先されます
  • 保存されたキーを削除すると、検索はロールへと続きます
開発者のための AWS セキュリティ活用

AWSの外からIDを証明する

コードパイプラインはAWSの外で実行されることが多く、認証情報チェーンを紐づけられません

  • GitHubやGitLab上で実行されます
  • チェーンが見つけるものが何もありません

AWSの境界の外に描かれたCIランナーとそのプラットフォーム。ランナーには紐づけるロールがないことが示され、プラットフォームは1つのリポジトリと1つのワークフローを指定したOIDCトークンに署名する

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

AWSの外からIDを証明する

コードパイプラインはAWSの外で実行されることが多く、認証情報チェーンを紐づけられません

  • GitHubやGitLab上で実行されます
  • チェーンが見つけるものが何もありません

 

OIDCトークン(OpenID Connect)

  • 署名済みで、有効期限が短い
  • 認証情報ではなく、身元に関する声明

AWSの境界の外に描かれたCIランナーとそのプラットフォーム。ランナーには紐づけるロールがないことが示され、プラットフォームは1つのリポジトリと1つのワークフローを指定したOIDCトークンに署名する

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

保存されたキーの代わりにルールを使う

リポジトリを指定したOIDCトークンが、AssumeRoleWithWebIdentityを通じて1時間で失効する一時的な認証情報と交換される図。ロールの信頼ポリシーには、すでにその発行者とそのリポジトリが指定されている

トークンを認証情報と交換する

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

保存されたキーの代わりにルールを使う

リポジトリを指定したOIDCトークンが、AssumeRoleWithWebIdentityを通じて1時間で失効する一時的な認証情報と交換される図。ロールの信頼ポリシーには、すでにその発行者とそのリポジトリが指定されている

トークンを認証情報と交換する

  • AssumeRoleWithWebIdentity: 外部のトークンを証明として使うAssumeRole
  • 信頼ポリシー: パイプラインには保存せず、事前にロールに記述
  • クレーム: トークン内の1つの事実
  • 発行者はプラットフォーム上のすべてのリポジトリで共有されるため、リポジトリも固定する必要があります

リポジトリのシークレットは、これで空になります

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

すべてのリクエストは署名される

署名バージョン4(SigV4)

  • どの認証情報がリクエストを行ったかを証明します
  • リクエストが転送中に改ざんされていないことを証明します
  • すべての呼び出しでCLIとSDKが署名します

署名の流れ。リクエストと認証情報からAuthorizationヘッダーに送られる署名が生成され、AWSが再計算して比較し、一致すれば受け入れ、不一致ならSignatureDoesNotMatchを返す

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

引き渡せる署名

一時的な認証情報

  • ロールによって範囲が定められた、多くのアクション
  • コードが保持します

コードがS3、DynamoDB、SQS、KMSという4つの異なるAWSサービスを、一時的な認証情報で呼び出す図

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

引き渡せる署名

一時的な認証情報

  • ロールによって範囲が定められた、多くのアクション
  • コードが保持します

署名付きURL

  • 1つのオブジェクト、1つのアクション、そしてリンクを持つ誰もがアクセス可能
  • 自分で選んだ有効期限が過ぎれば、それで終わり
  • 保有者ではなく、自分の権限を伴います

コードがS3、DynamoDB、SQS、KMSという4つの異なるAWSサービスを、一時的な認証情報で呼び出す図

他人のブラウザが、単一のパスを通じてちょうど1つのオブジェクトにアクセスする図。設定した有効期限を示す時計によって中断される

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

練習しましょう!

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

Preparing Video For Download...