この記事では、Azure へのアクセスに Open ID Connect(OIDC)を使用することによって、CircleCI側で静的なシークレットを保持することなくAzureへのセキュアなアクセスを実現する方法について紹介します。

はじめに

CircleCIのジョブでは Open ID Connect(OIDC) の IDトークンが利用可能になっています。

これを使うことによって、CircleCIに静的なシークレットを保持することなく、AWS、Google Cloud Platform、Vault などのクラウドプロバイダーへのアクセスをセキュアに実現することができます。

今回は、Azure へのアクセスに Open ID Connect(OIDC)を使用することによって、Azureへのセキュアなアクセスを実現する方法について紹介します。

Azure Active Directory のアプリケーションおよびサービスプリンシパルを作成する

今回は既存アプリケーションがない前提で、新しく Azue Active Directory のアプリケーションとサービスプリンシパルを作成します。

作成したアプリケーションの

  • アプリケーション(クライアント)ID
  • ディレクトリ(テナント)ID

は CircleCI ワークフローで使用するため、値をコピーしておきます。

circleciワークフロー参考画像

次に「アクセス制御(IAM)」からこのアプリケーションに対してロールを割り当てます。

今回は「閲覧者」のみのロールを割り当てます。

ロールの割り当て追加方法

フェデレーション資格情報を追加する

次は、上記で作成した Azure Active Directory アプリケーションを Open ID Connect(OIDC) で利用できるようにするために、フェデレーション資格情報を追加していきます。

アプリケーションの「証明書とシークレット」→「フェデレーション資格情報」→「資格情報の追加」に進みます。

資格情報の追加方法

「フェデレーション資格情報のシナリオ」では「その他の発行者」を選択します。 その他の発行者

以下必須な項目を入力し、フェデレーション資格情報を追加します。

  • 発行者:https://oidc.circleci.com/org/<organization_id>

organization_id は CircleCI の「Organization Settings」から確認することができます。

CircleCIのOrganization settings

サブジェクト認識子:org/<organization_id>/project/<project_id>/user/<user_id>

project_id は今回利用する CircleCI プロジェクトの「Project Settings」から確認することができます。

CircleCI プロジェクトID

user_id はご自身の 「User Settings」から確認することができます。

user_id

  • 名前:任意の値を入力します。

  • 対象ユーザー:<organization_id>

CircleCI コンテキストを作成する

次に作成する CircleCI ワークフローには Azure Active Directory アプリケーションのアプリケーション(クライアント)ID、ディレクトリ(テナント)IDを指定する必要があります。

これらの値は CircleCI のコンテキストとして値を保存する方がより安全なオプションです。

コンテキストの使用

今回は新しく ”oidc-azure” というコンテキストを作成し、Environment Variables に以下の値を追加します。

  • AZURE_CLIENT_ID:Azure Active Directory アプリケーションのアプリケーション(クライアント)ID
  • AZURE_TENANT_ID:Azure Active Directory アプリケーションのディレクトリ(テナント)ID

oidc-azure

CircleCI ワークフローを作成する

CircleCI の設定ファイル(.circleci/config.yml)を作成していきます。

CircleCI の設定ファイルの作成

実行環境は、CircleCIが用意している Azure CLI がインストールされた Docker イメージ(cimg/azure)を利用しています。

Azure へのログイン(az login)では、まず “–-service-principal” オプションによって、Azure Active Directory のサービスプリンシパルを使ってログインするようにします。

そして、先ほど“oidc-azure” コンテクストに保存した

  • AZURE_CLIENT_ID:Azure Active Directory アプリケーションのアプリケーション(クライアント)ID
  • AZURE_TENANT_ID:Azure Active Directory アプリケーションのディレクトリ(テナント)ID を指定します。

最後に、OpenID Connect(OIDC)トークンを与える “–-federated-token” オプションCircleCI ジョブが提供する トークンであるCIRCLECI_OIDC_TOKENを指定します。

az login 実行後には、「閲覧者」ロールを使った az vm list コマンドを実行しています。

ワークフローを実行すると、OIDC を用いた az login コマンドが成功し、az vm list コマンドの実行が成功していることが確認できました。

az-login-command

おわりに

この記事では、Azure へのアクセスに Open ID Connect(OIDC)を使用することによって、CircleCI側でシークレットを保持することなくAzureへのセキュアなアクセスを実現する方法について紹介しました。

CircleCI では Open ID Connect のサポートをはじめ、マルチクラウドへの連携・デプロイを充実させています。

既存のCircleCIワークフローの改善や、新しいCI/CDパイプライン導入の際にぜひご活用ください。