当前位置: 首页 > 知识库问答 >
问题:

Databricks API 2.0-使用服务主体凭据在powershell中创建秘密作用域

凌征
2023-03-14

我正在尝试使用在 Azure DevOps 部署期间运行的电源外壳脚本在 Azure 数据砖中创建密钥保管库支持的机密作用域。当我使用自己的凭据在本地运行时,它工作正常,但是当我尝试使用服务主体凭据运行它时,我收到错误。

我遇到的问题与前一篇文章相似,但并不完全相同。

这是我的剧本:

[CmdletBinding()]
Param(
    $azureADDatabricksAccessToken = $env:AZUREADDATABRICKSACCESSTOKEN,
    $azureManagementAccessToken = $env:AZUREMANAGEMENTACCESSTOKEN,
    $workspaceResourceId,
    $subscription,
    $resourceGroup,
    $keyVault,
    $workspaceUrl,
    $scope
)
$headers = @{ 
"Authorization" = "Bearer $azureADDatabricksAccessToken";
"X-Databricks-Azure-SP-Management-Token" = $azureManagementAccessToken;
"X-Databricks-Azure-Workspace-Resource-Id" = $workspaceResourceId;
}

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$scopes = (Invoke-RestMethod -Uri "https://$workspaceUrl/api/2.0/secrets/scopes/list" -Method Get -Headers $headers).scopes
$exists = ($scopes | Where-Object {$_.name -eq $scope}).Count -gt 0
if($exists){
    Write-Host "Secret scope found";
}
else{
    Write-Host "Creating new secret scope";
    
    $body = @{
     "scope" = "$scope";
     "scope_backend_type" = "AZURE_KEYVAULT";
     "backend_azure_keyvault" =
     @{
       "resource_id" = "/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.KeyVault/vaults/$keyVault";
       "dns_name" = "https://$keyVault.vault.azure.net/";
     };
     "initial_manage_principal" = "users";
    }

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-RestMethod -Uri "https://$workspaceUrl/api/2.0/secrets/scopes/create" -Method Post -Headers $headers -Body (ConvertTo-Json $body)
}

我得到这样的访问令牌:

$azureADDatabricksAccessToken = (az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --resource-type aad-graph | ConvertFrom-Json).accessToken
$azureManagementAccessToken = (az account get-access-token --resource "https://management.core.windows.net/" | ConvertFrom-Json).accessToken

这在我使用< code>az登录-t XXXX登录时有效,但作为服务主体使用< code>az登录-服务-主体-u XXXX -p XXXX -租户XXXX运行时失败。

我得到的错误消息是:

error_code":"CUSTOMER_UNAUTHORIZED","message":"Unable to grant read/list permission to Databricks service principal to KeyVault 
'XXXXX': key not found: https://graph.windows.net/

作为服务主体运行时,我是否需要为< code>graph.windows.net添加一些其他访问令牌头?

共有2个答案

范志勇
2023-03-14

>

  • 假设您已经有了数据块。

    您需要使用以下命令获取azure AD令牌:

    az account get-access-token --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d --query “accessToken”

    生成令牌的用户应该是该数据砖中的用户。

    请注意,令牌将在大约60分钟后过期。

    将生成的adtoken、dbrworkspaceUrl、keyVaultName放入devops发布管道变量中。

    运行以下脚本:

        python -m pip install --upgrade pip setuptools wheel databricks-cli --upgrade
    
        #get kv variables
    
        $keyVaultResp = (Get-AzKeyVault -VaultName '$(keyVaultName)')
    
        $KvResourceId = $keyVaultResp.ResourceId
    
        $KvVaultUri = $keyVaultResp.VaultUri
    
        #set AD token as env variable
    
        $env:DATABRICKS_AAD_TOKEN = "$(adtoken)"
    
        $hostname = "$(dbrworkspaceUrl)"+"/"
    
        Write-Output 'hostname' $hostname $KvResourceId $KvVaultUri
        
        #configure dbr
    
        databricks configure --host $hostname --aad-token
    
        databricks secrets create-scope --scope scope_name --scope-backend-type AZURE_KEYVAULT --resource-id $KvResourceId --dns-name $KvVaultUri --initial-manage-principal users
    
        databricks secrets list-scopes
    

    配置Databricks CLI服务prin aad令牌

  • 阚夕
    2023-03-14

    无法使用服务主体执行此操作 - 这是 Azure 端的限制。文档明确指出了这一点:

    您需要Azure AD用户令牌来使用Databricks CLI创建Azure密钥库支持的机密范围。您不能使用属于服务主体的Azure Databricks个人访问令牌或Azure AD应用程序令牌。

    附言:在自动预配工作区时,这是一个很大的痛点,但由于这是 Azure 中的一个问题,因此你可以做的一切都是升级到他们的支持,也许它会被优先考虑。

    附言:您是否关注了Database ricks Terraform Provider-与Powershell REST API相比,它可能会让您的生活更轻松

     类似资料:
    • 在AWS Xamarin SDK文档中,的Amazon Cognito Identity API文档在其第二段中指出,“必须使用AWS开发人员凭据来调用此API。” 现在,总的想法是尽量不要泄露API机密 但是上面粗体提到的这段文字是否意味着我不能使用IAM角色和/或策略来调用这些API?这是否意味着我必须在应用程序源代码中包含accessKey和secretKey? AWS提供了Cognito机

    • 问题内容: 马克·墨菲(Mark Murphy)在他的博客上很好地说明了应将哪些信息排除在公共存储库之外。密钥材料(例如用于各种服务的OAuth密钥或API密钥)就是一个很好的例子。 有问题的应用程序将是移动android应用程序,因此有人对其进行反编译以获取秘密密钥不在此问题范围内。 如何配置公共CI实例(例如cloudbees)上的构建作业,以使机密不泄漏到构建日志或编译目录中?我的主要目的是

    • 我成功地实现了在terraform中创建敏感资源的流程,在任何时候都不会透露敏感细节是什么,因此在我们的github repo中不会以纯文本存储。我让TF创建一个服务帐户,它与SA密钥相关,然后创建一个引用SA密钥输出的GCP密钥。 我现在想看看是否有任何方法可以对一些预定义的数据库密码执行相同的操作。流量会略有不同: 手动创建GCP secret(在secrets manager中),该密码的值

    • null 例如,轮转设定为7天。所以我在我的应用程序中编码每7天刷新一次...不好,因为很难精确计时。 另一种方法是,如果我的应用程序面临身份验证异常,只需刷新密码,建立一个新的连接,并重试应用程序逻辑。 行业标准是什么?

    • 当我使用Office 365的配置api时(通过连接msolservice或https://provisioningapi.microsoftonline.com/provisioningwebservice.svc)我正在使用用户名和密码。当我连接时,我会自动使用powershell或通过web服务和office365部署(如联合/解除联合本地域) 我面临的问题是密码最终会过期,我的服务会中断,

    • 我试图创建新的肥皂请求在SoapUI从服务endpoint复制密码用户名和endpoint。 它使用终结点,但不使用用户名和密码。 有人知道怎么做吗? (我不想克隆)!