[レポート] 「CircleCI で OIDC を使って上手に自動化/失敗させる」で認証情報を持たない AWS 連携を #devio2022

CircleCIはAWSとの間でOpenID Connect(OIDC)により連携させることで、Gitリポジトリにコミットしたユーザーに応じて権限をコントロールしつつデプロイするなど柔軟に行うことが可能です。DevelopersIO 2022にて公開されたセッションをレポートします。
2022.08.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS をデプロイ先として CI/CD を組む際の困りごとのひとつとして、認証情報、つまり AWS のアクセスキー/シークレットキーなどをどう持つかという問題がひとつあるかなと思います。
先月行われたクラスメソッド主催イベント「DevelopersIO 2022」にて、CircleCI による OIDC(OpenID Connect)による解決方法を説明するセッションがありましたのでレポートします。

なお DevelopersIO 2022 の他のセッションは以下からアクセスください。
弊社パートナー企業の方々に登壇頂いたセッションについては、こちらのまとめ記事もご参照下さい。

スピーカー

内容

  • 0:37 アジェンダ
  • 1:20 CI/CD とシークレットとの関係
    • 特に AWS などクラウドと連携する際の話
  • 3:06 AWS シークレットを保持しない〜OIDC
  • 5:22 ID Provider - Project - Role - Policy
  • 12:10 おわりに

CI/CD とシークレットとの関係

  • そもそも CI/CD ツールとは
    • Git リポジトリに Push されたことで CircleCI へ Webhook が送られて、
    • CircleCI がビルド、そのあと AWS へデプロイされる

  • 要点:
    • Git へ push したユーザーが AWS へデプロイするわけではない
    • AWS へは CI/CD ツールが保持しているアカウントを使う
  • (前提として)CircleCI では環境変数として保持可能
    • プロジェクト単位 or 組織内で共有可能なコンテキスト
    • HashiCorp Vault で暗号化
    • 更新やローテーションは API や UI から実施
  • (とはいえ、可能ではあるが)そもそも保持したくない

AWS シークレットを保持しない〜OIDC

  • なぜ?
    • 1: そもそも置きたくない(置くのであれば定期的にローテーションしたい)
      • 漏洩リスクに対処
    • 2: 権限を使い回したくない
      • 本来、複数の開発者がいれば権限はそれぞれ異なる
      • コミットしたユーザーによって処理を振り分けたい
    • 例)
      • 特定の開発者だけが公開できるようにした
      • 開発者はプレビューのみ、公開しようとすると権限不足エラーにしたい
  • CircleCI で OIDC(OpenID Connect)がサポート
    • 2022 年 3 月
    • 当初のリリース予定からずれ込んだ
    • Orb でも対応
    • 上述の問題を解決出来る!

ID Provider - Project - Role - Policy

  • 1: 信頼関係を構築
  • 2: JWT を付与
    • JWT = JSON Web Token
    • プロジェクト ID
    • ユーザー ID
      • ユーザー ID によって許可する操作が異なる
  • 4: JWT のクレーム内容に基づき認可
    • AWS 上のロールの話
      • deploy用とpreview用の 2 つのロールを用意
      • ID プロバイダには前述(1:)の ARN を指定
    • 信頼ポリシー
      • deployは特定のユーザー ID のリクエストからのみ実行可能

  • 5: JWT のクレーム内容に基づくポリシー付与
    • deploy用とpreview
    • それぞれ別の S3 バケットを用意し権限付与
  • CircleCI のコンフィグレーション
    • ワークフロー
      • deploypreviewの 2 つのジョブを記述(YAML)
        • Git のブランチ名を指定
    • ジョブ
      • deploypreview
      • それぞれの IAM ロールの ARN を付与
    • つまり
      • ジョブの実行には、ARN のロール付与の条件に合致したユーザーからのリクエストである必要がある
      • deploy権限のないユーザのpreviewは成功、deployは失敗

まとめ : CircleCI と AWS が OIDC 認証でできること

  • CircleCI には無償プランあり
  • あなたの言いなりになって実行してくれる CircleCI をご活用ください(原文ママ

所感とまとめ

今年の 3 月にリリースされた CircleCI の OIDC 機能について、15 分ほどでコンパクトに説明頂きました。

CI/CD 環境に限らず、AWS の認証情報は扱いに慎重さが求められます。幸い最近はこの例のように、より安全に AWS との連携・インテグレーションを行う機能が充実してきていますので、高くアンテナを張りつつ本来不要なトラブルを未然に回避出来る構成にアップデートしていきたいですね!