🔥

GitHub ActionsとAWSのOIDC連携で信頼関係を構築する方法

2024/11/06に公開

はじめに

Githubactionsを利用する際に、AWSのリソースを作成する機会があると思います。
AWSアクセスキーを使用することでも実現可能ですが、セキュリティリスクを伴います。そこで、OpenID Connect(OIDC)を利用して、一時的な認証情報を使用して安全にAWSリソースにアクセスする方法が望まれます。
今回は設定方法については詳しく触れずに、GitHub ActionsとAWSのOIDC連携で信頼関係を構築する部分に焦点を当てていきたいと思います。

参考:GitHub ActionsとAWSのOIDC連携の設定方法

https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-aws

OIDCを用いたGitHub ActionsとAWSの認証の概要

OIDCとは

OpenID Connect(OIDC)は、OAuth 2.0を基盤としたシンプルなアイデンティティレイヤーです。OIDCを利用することで、アイデンティティプロバイダ(IdP)がユーザーの認証を行い、リソースプロバイダがその認証情報を信頼することができます。

なぜOIDCを利用するのか

  • セキュリティ向上: 長期的なアクセスキーをコードや設定に含める必要がなくなります。
  • 管理の簡略化: 認証情報のローテーションや管理が不要になります。
  • 柔軟性: 必要なときに一時的な認証情報を取得するため、権限を最小限に抑えることができます。

STEP1.IAMアイデンティティプロバイダの作成

IAMアイデンティティプロバイダとは

IAMアイデンティティプロバイダは、外部のIdP(この場合はGitHub)からの認証情報を受け入れるための設定です。これにより、AWSはGitHubからのOIDCトークンを信頼し、一時的な認証情報を発行できます。

STEP2.IAMロールを作成

AWSを操作するためのロールを作成します。OIDCを利用してこのロールを一時的に操作可能な権限をAWSから付与されるように信頼関係を構築していきます。
このロールの役割は2つです。

  • 1.AWSを操作するためのポリシーを持つ(S3の操作、EC2の操作など)
  • 2.AWSとの信頼関係を構築

1. AWSを操作するためのポリシーを持つ

今回のテーマとはあまり関係ない部分です。たとえば、このようなポリシーをもたせます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:PutObject", "s3:GetObject"],
      "Resource": ["arn:aws:s3:::your-bucket-name/*"]
    }
  ]
}

2. AWSとの信頼関係を構築

信頼関係の具体的な動作

  1. GitHub ActionsがOIDCトークンを取得: ワークフロー内でOIDCトークンを要求します。
  2. GitHubがOIDCトークンを発行: 要求に応じてトークンを提供します。
  3. AWS STSにロールの引き受けをリクエスト: OIDCトークンを使用してAssumeRoleWithWebIdentity APIを呼び出します。
  4. AWSがトークンを検証: 信頼ポリシーのPrincipalとConditionを確認し、トークンが有効であるかを検証します。
  5. 一時的な認証情報を発行: 検証が成功すると、一時的なアクセスキー、シークレットキー、セッショントークンを発行します。
  6. AWSリソースへのアクセス: 一時的な認証情報を使用して、許可されたAWSリソースにアクセスします。

下記のような信頼ポリシーを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<リポジトリ名>:ref:refs/heads/<ブランチ名>"
        }
      }
    }
  ]
}
  • Principal: Federatedで指定されたOIDCプロバイダから認証されたエンティティが対象です。
    • どのエンティティがロールを引き受けることができるかを指定する要素です。Federatedは、外部のアイデンティティプロバイダ(IdP)から認証されたフェデレーティッドユーザーを指定するためのPrincipalタイプです。OIDCやSAMLなどの外部IdPを利用する場合に使用します。例えば、GitHub ActionsからのOIDCトークンを使用してAWSリソースにアクセスする場合、GitHubがIdPとなり、そのIdPを信頼するFederatedエンティティとして指定します。
  • Action: "sts:AssumeRoleWithWebIdentity"を許可します。
    • sts:AssumeRoleWithWebIdentity"は、ウェブアイデンティティを使用してロールを引き受けることを許可するアクションです。ウェブアイデンティティフェデレーション: 外部のIdP(例:GitHub、Google、Facebook)からのOIDCトークンを使用して、一時的なセキュリティ認証情報を取得するために必要です。
  • Condition: 特定のGitHubリポジトリやブランチからのリクエストに限定しています。

つまり、
githubactionsのIDプロバイダーを信頼して、特定のリポジトリーの条件下であれば、ロールを引き受けることができるという信頼関係を結んでいます。

参考文献

https://docs.github.com/ja/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect

https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html

Discussion