从 apim 中的 azure Key Vault 读取密钥Read a secret key from azure key vault in apim

Read a secret key from azure key vault in apim

提问人:Sindhu1990 提问时间:11/17/2023 最后编辑:James ZSindhu1990 更新时间:11/17/2023 访问量:94

问:

我需要在 APIM 策略中验证 HMAC。hmac 机密将存储在 azure key vault 中。以下是我将在我的政策中遵循的步骤

  • 从密钥保管库读取密钥Read the secret key from the key vault
  • 验证 hmac

以下是我尝试过的 apim 策略

<policies>
    <inbound>
        <base />

        <!-- Fetch HMAC key from Key Vault -->
        <set-variable name="keyVaultSecretUri" value="KV_URL/secrets/SECRET_NAME" />
        <set-variable name="keyVaultClientId" value="KV_CLIENT />
        <set-variable name="keyVaultClientSecret" value="KV_SECRET" />

        <set-variable name="request" value="@{
            var keyVaultSecretUri = context.Variables["keyVaultSecretUri"];
            var keyVaultClientId = context.Variables["keyVaultClientId"];
            var keyVaultClientSecret = context.Variables["keyVaultClientSecret"];

            return new {
                method = "GET",
                url = keyVaultSecretUri,
                headers = new {
                    Authorization = "Bearer " + FetchAccessToken(keyVaultClientId, keyVaultClientSecret)
                }
            };
        }" />

        <send-request mode="new" response-variable-name="keyVaultResponse" timeout="20" ignore-error="false">
            <set-url>@(context.Variables["request"].url)</set-url>
            <set-method>@(context.Variables["request"].method)</set-method>
            <set-header name="Authorization" exists-action="override">
                <value>@(context.Variables["request"].headers.Authorization)</value>
            </set-header>
        </send-request>

        <!-- Log Key Vault Response -->
        <trace source="keyVault" severity="information">
            <message>@(context.Variables["keyVaultResponse"].Body?.ToString())</message>
        </trace>
    </inbound>
</policies>

这是我得到的错误

 One or more fields contain incorrect values:
Error in element 'set-variable' on line 22, column 10: The name 'FetchAccessToken' does not exist in the current context
Error in element 'send-request' on line 36, column 10: 'object' does not contain a definition for 'url' and no extension method 'url' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
Error in element 'trace' on line 45, column 10: 'object' does not contain a definition for 'Body' and no extension method 'Body' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

在上面的政策中,我只是想读取秘密并显示。我无法做到这一点。我点击了这个链接作为参考

azure-keyvault azure-api-management hmac

评论

0赞 Ikhtesam Afrin 11/17/2023
你遇到任何错误吗?
0赞 Sindhu1990 11/17/2023
@IkhtesamAfrin - 我更新了问题中的错误
0赞 Ikhtesam Afrin 11/17/2023
你有什么要求,你想要从 APIM 提取存储在 Key Vault 中的机密值?如果是这样,则可以使用命名值执行此操作
0赞 Sindhu1990 11/17/2023
我想获取密钥并将其用于策略@IkhtesamAfrin中的 hmac 验证
0赞 Ikhtesam Afrin 11/17/2023
可用于验证令牌validate-jwt

答:

0赞 Ikhtesam Afrin 11/17/2023 #1

我只是想阅读秘密并显示

若要从 Key Vault 提取机密值,需要执行以下设置。

  1. 在 Azure APIM 中启用托管标识,如下所示。

enter image description here

  1. 使用访问策略授予对 Key Vault 中 APIM 的“获取机密”访问权限,如下所示。

enter image description here enter image description here enter image description here enter image description here

  1. 在 APIM 中创建命名值。

enter image description here enter image description here

创建命名值后,您可以使用以下策略来获取密钥并显示该值。

<policies>
    <inbound>
        <base  />
        <set-variable  name="KeyVaultSecret"  value="{{Named value name}}"  />
        <return-response>
            <set-body>@("Key Vault Secret is: "+(context.Variables["KeyVaultSecret"])+"")</set-body>
        </return-response>
    </inbound>
</policy>

我能够获取 Key Vault 机密值。

enter image description here

您需要使用如下策略 -<send-request>

<send-request mode="new" response-variable-name="keyVaultResponse" timeout="60" ignore-error="true">
    <set-url>@("pass_the_url")</set-url>
    <set-method>GET</set-method>
    <set-header name="Authorization" exists-action="override">
        <value>@(context.Request.Headers.GetValueOrDefault("Authorization", ""))</value>
    </set-header>
</send-request>

你也可以参考我在这个SO-Thread中的回答。

评论

0赞 Sindhu1990 11/17/2023
谢谢,这很完美。我可以在没有名称值的情况下执行此操作吗?如果我的密钥是动态的怎么办?例如,我的密钥名称会像 secretkey1、secretkey2 等一样更改是否可以在 apim 中读取此类密钥?
0赞 Vitaliy Kurokhtin 11/20/2023
APIM 每 4 小时自动刷新一次 Key Vault 机密:learn.microsoft.com/en-us/azure/api-management/...。为了避免在更新密钥后 4 小时内中断验证,可以存储两个密钥,如果任一密钥验证签名,则接受调用,但在需要更新时 - 仅更新最近最不用于签名的密钥。
0赞 Sindhu1990 11/20/2023
我在问,就像在运行时只知道键名一样。那么我可以读取值而不是将其存储为名称值吗?因为这种方法似乎是针对静态数据的