公開:2022.10.03 10:00 | 更新: 2022.09.30 02:14
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を利用して従来の方法よりセキュアに行います。
実際にGitHub Actionが使用するロールに対するポリシー(権限)を作成します。出来るだけ最小の権限にします。
IAM > ポリシー を表示し、「ポリシーの作成」を選択します。
下記のJSONを反映し作成します。
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Action": "sts:GetCallerIdentity",
- "Resource": "*"
- },
- {
- "Effect": "Allow",
- "Action": [
- "ec2:AuthorizeSecurityGroupIngress",
- "ec2:RevokeSecurityGroupIngress"
- ],
- "Resource": "*"
- }
- ]
- }
GitHubのOIDCを登録しGitHub ActionがAWSに対して認証できるようにします。
IAM > ID プロバイダを表示し「プロバイダを追加」を選択します。
プロバイダのタイプで「OpenID Connect」を選択し、プロバイダのURLに「https://token.actions.githubusercontent.com」を入力します。
続いて「サムプリントを取得」を選択します。
対象者に「sts.amazonaws.com」を入力し「プロバイダを追加」を選択します。
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:*"
はそれぞれの環境に変更してください。
- {
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Principal": {
- "Federated": "arn:aws:iam::<アカウントID>:oidc-provider/token.actions.githubusercontent.com"
- },
- "Action": "sts:AssumeRoleWithWebIdentity",
- "Condition": {
- "StringLike": {
- "token.actions.githubusercontent.com:sub": "repo:Secureiv/ActionsTest:*"
- }
- }
- }
- ]
- }
GitHub Actionsが秘密情報を扱えるようにSecretを設定していきます。
settings > Secrets > Actionsを表示します。
下記を追加します。
固有名詞は入れていないためそのままでも動くはずですが適宜編集してお使いください。
※ssh用にportを22としています。
- # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
- # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
- name: CI/CD on Push
- on:
- workflow_dispatch:
- push:
- branches: [master]
- jobs:
- build:
- runs-on: ubuntu-latest
- permissions:
- id-token: write # AWSとのやり取りでIDの取得等に必要
- contents: read # リポジトリの取得に必要
- steps:
- # IPの取得
- - name: Public IP
- id: ip
- uses: haythem/public-ip@v1.2
- # AWS認証
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-region: ap-northeast-1
- role-to-assume: ${{ secrets.EC2_ROLE_ARN }}
- role-session-name: github-actions-deploy-${{ github.event.repository.name }}-${{ github.run_number }}
- # EC2にDeploy
- - name: Deploy to EC2
- run: |
- # セキュリティグループにIPを追加する(セキュリティグループに穴をあける)
- aws ec2 authorize-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
- # デプロイのための作業を記述
- # 追加したIPをセキュリティグループから除外する(セキュリティグループにあけた穴をふさぐ)
- - name: Revoke security group
- if: always()
- run: |
- 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...