Open1

備忘: GitHub ActionsでAWSのOIDCをする時の権限

mickeeymickeey

GitHub ActionsでAWSにアクセスするときにOIDCでの認証をしているときに、いつもある権限がないと叱られている。
備忘のために残しておく。

必要な権限について

id-tokenへのwrite権限が必要。

permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect#adding-permissions-settings

id-token permissionってなんだ

これをいれることでGitHubのOIDC ProviderにJSON Web Tokenを作成を許可するための権限。
ID Tokenは認証として自分がだれかを示すためのToken。

以下のような属性を持つJSON Web Tokenを持っている。

interface ID_Token {
    iss: url;           // Issuer Identifier
    sub: string;        // Subject Identifier
    aud: string[];      // Audience
    exp: number;        // Expiration date [UNIXtime]
    iat: number;        // Issued at [UNIXtime]
    auth_time?: number; // End-User authentication time [UNIXtime]
    nonce?: string;
    acr?: string;       // Authentication Context Class Reference
    amr?: string[];     // Authentication Methods References
    azp?: string;       // authorized party
    at_hash?: string;
    c_hash?: string;
    sub_jwk?: object;
    anything_you_want?: any;
}

issが発行者、subが対象者、audがだれがそのTokenを受け取るのかを指定している。

https://ja.wikipedia.org/wiki/OpenID#ID_Token

audとsubに使われる値

AWSの場合は通常sts.amazonaws.comが利用される。
大体の場合はそれで足りるのだがChine Regionの時だけは設定が必要。
https://github.com/aws-actions/configure-aws-credentials?tab=readme-ov-file#oidc-audience

subはそのTokenを発行するユーザーの識別子。

だから、AWSやAzureの場合はsubにはrepositryやbranchが指定されるということになり、audienceにはそのTokenを引き受ける対象のCloudのデフォルト値で問題がないということになる。

無条件にid-tokenを発行させないためにもsubの指定が重要になりそう。

https://docs.github.com/ja/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect#customizing-the-subject-claims-for-an-organization-or-repository