このCI/CD環境の課題
以前の記事でシンプルなCI/CD環境を構築しました。しかし、この仕組みには課題があります。
それはAWSの認証です。
具体的には下記の部分となります。
この記事の設定ではIAMユーザの権限を特定のセキュリティグループのみの変更に絞っていますが、同じシークレットキーを長期間使用することになります。これはリスクとなります。
OICDを使うメリット
GitHub では OpenID Connect (OIDC) がサポートされています。
OIDC を使用することにより、長期間有効なシークレットキーを用意することなく AWS 認証を行うことができます。
OIDCを使用すると、Github Actionsの特定のジョブだけ使用できる短期間のアクセストークンが使用されます。もし万が一、トークンが漏れてもリスクとなりません。
導入
流れ
- Github ActionsのIDプロバイダを作成する
- IAM ロールを作成する
- 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/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環境から認証情報リスクを減らすということをやりました。こういったセキュリティの観点からレビューしてアーキテクチャを変更することも大事だと思っています。