【问题标题】:Use Automation RunAs service principal to connect to Azure Analysis Services and process使用 Automation RunAs 服务主体连接到 Azure Analysis Services 并处理
【发布时间】:2019-03-15 09:08:32
【问题描述】:

TL;DR

总的来说,步骤是:

  1. 使用正确的代码(本文最后的代码)
  2. 以服务器管理员或数据库管理员的身份在 SSMS 中手动添加您的应用 ID

然后您可以从 Azure 自动化帐户处理 Azure Analysis Services 多维数据集,而无需创建另一个单独的服务帐户

实际问题:

我正在尝试使用 Azure 自动化 RunAs 服务主体处理 Azure Analysis Services 多维数据集。这是在 Azure 自动化帐户中运行的

这段代码

#Get the existing AzureRunAsConnection connection
$Conn = Get-AutomationConnection -Name AzureRunAsConnection

# Login with service principal account
Login-AzureRMAccount 
    -ServicePrincipal 
    -Tenant $Conn.TenantID 
    -ApplicationId $Conn.ApplicationID 
    -CertificateThumbprint $Conn.CertificateThumbprint

# Process cube
Invoke-ProcessASDatabase -databasename "DB" -server "Server" -RefreshType "Full"

结果

身份验证失败:用户界面不可用时需要用户 ID 和密码 可用。

我的理解是,当您创建 Azure 自动化帐户时,它还会创建一个“RunAs”帐户,进而创建一个服务主体帐户。 (虽然 doco 好像有点亮了)

我尝试在 Azure AD 中找到此主体帐户并将其添加到 Azure 门户中的 SSAS 管理员,但我找不到实际帐户。服务主体是否实际上显示为帐户?

下面的代码可以正常工作,但它使用预先保存的凭据,但我不想再管理另一个帐户。

# Purpose: Run a full process the SSAS cube
$AzureCred = Get-AutomationPSCredential -Name "MyCredential"

Add-AzureRmAccount -Credential $AzureCred | Out-Null
Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 

更新 1

我还尝试在 SSMS 会员区域中手动添加这些(在自动化帐户的 RunAs 帐户 区域中查找 guid 之后):

app:applicationid@tenantid

obj:serviceprincipalobjectid@tenantid

我得到同样的错误信息。

我还用非管理员用户运行了脚本并得到了

服务器上不存在“zzz”数据库。

所以看来我的问题是身份验证,而不是授权。换句话说,不是我无法访问,而是我无法登录。我正在考虑基于该错误,-credential 在针对 Azure 分析服务调用 Invoke-ProcessAsDatabase 时不是可选的

另外,我注意到对于-credential 选项,帮助说明

如果未指定凭据,则假定运行脚本的用户的默认 Windows 帐户

鉴于 Azure Analysis Services 似乎只能在连接到数据源时使用 SQL 凭据(没有 AD 凭据),我只能推测 Azure Analysis Services 无法使用任何类型的 Azure Ad 身份验证内部流程。

令人讨厌的是,这在任何地方都没有说明。

更新 2

所以我没有仔细阅读链接。有效的代码主要在两个回答者here 发布的网站上。要对 Azure 分析服务器进行预身份验证,您需要使用 Add-AzureAnalysisServicesAccount(链接的博客使用 Login-AzureAsAccount,但我无法使其正常工作并且找不到 doco)。您需要安装 powershell 模块“Azure.AnalysisServices”才能使用它。

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureAnalysisServicesAccount -RolloutEnvironment "australiasoutheast.asazure.windows.net" -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Invoke-ProcessASDatabase -databasename "MYDB" -server "MyServerEndpoint" -RefreshType "Full"

这个可以用RunAs账号,之后就不用-credential

所以.. 这实际上可以在不需要单独的凭据的情况下登录,但现在它无法访问数据库。我得到的不是登录错误,而是

服务器上不存在“ZZZZ”数据库。

我认为 RunAs 帐户可以访问服务器但不能访问数据库,我无法找到它来授予它访问权限。

更新 3:

这是关于如何让应用访问模型以便构建模型的更直接指南:

Azure analysis service connection using Service principal not working

请注意,您无法在 Azure 门户中添加,因为它不会找到它。在 SSMS 中“手动”添加它,它会起作用,它也会作为管理员出现在 Azure 门户中

现在一切正常。

更新 4:

这已成为存储我在通过 MSI 进行身份验证时发现的一个方便的地方

虽然这个问题已经解决,但我想使用 MSI 安全性从其他东西连接到 SQL Azure。没有连接字符串支持这一点 - 任何连接字符串中的身份验证方法都不支持 MSI 身份验证。我确实找到了这个有趣的链接,这意味着您可以创建一个支持作为 MSI 身份验证的连接字符串:

https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

感兴趣的代码是:

az webapp config connection-string set 
--resource-group myResourceGroup 
--name <app name> 
--settings MyDbConnection='Server=tcp:<server_name>.database.windows.net,1433;Database=<db_name>;' 
--connection-string-type SQLAzure

我找不到对参数--connection-string-type 的任何引用。但看起来您只是完全排除了身份验证部分。

【问题讨论】:

  • 在您的示例 1 中,您的登录 Azure Login-AzureRMAccount 似乎没有得到错误日志。据我所知,Invoke-ProcessASDatabase 不是 Azure Power Shell cmdlet。事实上,您无需登录您的 Azure 订阅。只有Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 适合你。
  • 感谢您的意见。当然,这个docs.microsoft.com/en-us/sql/analysis-services/powershell/… 已经为 cmdlet 勾选了“Azure 分析服务”,以了解它的价值。我不确定你对Login-AzureRMAccount 的意思。这是我尝试进行预身份验证,以便 Invoke-ProcessASDatabase 在没有凭据的情况下工作。是的,如果我提供凭证,它可以工作,但我想使用 RunAs 凭证。如果我不能,那还有什么意义呢。
  • Login-AzureRMAccount 用于登录 Azure 订阅。像 Get-AzureRmVM 这样的 Azure cmdlet 需要您先登录。 Invoke-ProcessASDatabase 不是 Azure cmdlet。 Azure Runbook 喜欢云中的 VM,您可以执行 Power Shell cmdlet。
  • 其实Azure没有你的SQL凭证,所以你需要使用$-Credential $AzureCred这个凭证是你的sql凭证而不是你的Azure账号凭证。

标签: azure azure-powershell azure-automation azure-analysis-services


【解决方案1】:

在您的示例 1 中,您的登录 Azure Login-AzureRMAccount 似乎没有得到错误日志。据我所知,Invoke-ProcessASDatabase 不是 Azure Power Shell cmdlet。事实上,您无需登录您的 Azure 订阅。只有Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 适合您。

是的,如果我提供凭据,它可以工作,但我想使用 RunAs 凭据。如果我不能,那还有什么意义呢。

RunAs credential 仅适用于登录您的 Azure 订阅,它不存储您的 SQL 凭据。在您的场景中,您可以将 SQL 凭据存储在运行手册 PSCredential 中,例如您的示例 2。实际上,在您的示例中,您可以删除 Add-AzureRmAccount -Credential $AzureCred | Out-Null

更新:

您应该在运行手册中使用以下脚本。

$Conn = Get-AutomationConnection -Name AzureRunAsConnection 
Login-AzureASAccount -RolloutEnvironment "southcentralus.asazure.windows.net" -ServicePrincipal -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint -TenantId $Conn.TenantID 
Invoke-ProcessTable -Server "asazure://southcentralus.asazure.windows.net/myserver" -TableName "MyTable" -Database "MyDb" -RefreshType "Full"

更多信息请查看blog

【讨论】:

  • 为了启动多维数据集进程,Azure Analysis Services 不使用 SQL 登录。对 Azure Analysis Services 前端的客户端访问是 AD。换句话说,我需要连接到 AAS 以启动构建过程,并且我只能以 AD 用户身份进行身份验证。所以...如果 Azure 自动化帐户创建了一个服务主体(这在概念上显然类似于本地服务帐户),那么为什么我什至不能 find 该帐户,更不用说使用它了连接到 AAS?
  • 我要做的是 1. 找到自动创建的 Azure 自动化帐户服务主体,并在 AAS 模型中分配该进程权限。我不能这样做,因为我找不到它! 2. 现在我想在我的 PS 脚本中使用相同的服务主体。我认为 cmdlet 不支持这一点,但如果我可以将服务主体作为 PSCredential 获取,那么一切都会解决
  • 基本上我想使用久经考验的服务帐户方法,其中进程(Azure 自动化)在服务主体下运行,只要该主体被授予对目标的访问权限,一切都可以正常工作而无需到处重复密码。
  • 是的,你可以找到这个服务主体,首先找到应用程序ID。 imgur.com/a/axjvd 然后在 Azure AD 刀片上找到它。 imgur.com/a/f8jPh
  • 嗨,你想要的是这个link?但是好像如果你想登录,你应该使用Login-AzureAsAccount 而不是Login-AzureRMAccount,它们是不同的。
【解决方案2】:

根据官方文档:

创建服务主体后,可以使用以下语法为其应用程序 ID 分配 Azure Analysis Services 服务器或模型角色中的权限。下面的示例将服务主体添加到 SSMS 中的服务器管理员组。

我没有看到 Run-as 选项的使用,我建议检查一下 blog

它还包含有关在 azure 自动化中存储凭据的信息,这将帮助您在代码中不硬写凭据。

【讨论】:

  • 谢谢。我确实看到了那个博客,但问题是我在任何搜索框(SSMS、SSDT 或 Azure 门户)中都找不到服务主体。我进入自动化帐户并单击“runas 帐户”,它为我提供了很多详细信息,包括显示名称,我认为这是我需要在活动目录中搜索的内容。无论如何,我手动输入了博客中指示的十六进制字符串并重试并得到了相同的错误。我目前将凭据存储在 azure 自动化中,但这并不令人满意,因为我必须在此处维护密码
  • 除此之外,我无法让 Azure 对源 SQL Azure 数据库使用除 SQL 身份验证之外的任何身份验证。因此,从本地开始,一切都在服务帐户下运行(可怕的双跳除外),然后转移到 Azure,我不得不回到过去存储凭据并需要创建单独的 SQL 用户,这真的很令人失望
  • 您有使用服务主体帐户的经验吗?我的自动化帐户名为xydevauto01。 “Azure Active Directory 应用程序”显示名称是 xydevauto01_qwoisaldadwlwahlahjwlad,这就是我要搜索的内容。我还尝试像这样添加“服务主体对象 ID”:obj:serviceprincipalobjectid@tenantid 和同样的错误。我开始从该错误消息中想到 -credential 选项对于 Azure 中的 Invoke-ProcessASDatabase 来说是 not 可选的。那么......是否有可能从 RunAs 连接中获取一个 pscredential 对象? (是的,我用谷歌搜索过!)
  • 我没有对该链接走得太远的另一个原因是该示例从用户/密码生成凭据,当然我不知道 runas 服务主体密码,我也不知道希望必须将其保存为凭据-如果服务帐户则违背了目的。就像您安装 SQL Server 并且它使用虚拟帐户时一样 - 我应该知道虚拟帐户的密码,我应该能够为虚拟帐户分配权限。 (我知道这不是本地部署的最佳实践,但如果它只是被丢弃,为什么还要生成 runas 服务主体呢?)
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 2017-06-29
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多