无法从Azure Data Lake Analytics访问Azure Key Vault

时间:2017-05-02 00:21:22

标签: c# azure azure-data-lake u-sql azure-keyvault

我有一个带有自定义提取程序的U-SQL脚本,可以访问Azure Key Vault以获取一些凭据。

我跟着this tutorial。我有相同的代码从AD获取令牌,然后调用提供的URI来获取实际凭据:

public static async Task<string> GetToken(string authority, string resource, string scope)
{
    var authContext = new AuthenticationContext(authority);
    var clientCred = new ClientCredential(applicationId, authenticationKey);
    AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);
    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the AD token");
    }
    return result.AccessToken;
}

public static async Task<string> GetSecret(string secretUri)
{
    var keyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(GetToken)
    );
    var sec = await keyVaultClient.GetSecretAsync(secretUri);
    return sec.Value;
}

我的凭据已成功存入保险库,我有一个URI可以访问它们 - 类似于:

https://my-key-vault-name.vault.azure.net:443/secrets/MyCredentialsName/123abc

我已经在Azure AD中注册了我的应用,并获得了应用程序ID和身份验证密钥,我允许我的应用程序从Key Vault读取密码。在我的U-SQL脚本中,我引用了所有需要的程序集。

当我在本地运行我的脚本时,一切都很好(这意味着从本地计算机到AD和Key Vault的连接都没问题),但是当我提交它以便在远程Data Lake Analytics帐户上执行时,我收到以下错误:

  

无法解析远程名称:   'my-key-vault-name.vault.azure.net'

     

at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult)   asyncResult)at   System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)

我对Azure资源组的管理权限有限,但我可以访问Data Lake Analytics刀片上的防火墙选项卡 - 我尝试启用和禁用防火墙,打开/关闭Allow access to Azure services,但错误仍然存​​在。< / p>

作为依赖项,我引用了Microsoft.Azure.KeyVault 2.0.6Microsoft.Azure.KeyVaultWebKey 2.0.4Microsoft.IdentityModel.Clients.ActiveDirectory 3.13.9

关于如何解决问题的任何想法?

1 个答案:

答案 0 :(得分:3)

在ADLA中运行的U-SQL代码不允许您连接到容器/ VM外部的资源。原因是:

U-SQL的自定义代码调用可能会扩展到超过100到1000个容器,数百万行被调用数百万。这很容易导致针对您尝试访问的服务的(希望是无意的)分布式拒绝服务附加,从而可能导致DDOS服务并阻止Azure IP范围。

本地运行当前不在容器中运行,因此没有这样的限制执行。

你打算用这个电话做什么?请注意,存储中的数据已经可以使用Azure Key Vault进行透明编码。