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

    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サイトを守る

    ヘルプデスク・サポート