このCI/CD環境の課題

以前の記事でシンプルなCI/CD環境を構築しました。しかし、この仕組みには課題があります。

それはAWSの認証です。

具体的には下記の部分となります。

この記事の設定ではIAMユーザの権限を特定のセキュリティグループのみの変更に絞っていますが、同じシークレットキーを長期間使用することになります。これはリスクとなります。

OICDを使うメリット

GitHub では OpenID Connect (OIDC) がサポートされています。

OIDC を使用することにより、長期間有効なシークレットキーを用意することなく AWS 認証を行うことができます。

OIDCを使用すると、Github Actionsの特定のジョブだけ使用できる短期間のアクセストークンが使用されます。もし万が一、トークンが漏れてもリスクとなりません。

[blogcard url=”https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect”]

導入

流れ

  1. Github ActionsのIDプロバイダを作成する
  2. IAM ロールを作成する
  3. GitHub Actions のワークフローを変更する

1. Github ActionsのIDプロバイダを作成する

IAM コンソールから ID プロバイダ → プロバイダを追加 をクリックします

IDプロバイダの設定画面で下記を入力して プロバイダの URL の サムプリントを取得 をクリックした後、 プロバイダを追加 をクリックします。

プロバイダのタイプ : OpenID Connect
プロバイダのURL : <https://token.actions.githubusercontent.com>
                入力後に サムプリントを取得 をクリック
対象者 : sts.amazonaws.com

これで GitHub Actions の ID プロバイダが作成されます。

2. IAM ロールを作成する

GitHub Actions で使用する IAM ロールを作成します。

IAM コンソールから ロール → ロールを作成 をクリックします。

カスタム信頼ポリシーを設定

設定項目
信頼されたエンティティタイプカスタム信頼ポリシー
カスタム信頼ポリシー以下を設定する

特定のGithubアカウントの特定のリポジトリだけ認証を許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "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:[githubアカウント]/[リポジトリ]:*"
                },
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

IAM ロールにポリシーを付与します。

ポリシーは以前から使用していたポリシーを使用します。

作成する場合は、以前の記事 を参考に作成してください。

3. GitHub Actions のワークフローを変更する

ワークフローのyamlファイルを変更します。変更点はAWSの箇所を削除して、OIDCの認証を追加します。

name: EC2 deploy

on:
  workflow_dispatch:

jobs:
 build:
   runs-on: ubuntu-latest
   permissions:
      id-token: write
      contents: read
   steps:

     # IP取得ライブラリをインストール
     - name: Public IP Install
       id: ip
       uses: haythem/public-ip@v1.2

     # BranchをCheckout
     - name: Checkout
       uses: actions/checkout@v2

     # OIDCでのAWS認証
     - name: AWS OIDC
       uses: aws-actions/configure-aws-credentials@v1
       with:
          aws-region: 'ap-northeast-1'
          role-to-assume: ${{ secrets.DEPLOY_IAM_ARN }}

     # デプロイする
     - name: Deploy
       run: |

         # SSHのセキュリティグループを開放する
         aws ec2 authorize-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

         # SSH接続して、git pullする
         echo "${{ secrets.GIT_PRIVATE_KEY }}" > private_key
         chmod 600 private_key
         ssh -o StrictHostKeyChecking=no ${{ secrets.EC2_USER_NAME }}@${{ secrets.EC2_HOST_NAME }} -i private_key "cd /home/ubuntu/blog.12sec.work/ && git fetch --prune && git checkout main && git pull origin main"

         # SSHのセキュリティグループを閉じる
         aws ec2 revoke-security-group-ingress --group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

上記のファイルでは ${{ secrets.DEPLOY_IAM_ARN }} として変数の値をGithub secretsに記載しています。しかし、IAMロールのARNを直接記載しても動きます。その場合はこのようになります。

     # OIDCでのAWS認証
     - name: AWS OIDC
       uses: aws-actions/configure-aws-credentials@v1
       with:
          aws-region: 'ap-northeast-1'
          role-to-assume: [IAM Role ARN]

テスト

Github Actions を動かしてテストします。テストが通れば完了です。

まとめ

今回はGitHub Actions で OIDC を使用することでCI/CD環境から認証情報リスクを減らすということをやりました。こういったセキュリティの観点からレビューしてアーキテクチャを変更することも大事だと思っています。