メインコンテンツへジャンプ

パーソナルアクセストークン(PAT)は、パスワードでログインせずにAzure DatabricksやAzure DevOpsなどのサービスにアクセスする便利な方法です。現在、多くの顧客がDatabricks Gitフォルダ(旧Repos)のリモートリポジトリのGit認証情報としてAzure DevOps PATトークンを使用しています。残念ながら、PATトークンの使用にはいくつかのデメリットがあります。Azure DevOpsでは、PATトークンはサービスプリンシパルやマネージドアイデンティティに発行することができず、顧客はサービスアカウントやユーザーのアイデンティティに頼ることになります。また、PATトークンの最大寿命はしばしば数日、数週間、あるいは数ヶ月であり、そのローテーション(古いトークンが使用できなくなるようにトークンを更新するプロセス)は管理されることがありますが、これは長寿命の漏洩したトークンが大きなリスクをもたらす可能性があることを意味します。より安全な代替手段は、Microsoft Entra ID(旧Azure Active Directory)アクセストークンを使用してAzure DevOpsリソースにアクセスすることです。

 

Microsoft Docsから:

PATは単なるベアラートークン、つまりユーザーのユーザー名とパスワードを表すトークン文字列であるため、誤った人の手に簡単に渡ってしまう可能性があり、非常にリスキーです。Microsoft Entraのトークンは毎時間期限切れになります[…],これにより、漏洩した場合のリスク全体が制限されます。[1 Databricks GitフォルダにリンクされたAzure DevOps Gitリポジトリへのアクセスを考えると、もはやPATに頼る必要はありません。現在、トークンのローテーションと有効期限に対するより厳格な制御を持つMicrosoft Entra IDアクセストークンを使用できます。

このブログでは、Azure DevOpsにホスティングされたリポジトリをプルする際に、DatabricksのGitフォルダーでEntra IDのアクセストークンをGitの認証情報として使用し、セキュリティを強化する方法を学びます。

前提条件 | サービスプリンシパルの作成

まず、マネージドアイデンティティまたはサービスプリンシパルが必要です。まだ持っていない場合は、このドキュメントに従ってください:Microsoft Entraアプリを登録し、サービスプリンシパルを作成する。これにより、使用できるサービスプリンシパルが得られます。このシナリオではリダイレクトURIは必要ないので、そのフォーム要素は空白のままにしておいてください。シークレットを作成し、サービスプリンシパルIDとともにメモしておいてください。(次の手順では、認証のメカニズムとしてサービスプリンシパルを使用する方法を示しますが、マネージドアイデンティティにも同じ手順が適用されます。)

このプロセスは、Databricks GitフォルダーにリンクしたいGitリポジトリを設定したAzure DevOpsプロジェクトがあることを前提としています。

 

ステップ1 | プロジェクト内でサービスプリンシパルにリーダー権限を付与します

1

Azure DevOpsのプロジェクト設定 > 権限 > 読者にあなたのサービスプリンシパルを追加します。

3

必要な操作を行うためのアクセスレベルが十分であることを確認してください 組織設定 > ユーザー

ステップ2 | Databricksでサービスプリンシパルに必要な権限を付与する

2

Unity Catalogを使用している場合は、別のブラウザタブを開き、Databricksアカウントのコンソールに移動し、サービスプリンシパルをアカウントに追加します。

4

さて、OAuthシークレットを生成しますDatabricks APIに対して認証するために(CLIを使用してそして、それを安全な場所にコピーしておきます。

5

最後に、サービスプリンシパルユーザーにワークスペースの権限を付与します。

ステップ3 | CLIを使用してEntra IDトークンを作成し、それをDatabricks Gitの資格情報に保存します

このステップでは、AzureとDatabricksのCLIを使用します。Databricksに対して認証するためには、設定プロファイル (.databrickscfg) が必要で、これには先ほど作成したOAuthトークン、ワークスペースのURL、およびサービスプリンシパルIDを設定します。更新後の .databrickscfgは次のようになります:

[DEFAULT]
host = https://<workspace-url>.azuredatabricks.net/
client_id =<service principal ID> client_secret =<Databricks OAuth token value>

サービスプリンシパルをAzureCLIにログインさせるために、先ほど作成したシークレットを使用します。スクリプトは、UUID 499b84ac-1321-427f-aa17-267ca6975798で示されるAzure DevOpsにスコープを持つEntra IDアクセストークンを要求し、その後Databricks CLIでGitの資格情報を設定し、新しいGitフォルダの設定を行います:

#!/bin/bash


# 必要な入力をユーザーに促し、変数に割り当てる
read -p "サービスプリンシパルIDを入力してください: " service_principal_id 
read -p "テナントIDを入力してください: " tenant_id 
read -p "サービスプリンシパルのシークレットを入力してください: " service_principal_secret
read -p "サービスプリンシパルの名前を入力してください: " service_principal_name 
read -p "Azure DevOpsの組織名を入力してください: " devops_organization 
read -p "Azure DevOpsのプロジェクト名を入力してください: " devops_project 
read -p "Azure DevOpsのリポジトリ名を入力してください: " devops_repo 


#サービスプリンシパルとしてAzureにログインする
az login --allow-no-subscriptions --service-principal -u $service_principal_id -p $service_principal_secret --tenant $tenant_id


#サービスプリンシパルとして、Azure DevOpsにスコープを持つEntraIDアクセストークンを要求する。 
ENTRA_ID_TOKEN=$(az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" --query "accessToken" --output tsv)

#PATの代わりにアクセストークンを使用して、サービスプリンシパルの名前をgitユーザー名としてDatabricksにGit認証情報を作成します。#これはすでにDatabricks CLI .databrickscfgを設定していることを前提としていますワークスペース、client_id、およびclient_secretを含むファイル
databricks git-credentials create azureDevOpsServices --personal-access-token $ENTRA_ID_TOKEN --git-username $service_principal_name


#サービスプリンシパル名をユーザー名として新しいDatabricksリポジトリを作成する
databricks repos create https://$service_principal_name@dev.azure.com/$devops_organization/$devops_project/_git/$devops_repo

 

まとめ | 次に何をすべきか?

これで、Azure DevOpsにスコープを持つMicrosoft Entra IDアクセストークンを生成し、それをDevOps PATトークンの代わりにDatabricks Gitの資格情報として保存する方法を学びました。MS Entra IDアクセストークンは短期間有効なので、パイプラインはDatabricks git-credentials updateを使用してGitの資格情報を更新し、その後Databricks repos updateを呼び出してプルをトリガーする必要があります。このプロセスは資格情報の設定を示すだけなので、通常は本番環境では追加のセキュリティ対策が必要です。例えば、サービスプリンシパルのクライアントシークレットやDatabricksのOAuthトークンを、Azure Key Vaultのような安全なシークレットストアに保存するなどです。

詳細は、Azure PipelinesでAzure Key Vaultのシークレットを使用するシークレットスコープをご覧ください。