GitHub Actions for Azure の認証オプションを検出する

完了

GitHub Actions for Azure が Microsoft Entra テナントによってセキュリティで保護されたリソースにアクセスするには、セキュリティ プリンシパルによる表現が必要です。 この要件は、ユーザー (ユーザー プリンシパル) とアプリケーション (サービス プリンシパル) の両方に当てはまります。

セキュリティ プリンシパルは、その Microsoft Entra テナント内のユーザー/アプリケーションのアクセス ポリシーとアクセス許可を定義します。 これにより、サインイン時のユーザー/アプリケーションの認証、リソースへのアクセス時の承認などのコア機能を利用できるようになります。

サービス プリンシパルには、次の 3 種類があります。

  • アプリケーション - この種類のサービス プリンシパルは、単一のテナントまたはディレクトリ内のグローバル アプリケーション オブジェクトのローカル表現、つまりアプリケーション インスタンスです。 アプリケーションを登録すると、サービス プリンシパルが自動的に作成されます。 Azure PowerShell、Azure CLI、Microsoft Graph、およびその他のツールを使用して、テナントにサービス プリンシパル オブジェクトを作成することもできます。

  • マネージド ID - マネージド ID は、Microsoft Entra 認証をサポートするリソースに接続する際に使用するアプリケーションの ID を提供します。 マネージド ID が有効になっている場合、そのマネージド ID を表すサービス プリンシパルがテナントに作成されます。 マネージド ID を表すサービス プリンシパルには、権利やアクセス許可を付与できますが、直接更新したり変更を加えたりすることはできません。

  • レガシ - この種類のサービス プリンシパルは、レガシ アプリを表します。これは、アプリの登録前に作成されたアプリ、またはレガシ エクスペリエンスを使用して作成されたアプリです。 レガシ サービス プリンシパルには、資格情報、サービス プリンシパル名など、許可されているユーザーが編集できるプロパティを含めることができます。 ただし、関連付けられたアプリ登録は含まれません。 このサービス プリンシパルは、その作成元のテナントでのみ使用できます。

また、必要なロールを割り当てることで、セキュリティ プリンシパルに Azure 内のリソースへの適切なアクセスを付与する必要があります。 このユニットでは、GitHub ワークフローから Azure にサインインする次の方法について説明します:

  • OpenID Connect (証明書ベース) を使用したサインイン。
  • サービス プリンシパルとシークレットを使用したサインイン。 注: 証明書ベースの認証と比較してシークレットはセキュリティ侵害されやすいため、この方法は非推奨です。

サービス プリンシパルは、Azure portal、Azure CLI、または Azure PowerShell を使用して作成できます。

OpenID Connect を使用したサインイン

次の例では、サービス プリンシパルを作成し、Azure portal で OpenID Connect 用に構成する方法を示します。 これらの例には、スコープ付きロールの構成、GitHub へのシークレットの追加、Azure ログイン アクションでのシークレットの使用などがあります。

サービス プリンシパルの作成

  1. Azure portal で、Microsoft Entra ID を検索してサービスに移動します。

  2. 左側のナビゲーション ウィンドウで、[管理] グループにある [アプリの登録] を選択します。

  3. メイン パネルで [+ 新規登録] を選択して名前を入力し、[登録] を選択します。

    Note

    GitHub に追加されるシークレットには、ページの [Essentials] セクションにアプリケーション (クライアント) IDディレクトリ (テナント) ID の値が必要です。 サブスクリプション ID も必要になります。

  4. 左側のナビゲーション ウィンドウで、[管理] グループの [証明書とシークレット] を選択し、メインウィンドウで [フェデレーション資格情報] を選択します。

  5. [資格情報の追加] を選択し、表示されるドロップダウンで [Azure リソースをデプロイする GitHub Actions] を選択します。

  6. GitHub アカウントに関する情報を要求するフォームが表示されます。 リポジトリにある特定のブランチへのアクションを制限するかどうかを選択するフィールドを、次の表に示します。 注: これらのフィールドは大文字と小文字が区別されます。

    フィールド アクション
    組織 ユーザーまたは組織名を入力します。
    リポジトリ リポジトリの名前を入力します。
    エンティティ型 [ブランチ] を選択します。
    GitHub ブランチ名 main、またはデプロイを表すブランチの名前を入力します。
  7. [資格情報の詳細] セクションで、資格情報に名前を付けて [追加] を選択します。

ロールの割り当て

Azure アカウントにあるリソースにアクセスするためのアクセス許可をサービス プリンシパルに付与するには、サービス プリンシパルにロールを割り当てる必要があります。 次の Azure CLI の例では、アプリケーションを含むリソース グループをスコープとする共同作成者ロールを割り当てます。

az role assignment create --assignee <service-principal-id> \
  --role contributor \
  --scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group}

OpenID Connect シークレットを GitHub に追加する

  1. GitHub で、お使いのリポジトリに移動します。

  2. ナビゲーション メニューで [設定] に移動します。

  3. [Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。

    [アクション] メニュー項目の選択のスクリーンショット。

  4. [New repository secret](新しいリポジトリ シークレット) を選択します。

  5. 次の表に示されているシークレットを追加します。

    Name Secret
    AZURE_CLIENT_ID アプリケーション (クライアント) ID を入力します。
    AZURE_TENANT_ID ディレクトリ (テナント) ID を入力します。
    AZURE_SUBSCRIPTION_ID サブスクリプション ID を入力します。 az account show コマンドを使用して ID を取得できます。

Azure Login アクションを使用する

次のワークフローの例では、Azure ログイン アクションを使用して、OpenID Connect の詳細が格納されている GitHub で認証を行います。

on: [push]

name: AzureLoginSample

permissions:
  id-token: write # Requires write permission to fetch a token.
  contents: read  # This is required for actions/checkout

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      #Login in your azure subscription using OpenID Connect (credentials stored as GitHub secrets in repo)
      - name: Azure Login
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

サービス プリンシパルとシークレットを使用したサインイン

次の例では、サービス プリンシパルを作成し、スコープ付きロールに構成する方法を示します。 また、プリンシパルを GitHub シークレットとして追加し、そのシークレットを Azure ログイン アクションで使用する方法についても示します。

サービス プリンシパルの作成

次の Azure CLI コマンドは、サービス プリンシパルを作成し、アプリケーションを含むリソース グループをスコープとする共同作成者ロールを割り当てます。

az ad sp create-for-rbac --name "myApp" --role contributor \
    --scopes /subscriptions/{subscription-id}/resourceGroups/{resource-group} \ 
    --json-auth

このコマンドは、サービス プリンシパルの JSON オブジェクトを生成します。 この出力は、GitHub リポジトリに追加するシークレットです。 後で取得できない情報は、必ずコピーしてください。

{
    "clientId": "<GUID>",
    "clientSecret": "<secret>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
}

GitHub シークレットとしてサービス プリンシパルを追加する

次の手順では、Azure での認証に使用できる AZURE_CREDENTIALS という名前のシークレットを作成する方法を示します。

  1. GitHub で、お使いのリポジトリに移動します。

  2. ナビゲーション メニューで [設定] に移動します。

  3. [Security] (セキュリティ) > [Secrets and variables] (シークレットと変数) > [Actions] (アクション) を選びます。

    [アクション] メニュー項目の選択のスクリーンショット。

  4. [New repository secret](新しいリポジトリ シークレット) を選択します。

  5. Azure CLI コマンドからの JSON 出力全体をシークレットの値フィールドに貼り付けます。 シークレット名 AZURE_CREDENTIALS を指定します。

[Add secret](シークレットの追加) を選択します。

Azure Login アクションを使用する

次のワークフロー例では、Azure Login アクションを使用して、サービス プリンシパルの詳細が格納されている secrets.AZURE_CREDENTIALS で認証を行います。

on: [push]

name: AzureLoginSample

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Log in with Azure
        uses: azure/login@v2
        with:
          creds: '${{ secrets.AZURE_CREDENTIALS }}'