はじめに
クラウドサービスを使う場合、PAT(Personal Access Token)あるいはアクセスキーといったものは非常によく使われます。半面パスワード同然なので、漏れてしまうと大変です。したがって、有効期間が設定されていたり、簡単に再生成できるようになっていたりします。サービスによってはキーのリークも教えてくれます。しかし、簡単に更新できるといってもソースコードに埋め込んでいるとか、設定ファイルであると更新が大変です。
例えば、すべてのシークレットがkey Vaultに格納されている、という運用をしていたとしても、すべての変更することは大変ですし、漏れてしまうかもしれません。Azure DevOpsにアクセスする際もたくさんのPATを使わざるを得ないケースがありますが、なんとかならないのか、ということで頑張っているようです。
Azure DevOpsでPATを使うケースと代替手段がないかまとめてみます。なお、Entraのディレクトリを関連付けている場合になります。個人Microsoftアカウント(outlook.jpなど)でアクセスする場合はあてはまりません。
Azure CLI(DevOps Extension) / Azure Developer CLI
az account get-access-token
でトークンとれたんですね。azd auth login
もサポートされます。
ただ、Azure DevOps CLIに関してはいまだにPATのみなので今後に期待ですが、REST APIで代替できるので、致命的ではないかもしれませんが、更新されてほしいところです。
Azure Pipelines Self-host Agent
Service Principal(おすすめ)かDevice Codeが使えます。Service Principalも最長2年なのでお気をつけて。Microsoft Hosted agentではサポートされていない古いソフトウェアや逆に入っていないようなソフトウェアを使うとか、Express RouteやVPNでAzureとつながっていない環境かつ、オンプレミス内にデプロイしたい場合以外ではScale Set Agentを使うか、Managed DevOps Poolを使ったほうがいいとは思います。
Azure Repos
現時点(3/28)において、ドキュメントにはまだ載っていますが、UIからは削除されています。
使うことはないでしょう。Git Credential Managerを使ってください。
REST APIその1 - PATを自動でローテーションする
認証をEntraに移行してください、となります。シークレットローテーションもAPIで実現できます。
サンプル。公式は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を使わないようにしましょう(個人アカウント除く)。