kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Azure DevOps Serviceにおいて、PATを手動で更新しない運用を目指す

はじめに

クラウドサービスを使う場合、PAT(Personal Access Token)あるいはアクセスキーといったものは非常によく使われます。半面パスワード同然なので、漏れてしまうと大変です。したがって、有効期間が設定されていたり、簡単に再生成できるようになっていたりします。サービスによってはキーのリークも教えてくれます。しかし、簡単に更新できるといってもソースコードに埋め込んでいるとか、設定ファイルであると更新が大変です。

例えば、すべてのシークレットがkey Vaultに格納されている、という運用をしていたとしても、すべての変更することは大変ですし、漏れてしまうかもしれません。Azure DevOpsにアクセスする際もたくさんのPATを使わざるを得ないケースがありますが、なんとかならないのか、ということで頑張っているようです。

devblogs.microsoft.com

devblogs.microsoft.com

Azure DevOpsでPATを使うケースと代替手段がないかまとめてみます。なお、Entraのディレクトリを関連付けている場合になります。個人Microsoftアカウント(outlook.jpなど)でアクセスする場合はあてはまりません。

Azure CLI(DevOps Extension) / Azure Developer CLI

learn.microsoft.com

az account get-access-tokenでトークンとれたんですね。azd auth loginもサポートされます。

learn.microsoft.com

ただ、Azure DevOps CLIに関してはいまだにPATのみなので今後に期待ですが、REST APIで代替できるので、致命的ではないかもしれませんが、更新されてほしいところです。

Azure Pipelines Self-host Agent

learn.microsoft.com

Service Principal(おすすめ)かDevice Codeが使えます。Service Principalも最長2年なのでお気をつけて。Microsoft Hosted agentではサポートされていない古いソフトウェアや逆に入っていないようなソフトウェアを使うとか、Express RouteやVPNでAzureとつながっていない環境かつ、オンプレミス内にデプロイしたい場合以外ではScale Set Agentを使うか、Managed DevOps Poolを使ったほうがいいとは思います。

Azure Repos

learn.microsoft.com

現時点(3/28)において、ドキュメントにはまだ載っていますが、UIからは削除されています。

learn.microsoft.com

使うことはないでしょう。Git Credential Managerを使ってください。

REST APIその1 - PATを自動でローテーションする

learn.microsoft.com

認証をEntraに移行してください、となります。シークレットローテーションもAPIで実現できます。

github.com

サンプル。公式はADAL認証のままなのでMSALに書き直しました。

REST APIその2 - Managed Identityでの認証

using Azure.Core;
using Azure.Identity;

var clientId = Environment.GetEnvironmentVariable("APPID");
var tenantId = Environment.GetEnvironmentVariable("TENANTID");
var credential = new ManagedIdentityCredential(clientId);

var tokenRequestContext =
   new TokenRequestContext(new[] 
   { 
       "https://management.azure.com/.default" 
   },
   null, null, tenantId);
AccessToken token = await credential.GetTokenAsync(tokenRequestContext);

例えば、Azure Functionsなどから取得するケースです。APPIDはApplication ID、TENANTIDにはtenantのIDを環境変数から取得します。

まとめ

Azure DevOps CLI以外は大体回避策があるので、いつまでもPATを使わないようにしましょう(個人アカウント除く)。