TECH PLAY

電通総研

電通総研 の技術ブログ

822

皆さん、こんにちは。 電通国際情報サービス (以下、ISID)X イノベーション 本部アドバンストテク ノロ ジー 部の宮原です。 本日よりISIDのテックブログが開始されます。そして、本記事はISIDテックブログの記念すべき第一号です。 また、12月からはAdvent Calendarを実施していく予定です。Advent Calendarのリンクは以下にあります。 https://adventar.org/calendars/6576 こちらもぜひ楽しみにしていてください。 さて、第一号の本記事では GitHub Actionsの新機能についてご紹介します。 10/27に GitHub Blogにて以下のアナウンスがありました。 https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/ ブログのタイトルは GitHub Actions: Secure cloud deployments with OpenID Connectとなっています。このアナウンスによって、 OpenID Connectを利用し GitHub Actionsから クラウド リソースにアクセスできるようになりました。 本記事では OpenID Connectを利用し、 GitHub Actionsから AWS リソースへアクセスする方法についてご紹介します。 以下では OpenID ConnectをOIDCと略します。 概要 方法 IAM OIDC ID プロバイダーを作成する IAM ロールを作成する GitHub Actionsから一時的な認証情報を取得する まとめ 参考にした情報 概要 OIDCを利用した クラウド リソースへのアクセスについては以下のドキュメントを参考にすると良いでしょう。 https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect 以下は公式ドキュメントの画像です。 クラウド プロバイダーにてロールと GitHub Actionsジョブ間のOIDCの信頼関係を設定する。 GitHub Actionsのジョブが実行されるたび、 GitHub のOIDCプロバイダーはOIDC トーク ンを自動生成する。 GitHub のOIDCプロバイダーからOIDC トーク ンを取得し、 クラウド プロバイダーに送信する。 クラウド プロバイダーはOIDC トーク ンの検証に成功したら、ジョブ内でのみ有効な、一時的な認証 トーク ンを提供する。 このような流れで一時的な認証 トーク ンを入手し、さらに認証 トーク ンを用いて クラウド リソースにアクセスします。 上記の流れを実現するために、 AWS では、 Web IDフェデレーション の機能を利用します。Web IDフェデレーションを利用し、最終的にはIAMロールを マッピング した一時的な認証 トーク ンを提供します。 方法 ここからは、OIDCを利用し GitHub Actionsから AWS リソースへアクセスする方法について記述します。 今回は、S3へのファイルアップロードを行う GitHub Actionsジョブを作成します。 AWS の各設定は全て GUI から行いました。 IAM OIDC ID プロバイダーを作成する まずは、 AWS 上でOIDC IDプロバイダーを作成します。これは GitHub OIDCプロバイダーの情報を AWS に登録する作業です。 AWS コンソールのIAM、IDプロバイダーの作成からIDプロバイダーを作成します。 OIDC IDプロバイダーの設定情報は以下のドキュメントに載っています。 https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services ドキュメントに則り、OIDC IDプロバイダーの設定情報として以下を入力しました。 プロバイダーのURL: https://token.actions.githubusercontent.com 対象者: sts .amazonaws.com aws-actions/configure-aws-credentials を利用する場合は対象者の項目に sts .amazonaws.comを入力します。 IAM ロールを作成する 次にIAM ロールを作成します。コンソールからIAM、ロール、ロールを作成を選択し、ロールを作成します。 今回はWeb ID フェデレーションの機能を利用するため、信頼されたエンティティの種類にウェブIDを選択します。 IDプロバイダー、Audienceには先ほど作成した、IDプロバイダーの情報を入力します。 アクセス権限はGitHubActionsで実施したい作業に応じて設定します。 今回はS3へのファイルアップロードを実施するため、特定の バケット へのPutObjectを許可するポリシーを持つ、IAMロールを作成しました。 IAMロールを作成した後に信頼関係の修正を行います。特定の GitHub リポジトリ からのみのアクセスに制限する設定を追加します。 この作業は必ず実施してください。 制限を追加しないと、全ての リポジトリ の GitHub Actions上からIAMを利用できてしまいます。 信頼関係を修正するために、作成したIAMロールを選択し、信頼関係のタブから信頼関係の編集を選択します。 エディターが開かれるので、項目を追加します。今回はStatement.Conditionの項目に以下の条件を追加します。 これによって特定の リポジトリ からのみ、IAMを利用できます。 * の部分を詳細に記述し、ブランチの制限を加えることも可能です。 " StringLike ": { " token.actions.githubusercontent.com:sub ": " repo:<リポジトリの所有者>/<リポジトリ名>:* " } 最終的な信頼関係のポリシーは以下になります。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " Federated ": " arn:aws:iam::<AWSのアカウントID>:oidc-provider/token.actions.githubusercontent.com " } , " Action ": " sts:AssumeRoleWithWebIdentity ", " Condition ": { " StringEquals ": { " token.actions.githubusercontent.com:aud ": " sts.amazonaws.com " } , " StringLike ": { " token.actions.githubusercontent.com:sub ": " repo:<リポジトリの所有者>/<リポジトリ名>:* " } } } ] } aws -actions/configure- aws -credentialsに IAMロール作成のCloudFormation Template があります。こちらを利用してIAMロールを作成するのも良いでしょう。 GitHub Actionsから一時的な認証情報を取得する 最後に GitHub Actionsの設定です。 GitHub Actionsの YAML ファイルを記述します。今回は以下の YAML ファイルを作成しました。 name : Upload File on : push jobs : upload : runs-on : ubuntu-latest permissions : id-token : write contents : read steps : - uses : actions/checkout@v2 - uses : aws-actions/configure-aws-credentials@master with : role-to-assume : ${{ secrets.AWS_IAM_ROLE_ARN }} role-session-name : github-actions-sample-session aws-region : ap-northeast-1 - run : aws s3 cp ./test.txt s3://${{ secrets.AWS_S3_BUCKET_NAME }}/ GitHub Actionsのジョブ内でOIDC トーク ンを取得するにはpermissionsのid-tokenの権限をwriteにする必要があります。 IAMロールのARNは リテラル で書くこともできますが、できる限り GitHub ActionsのSecretに記述したほうが良いでしょう。 IAMロールのARNが漏えいし、先程の信頼関係が適切に設定されていないと、不正利用されてしまいます。 また、利用する aws -actions/configure- aws -credentialsのバージョンをv1ではなく、masterにしています。v1のリリースにはOIDCの機能が含まれていないため、masterブランチを指定しないと動作しません。こちらも注意するポイントです。 この設定で、特定のS3 バケット へのファイルアップロードが可能になりました。 まとめ 本記事では GitHub ActionsのOIDC機能を利用し、 GitHub Actionsから AWS リソースへアクセスする方法について記述しました。OIDCを利用することによって、アクセスキーを利用せず AWS リソースにアクセスできるようになりました。 これによってアクセスキーの漏えいのリスクを軽減できます。しかしながら、IAMロールの信頼関係を適切に設定しないと、別の不正利用にも繋がります。慎重に設定しましょう。 最後までお読みいただきありがとうございました。ISID Advent Calendarも楽しみにしていください。 参考にした情報 https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/ https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services https://github.com/aws-actions/configure-aws-credentials/blob/master/README.md 執筆: @miyahara.hikaru 、レビュー: @sato.taichi ( Shodo で執筆されました )
アバター
皆さん、こんにちは。 電通国際情報サービス (以下、ISID)X イノベーション 本部アドバンストテク ノロ ジー 部の宮原です。 本日よりISIDのテックブログが開始されます。そして、本記事はISIDテックブログの記念すべき第一号です。 また、12月からはAdvent Calendarを実施していく予定です。Advent Calendarのリンクは以下にあります。 https://adventar.org/calendars/6576 こちらもぜひ楽しみにしていてください。 さて、第一号の本記事では GitHub Actionsの新機能についてご紹介します。 10/27に GitHub Blogにて以下のアナウンスがありました。 https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/ ブログのタイトルは GitHub Actions: Secure cloud deployments with OpenID Connectとなっています。このアナウンスによって、 OpenID Connectを利用し GitHub Actionsから クラウド リソースにアクセスできるようになりました。 本記事では OpenID Connectを利用し、 GitHub Actionsから AWS リソースへアクセスする方法についてご紹介します。 以下では OpenID ConnectをOIDCと略します。 概要 方法 IAM OIDC ID プロバイダーを作成する IAM ロールを作成する GitHub Actionsから一時的な認証情報を取得する まとめ 参考にした情報 概要 OIDCを利用した クラウド リソースへのアクセスについては以下のドキュメントを参考にすると良いでしょう。 https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect 以下は公式ドキュメントの画像です。 クラウド プロバイダーにてロールと GitHub Actionsジョブ間のOIDCの信頼関係を設定する。 GitHub Actionsのジョブが実行されるたび、 GitHub のOIDCプロバイダーはOIDC トーク ンを自動生成する。 GitHub のOIDCプロバイダーからOIDC トーク ンを取得し、 クラウド プロバイダーに送信する。 クラウド プロバイダーはOIDC トーク ンの検証に成功したら、ジョブ内でのみ有効な、一時的な認証 トーク ンを提供する。 このような流れで一時的な認証 トーク ンを入手し、さらに認証 トーク ンを用いて クラウド リソースにアクセスします。 上記の流れを実現するために、 AWS では、 Web IDフェデレーション の機能を利用します。Web IDフェデレーションを利用し、最終的にはIAMロールを マッピング した一時的な認証 トーク ンを提供します。 方法 ここからは、OIDCを利用し GitHub Actionsから AWS リソースへアクセスする方法について記述します。 今回は、S3へのファイルアップロードを行う GitHub Actionsジョブを作成します。 AWS の各設定は全て GUI から行いました。 IAM OIDC ID プロバイダーを作成する まずは、 AWS 上でOIDC IDプロバイダーを作成します。これは GitHub OIDCプロバイダーの情報を AWS に登録する作業です。 AWS コンソールのIAM、IDプロバイダーの作成からIDプロバイダーを作成します。 OIDC IDプロバイダーの設定情報は以下のドキュメントに載っています。 https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services ドキュメントに則り、OIDC IDプロバイダーの設定情報として以下を入力しました。 プロバイダーのURL: https://token.actions.githubusercontent.com 対象者: sts .amazonaws.com aws-actions/configure-aws-credentials を利用する場合は対象者の項目に sts .amazonaws.comを入力します。 IAM ロールを作成する 次にIAM ロールを作成します。コンソールからIAM、ロール、ロールを作成を選択し、ロールを作成します。 今回はWeb ID フェデレーションの機能を利用するため、信頼されたエンティティの種類にウェブIDを選択します。 IDプロバイダー、Audienceには先ほど作成した、IDプロバイダーの情報を入力します。 アクセス権限はGitHubActionsで実施したい作業に応じて設定します。 今回はS3へのファイルアップロードを実施するため、特定の バケット へのPutObjectを許可するポリシーを持つ、IAMロールを作成しました。 IAMロールを作成した後に信頼関係の修正を行います。特定の GitHub リポジトリ からのみのアクセスに制限する設定を追加します。 この作業は必ず実施してください。 制限を追加しないと、全ての リポジトリ の GitHub Actions上からIAMを利用できてしまいます。 信頼関係を修正するために、作成したIAMロールを選択し、信頼関係のタブから信頼関係の編集を選択します。 エディターが開かれるので、項目を追加します。今回はStatement.Conditionの項目に以下の条件を追加します。 これによって特定の リポジトリ からのみ、IAMを利用できます。 * の部分を詳細に記述し、ブランチの制限を加えることも可能です。 " StringLike ": { " token.actions.githubusercontent.com:sub ": " repo:<リポジトリの所有者>/<リポジトリ名>:* " } 最終的な信頼関係のポリシーは以下になります。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Principal ": { " Federated ": " arn:aws:iam::<AWSのアカウントID>:oidc-provider/token.actions.githubusercontent.com " } , " Action ": " sts:AssumeRoleWithWebIdentity ", " Condition ": { " StringEquals ": { " token.actions.githubusercontent.com:aud ": " sts.amazonaws.com " } , " StringLike ": { " token.actions.githubusercontent.com:sub ": " repo:<リポジトリの所有者>/<リポジトリ名>:* " } } } ] } aws -actions/configure- aws -credentialsに IAMロール作成のCloudFormation Template があります。こちらを利用してIAMロールを作成するのも良いでしょう。 GitHub Actionsから一時的な認証情報を取得する 最後に GitHub Actionsの設定です。 GitHub Actionsの YAML ファイルを記述します。今回は以下の YAML ファイルを作成しました。 name : Upload File on : push jobs : upload : runs-on : ubuntu-latest permissions : id-token : write contents : read steps : - uses : actions/checkout@v2 - uses : aws-actions/configure-aws-credentials@master with : role-to-assume : ${{ secrets.AWS_IAM_ROLE_ARN }} role-session-name : github-actions-sample-session aws-region : ap-northeast-1 - run : aws s3 cp ./test.txt s3://${{ secrets.AWS_S3_BUCKET_NAME }}/ GitHub Actionsのジョブ内でOIDC トーク ンを取得するにはpermissionsのid-tokenの権限をwriteにする必要があります。 IAMロールのARNは リテラル で書くこともできますが、できる限り GitHub ActionsのSecretに記述したほうが良いでしょう。 IAMロールのARNが漏えいし、先程の信頼関係が適切に設定されていないと、不正利用されてしまいます。 また、利用する aws -actions/configure- aws -credentialsのバージョンをv1ではなく、masterにしています。v1のリリースにはOIDCの機能が含まれていないため、masterブランチを指定しないと動作しません。こちらも注意するポイントです。 この設定で、特定のS3 バケット へのファイルアップロードが可能になりました。 まとめ 本記事では GitHub ActionsのOIDC機能を利用し、 GitHub Actionsから AWS リソースへアクセスする方法について記述しました。OIDCを利用することによって、アクセスキーを利用せず AWS リソースにアクセスできるようになりました。 これによってアクセスキーの漏えいのリスクを軽減できます。しかしながら、IAMロールの信頼関係を適切に設定しないと、別の不正利用にも繋がります。慎重に設定しましょう。 最後までお読みいただきありがとうございました。ISID Advent Calendarも楽しみにしていください。 参考にした情報 https://github.blog/changelog/2021-10-27-github-actions-secure-cloud-deployments-with-openid-connect/ https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services https://github.com/aws-actions/configure-aws-credentials/blob/master/README.md 執筆: @miyahara.hikaru 、レビュー: @sato.taichi ( Shodo で執筆されました )
アバター