セキュリティで保護されたパイプライン用にエージェントとエージェント プールを構成する

このラボでは、Azure DevOps エージェントとエージェント プールを構成し、それらのプールのアクセス許可を管理する方法について学習します。 Azure DevOps エージェント プールには、ビルドおよびリリース パイプラインを実行するためのリソースが用意されています。

この演習には、約 25 分かかります。

開始する前に

ラボの演習を行うには、Azure サブスクリプション、Azure DevOps 組織、eShopOnWeb アプリケーションが必要です。

手順

エージェントを作成し、Windows を使用してセルフホステッド エージェントを構成します。 Linux または macOS でエージェントを構成する場合は、Azure DevOps ドキュメントの手順を行います。

構成時は、次の点に注意してください。

  • プロジェクトごとに個別のエージェントを維持する: 各エージェントは、1 つのプールにのみ関連付けることができます。 プロジェクト間でエージェント プールを共有すると、インフラストラクチャ コストを節約できますが、横移動のリスクも生じます。 そのため、相互感染を防ぐために、プロジェクトごとに専用エージェントを含む個別のエージェント プールを用意することをお勧めしています。
  • 特権の低いアカウントを使用してエージェントを実行する: Azure DevOps リソースに直接アクセスできる ID でエージェントを実行すると、セキュリティ上の脅威が発生する可能性があります。 Network Service などの特権のないローカル アカウントでエージェントを操作することをお勧めします。これにより、リスクが最小限に抑えられます。
  • 誤解を招くグループ名に注意する: Azure DevOps の「プロジェクト コレクション サービス アカウント」グループは潜在的なセキュリティ リスクがあります。 このグループの一部であり、Azure AD によってサポートされている ID を使用してエージェントを実行すると、Azure DevOps 組織全体のセキュリティが危険にさらされる可能性があります。
  • セルフホステッド エージェントに高い特権のアカウントを使用しないようにする: 高い特権のアカウントを使用してセルフホステッド エージェントを実行すると、特にシークレットや運用環境にアクセスする場合、パイプラインが侵害されたときにシステムが重大な脅威にさらされる可能性があります。
  • セキュリティに優先順位を付ける: システムを保護するには、最小限の特権アカウントを使用してセルフホステッド エージェントを実行します。 たとえば、お使いのマシンのアカウントやマネージド サービス ID を使用してください。 また、Azure Pipelines がシークレットと環境へのアクセスを処理できるようにすることもお勧めします。

演習 1: エージェントを作成し、エージェント プールを構成する

この演習では、Azure 仮想マシン (VM) を作成し、それを使ってエージェントを作成し、エージェント プールを構成します。

タスク 1:Azure VM を作成して接続する

  1. ブラウザーで Azure Portal (https://portal.azure.com) を開きます。 プロンプトが表示されたら、Azure サブスクリプションの所有者ロールを持つアカウントを使ってサインインします。

  2. [リソース、サービス、ドキュメントの検索 (G+/)] ボックスに「Virtual Machines」と入力し、ドロップダウン リストからそれを選びます。

  3. [作成] ボタンを選択します。

  4. [構成が事前設定された Azure 仮想マシン] を選びます。

    構成が事前設定された仮想マシンの作成のスクリーンショット。

  5. ワークロード環境として [Dev/Test] を選び、ワークロードの種類として [汎用] を選びます。

  6. [VM の作成を続行する] ボタンを選び、[基本] タブで次の操作を実行し、[管理] を選びます。

    設定 アクション
    [サブスクリプション] ドロップダウン リスト Azure サブスクリプションを選択します。
    [リソース グループ] セクション rg-eshoponweb-agentpool という名前の新しいリソース グループを作成します。
    [仮想マシン名] テキスト ボックス 任意の名前を入力します (たとえば、eshoponweb-vm)。
    [リージョン] ドロップダウン リスト 最も近い azure リージョンを選択できます。 たとえば、”eastus”、”eastasia”、”westus” などです。
    [可用性のオプション] ドロップダウン リスト [インフラストラクチャ冗長は必要ありません] を選択します。
    [セキュリティの種類] ドロップダウン リスト [トラステッド起動の仮想マシン] オプションを選びます。
    [イメージ] ドロップダウン リスト Windows Server 2022 Datacenter: Azure Edition - x64 Gen2 イメージを選びます。
    [サイズ] ドロップダウン リスト テスト目的の場合は最も安価な [Standard] サイズを選びます。
    [ユーザー名] テキスト ボックス 任意のユーザー名を入力します
    [パスワード] テキスト ボックス 任意のパスワードを入力します
    [パブリック受信ポート] セクション [選択したポートを許可する] を選択します。
    [受信ポートを選択] ドロップダウン リスト [RDP (3389)] を選択します。
  7. [管理] タブの [ID] セクションで、[システム割り当てマネージド ID の有効化] チェックボックスをオンにし、[確認および作成] を選びます。

  8. [確認および作成] タブで、 [作成] を選択します。

    :プロビジョニング プロセスが完了するまで待ちます。 これには 2 分ほどかかります。

  9. Azure portal で、新しく作成された Azure VM の構成が表示されるページに移動します。

  10. Azure VM ページで、[接続] を選択し、ドロップダウン メニューで、[接続] を選択し、次に [RDP ファイルのダウンロード] を選択します。

  11. ダウンロードした RDP ファイルを使用して、Azure VM で実行されているオペレーティング システムへのリモート デスクトップ セッションを確立します。

タスク 2:エージェント プールを作成する

  1. Azure VM へのリモート デスクトップ セッションで、Microsoft Edge Web ブラウザーを起動します。

  2. Web ブラウザーで Azure DevOps ポータル (https://aex.dev.azure.com) に移動し、サインインして組織にアクセスします。

    : 初めて Azure DevOps ポータルにアクセスする場合は、プロファイルの作成が必要になる場合があります。

  3. eShopOnWeb プロジェクトを開き、左側の下部メニューから [プロジェクトの設定] を選びます。

  4. [パイプライン] > [エージェント プール] で、[プールの追加] を選びます。

  5. プールのタイプとして [セルフホステッド] を選びます。

  6. エージェント プールの名前 (eShopOnWebSelfPool など) を指定し、オプションの説明を追加します。

  7. [すべてのパイプラインにアクセス権を付与する] オプションをオフにします。

    セルフホステッド タイプのエージェント プールの追加オプションを示すスクリーンショット。

    : 運用環境では、すべてのパイプラインにアクセス許可を付与することは推奨されません。 このラボでは、パイプラインの構成を簡略化するためにのみ使用されます。

  8. [作成] を選び、エージェント プールを作成します。

タスク 3:エージェントのインストール ファイルをダウンロードして展開する

  1. Azure DevOps ポータルで、新しく作成したエージェント プールを選び、[エージェント] タブを選びます。

  2. [新しいエージェント] を選び、新しいポップアップ ウィンドウの [エージェントのダウンロード] から [ダウンロード] を選びます。

    : インストール手順に従ってエージェントをインストールし、ファイル名にあるダウンロードしたバージョンをメモしてください (例: vsts-agent-win-x64-3.246.0.zip)

  3. PowerShell セッションを開始し、次のコマンドを実行して agent というフォルダーを作成します。

    mkdir agent ; cd agent        
    

    : エージェントをインストールするフォルダー (C:\agent など) を開いていることを確認します。

  4. 次のコマンドを実行し、ダウンロードしたエージェント インストーラー ファイルの内容を抽出します。

    Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("$HOME\Downloads\vsts-agent-win-x64-3.246.0.zip", "$PWD")
    

    : エージェントを別の場所にダウンロードした場合 (またはダウンロードしたバージョンが異なる場合) は、上記のコマンドを適宜調整してください。

タスク 4:PAT トークンを作成する

: エージェントを構成する前に、PAT トークンを作成する必要があります (既存のものがない場合)。 PAT トークンを作成するには、以下の手順を実行します。

  1. Azure VM へのリモート デスクトップ セッション内で、別のブラウザー画面を開き、https://aex.dev.azure.com の Azure DevOps ポータルに移動して、組織とプロジェクトにアクセスします。

  2. 右側の上部メニュー (ユーザーのアバター アイコンのすぐ左) から [ユーザー設定] を選びます。

  3. [個人用アクセス トークン] メニュー項目を選びます。

    [個人用アクセス トークン] メニューを示すスクリーンショット。

  4. [新しいトークン] を選びます。

  5. トークンの名前を指定します (eShopOnWebToken など)。

  6. トークンを使う Azure DevOps 組織を選びます。

  7. トークンの有効期限を設定します (エージェントの構成にのみ使用されます)。

  8. カスタム定義されたスコープを選択します。

  9. すべてのスコープを表示する場合に選択します。

  10. エージェント プール (読み取りおよび管理) スコープを選択します。

  11. [作成] を選び、トークンを作成します。

  12. トークンの値をコピーし、安全な場所に保存します (再度表示することはできません。 再生成できるのはトークンだけです)。

    個人用アクセス トークンの構成を示すスクリーンショット。

    [!IMPORTANT] 最小限の特権オプションである [エージェント プール (読み取り、管理)] は、エージェントの構成にのみ使います。 また、それがトークンの唯一の目的である場合は、トークンには必ず最短の有効期限を設定してください。 エージェントを再度構成する必要がある場合は、同じ特権を持つ別のトークンを作成できます。

タスク 5:エージェントの構成

  1. Azure VM へのリモート デスクトップ セッション内で、PowerShell ウィンドウに戻ります。 必要に応じて、現在のディレクトリを、この演習で先ほどエージェント インストール ファイルを抽出したディレクトリに変更します。

  2. エージェントを無人で実行するように構成するには、次のコマンドを呼び出します。

    .\config.cmd
    

    : エージェントを対話形式で実行する場合は、代わりに .\run.cmd を使用します。

  3. エージェントを構成するには、プロンプトが表示されたら次のアクションを実行します。

    • Azure DevOps 組織の URL (サーバー URL) を https://aex.dev.azure.com{お客様の組織名} 形式で入力します。
    • 既定の認証の種類 (PAT) をそのまま使います。
    • 前の手順で作成した PAT トークンの値を入力します。
    • この演習で先ほど作成したエージェント プール名 eShopOnWebSelfPool を入力します。
    • エージェント名 eShopOnWebSelfAgent を入力します。
    • 既定のエージェント作業フォルダー (_work) をそのまま使います。
    • Y」と入力して、エージェントがサービスとして実行されるように構成します。
    • Y」と入力して、エージェント サービスの SERVICE_SID_TYPE_UNRESTRICTED を有効にします。
    • NT AUTHORITY\SYSTEM」と入力して、サービスのセキュリティ コンテキストを設定します。

    [!IMPORTANT] 一般にサービス セキュリティ コンテキストを構成するときは、最小限の特権の原則に従うようにします。

    • 既定のオプション (N) のままにして、構成の完了後すぐにサービスを開始できるようにします。

    エージェントの構成を示すスクリーンショット。

    : エージェントの構成プロセスが完了するまでに数分かかります。 完了すると、エージェントがサービスとして実行されていることを示すメッセージが表示されます。

    [!IMPORTANT] エージェントが実行されていないことを示すエラー メッセージが表示された場合は、サービスを手動で開始することが必要な場合があります。 これを行うには、Windows のコントロール パネルでサービス アプレットを開き、Azure DevOps Agent (eShopOnWebSelfAgent) という名前のサービスを見つけて起動します。

    [!IMPORTANT] エージェントの起動に失敗した場合は、エージェントの作業ディレクトリに別のフォルダーを選択することが必要な場合があります。 これを行うには、エージェント構成スクリプトを再実行し、別のフォルダーを選択します。

  4. Azure DevOps ポータルを表示している Web ブラウザーに切り替え、エージェント プールに移動し、[エージェント] タブをクリックして、エージェントの状態を確認します。一覧に新しいエージェントが表示されます。

    エージェントの状態を示すスクリーンショット。

    : Windows エージェントの詳細については、「セルフホステッド Windows エージェント」をご覧ください。

    [!IMPORTANT] エージェントが Azure DevOps パイプラインから Azure リソースをビルドしてデプロイできるようにするには (今後のラボで手順を実行します)、エージェントをホストしている Azure VM のオペレーティング システム内に Azure CLI をインストールする必要があります。

  5. Web ブラウザーを起動し、[Windows に Azure CLI をインストールする] ページに移動します。

  6. Azure CLI をダウンロードしてインストールします。

  7. (省略可能) 必要に応じて、次の PowerShell コマンドを実行して Azure CLI をインストールします。

    $ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; Remove-Item .\AzureCLI.msi
    

    : 別のバージョンの Azure CLI を使用している場合は、それに応じて上記のコマンドの調整が必要になる場合があります。

  8. Web ブラウザーで、https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-8.0.403-windows-x64-installer の Microsoft .NET 8.0 SDK インストーラー ページに移動します。

    [!IMPORTANT] エージェントをホストしている Azure VM に .NET 8.0 SDK (またはそれ以降) をインストールする必要があります。 これは、今後のラボで eShopOnWeb アプリケーションをビルドするために必要です。 アプリケーションのビルドに必要なその他のツールまたは SDK も、Azure VM にインストールする必要があります。

  9. Microsoft .NET 8.0 SDK をダウンロードしてインストールします。

演習 2:エージェント プールのセキュリティを作成して構成する

この演習では、エージェント プールのセキュリティを構成します。

タスク 1: 新しいセキュリティ グループを作成する

  1. Azure VM へのリモート デスクトップ セッション内で、Azure DevOps ポータルを表示している Web ブラウザーの [プロジェクトの設定] ペインの [全般] セクションにある [アクセス許可] を選択します。

  2. [新しいグループ] を選びます。

  3. グループの名前を指定します (eShopOnWeb セキュリティ グループなど)。

  4. [作成] を選び、グループを作成します。

    セキュリティ グループの作成を示すスクリーンショット。

タスク 2: セキュリティ グループを構成する

  1. Azure Devops ポータルを表示している Web ブラウザー ウィンドウで、新しいグループを選び、その [アクセス許可] タブを表示します。

  2. そのグループに対する不要なアクセス許可を拒否します。たとえば、[チーム プロジェクトの名前変更][作業項目を完全に削除]、その他のアクセス許可 (エージェント プールに対してのみ使われる想定なので、そのグループに付与したくないもの) です。

    セキュリティ グループ設定を示すスクリーンショット。

    [!IMPORTANT] グループに付与したくないアクセス許可を残しておくと、エージェントで実行されているスクリプトまたはタスクは、グループのアクセス許可を使用して、実行してほしくないアクションを実行できます。

タスク 3:エージェント プールのアクセス許可を管理する

このタスクでは、エージェント プールのアクセス許可を管理します。

  1. Azure Devops ポータルを表示している Web ブラウザー ウィンドウで、eShopOnWeb プロジェクトの [プロジェクトの設定] にある [パイプライン] セクションで [エージェント プール] を選びます。

  2. eShopOnWebSelfPool エージェント プールを選びます。

  3. エージェント プールの詳細ビューで、[セキュリティ] タブを選びます。

  4. [追加] を選び、新しいグループ、eShopOnWeb セキュリティ グループをエージェント プールのユーザーのアクセス許可に追加します。

  5. エージェント プール閲覧者、ユーザー、管理者など、ユーザーまたはグループに適したロールを選びます。 この場合は、ユーザーを選びます。

  6. [追加] を選んでアクセス許可を適用します。

    エージェント プールのセキュリティ構成を示すスクリーンショット。

これで、パイプラインでエージェント プールを安全に使用する準備ができました。 新しいグループを使用して、ユーザーを追加したり、エージェント プールのアクセス許可を管理したりできます。 エージェントがパイプラインのみを実行するのに必要なアクセス許可を持つように、新しいグループを使用してインストールされたセルフホステッド エージェントを再構成することができます。 たとえば、グループにユーザーを追加し、そのユーザーとして実行するようにエージェントを構成できます。

エージェント プールの詳細については、「エージェント プール」をご覧ください。

[!IMPORTANT] 不要な料金が発生しないように、Azure portal で作成されたリソースを必ず削除してください。

確認

このラボでは、Azure DevOps セルフホステッド エージェントとエージェント プールを構成し、それらのプールのアクセス許可を管理する方法について学習します。 アクセス許可を効果的に管理することで、DevOps プロセスのセキュリティと整合性を維持しながら、適切なユーザーが必要なリソースにアクセスできるようにすることができます。