株式会社セキュアイノベーション
Menu

セキュリティコラム

  • ネットワーク

公開:2022.10.03 10:00 | 更新: 2022.09.30 02:14

GitHub ActionsにてAWSのセキュリティグループをよりセキュアに穴あけする

GitHub ActionsにてAWSのセキュリティグループをよりセキュアに穴あけするGitHub ActionsにてAWSのセキュリティグループをよりセキュアに穴あけする

はじめに

GitHub ActionsからAWSのEC2インスタンスにsshもしくはscpをしたい場合、通常はIP制限を行っているセキュリティグループの設定を変更する必要があります。

2021年10月27日にGitHub Actions の OpenID Connect (OIDC) サポートが発表されていますが、インターネット上では今もなお、IAMユーザーのアクセスキーとシークレットアクセスキーをsecretsに登録する方法が目立ちます。

GitHub Actions: Secure cloud deployments with OpenID Connect | GitHub Changelog

今回はGitHub ActionsからEC2にデプロイするための一時的なIP制限の穴あけを、OIDCを利用して従来の方法よりセキュアに行います。

AWSの設定

1.ポリシーの作成

実際にGitHub Actionが使用するロールに対するポリシー(権限)を作成します。出来るだけ最小の権限にします。

IAM > ポリシー を表示し、「ポリシーの作成」を選択します。

下記のJSONを反映し作成します。

  1. {
  2.     "Version": "2012-10-17",
  3.     "Statement": [
  4.         {
  5.             "Effect": "Allow",
  6.             "Action": "sts:GetCallerIdentity",
  7.             "Resource": "*"
  8.         },
  9.         {
  10.             "Effect": "Allow",
  11.             "Action": [
  12.                 "ec2:AuthorizeSecurityGroupIngress",
  13.                 "ec2:RevokeSecurityGroupIngress"
  14.             ],
  15.             "Resource": "*"
  16.         }
  17.     ]
  18. }

2.IDプロバイダの設定

GitHubのOIDCを登録しGitHub ActionがAWSに対して認証できるようにします。

IAM > ID プロバイダを表示し「プロバイダを追加」を選択します。

プロバイダのタイプで「OpenID Connect」を選択し、プロバイダのURLに「https://token.actions.githubusercontent.com」を入力します。
続いて「サムプリントを取得」を選択します。

対象者に「sts.amazonaws.com」を入力し「プロバイダを追加」を選択します。

3.Roleの設定

IAM > ロール > ロールを作成を選択します。

信頼されたエンティティタイプに「ウェブアイデンティティ」を選択し、アイデンティティプロバイダーに先ほど作成した「token.actions.githubusercontent.com」を選択します。

Audienceには「sts.amazonaws.com」を選択します。

許可ポリシーに「1. ポリシーの作成」で作成したポリシーをアタッチしロールを作成します。

作成したポリシーを編集します。

IAM > ロール > 作成したロールを選択、「信頼関係」タブを選択し「信頼ポリシーを編集」を選択します。

下記のようにポリシーを更新します。Condition以下を更新します。

"arn:aws:iam::<アカウントID>:oidc-provider/token.actions.githubusercontent.com""repo:Secureiv/ActionsTest:*"それぞれの環境に変更してください。

  1. {
  2.     "Version": "2012-10-17",
  3.     "Statement": [
  4.         {
  5.             "Effect": "Allow",
  6.             "Principal": {
  7.                 "Federated": "arn:aws:iam::<アカウントID>:oidc-provider/token.actions.githubusercontent.com"
  8.             },
  9.             "Action": "sts:AssumeRoleWithWebIdentity",
  10.             "Condition": {
  11.                 "StringLike": {
  12.                     "token.actions.githubusercontent.com:sub": "repo:Secureiv/ActionsTest:*"
  13.                 }
  14.             }
  15.         }
  16.     ]
  17. }

GitHubの設定

1.Secretの設定

GitHub Actionsが秘密情報を扱えるようにSecretを設定していきます。

settings > Secrets > Actionsを表示します。

下記を追加します。

  • EC2_ROLE_ARN:ロールの作成で作成したロールのARN
  • EC2_SECURITY_GROUP_ID:穴をあけたいセキュリティグループのグループID

2.Actionの設定

固有名詞は入れていないためそのままでも動くはずですが適宜編集してお使いください。
※ssh用にportを22としています。

  1. # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
  2. # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
  3. name: CI/CD on Push
  4. on:
  5.   workflow_dispatch:
  6.   push:
  7.      branches: [master]
  8. jobs:
  9.   build:
  10.     runs-on: ubuntu-latest
  11.     permissions:
  12.       id-token: write # AWSとのやり取りでIDの取得等に必要
  13.       contents: read # リポジトリの取得に必要
  14.     steps:
  15.     # IPの取得
  16.     - name: Public IP
  17.       id: ip
  18.       uses: haythem/public-ip@v1.2
  19.     # AWS認証
  20.     - name: Configure AWS Credentials
  21.       uses: aws-actions/configure-aws-credentials@v1
  22.       with:
  23.         aws-region: ap-northeast-1
  24.         role-to-assume: ${{ secrets.EC2_ROLE_ARN }}
  25.         role-session-name: github-actions-deploy-${{ github.event.repository.name }}-${{ github.run_number }}
  26.     # EC2にDeploy
  27.     - name: Deploy to EC2
  28.       run: |
  29.         # セキュリティグループにIPを追加する(セキュリティグループに穴をあける)
  30.         aws ec2 authorize-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
  31.         # デプロイのための作業を記述
  32.     # 追加したIPをセキュリティグループから除外する(セキュリティグループにあけた穴をふさぐ)
  33.     - name: Revoke security group
  34.       if: always()
  35.       run: |
  36.         aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

おわりに

以上になります。
IAMユーザーの作成やアクセスキーやシークレットアクセスキーをGitHub側に登録することなくAWSの操作を行うことができるようになりました。

少しずつでもよりセキュアにしていくことでインシデントを未然に防ぐことに繋がると思います。

既存の処理を変更していくことは難儀なことですが、日々アップデートされていく開発を取り巻く環境にも注視していきたいところです。

関連ブログ
 AWS初心者ができるアクセスキー不正利用軽減策

最新のコラム記事

LOADING...

セキュアイノベーション サービス一覧

ネットワーク・サーバー

Webサイトを守る