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

在C#.NET中使用MSI访问Azure密钥库

郭盛
2023-03-14

由于我是Azure的新手,这个问题可能很傻。我正在尝试构建一个提供和管理虚拟机集群的服务。出于安全考虑,我不想在每个集群上放一些敏感数据。因此我决定为每个集群提供一个Azure密钥库来存储这些数据,并创建一个MSI(managed identity)并分派给集群的每个节点,这样vm就可以访问密钥库来获取机密。

在服务端,我需要提供vms、密钥库和MSI。将MSI分配给每个VM,同时授予MSI访问AKV的权限。以下是我的问题:

    null

共有1个答案

司空镜
2023-03-14

1.系统分配的托管标识和用户分配的托管标识有什么区别?

根据我的研究,系统分配的托管标识是直接在Azure服务实例上启用的。系统分配的标识的生命周期直接绑定到启用它的Azure服务实例。如果实例被删除,Azure会自动清理Azure AD中的凭据和标识。

但是,用户分配的托管标识是作为独立的Azure资源创建的。创建标识后,可以将标识分配给一个或多个Azure服务实例。用户分配的标识的生命周期与分配给它的Azure服务实例的生命周期是分开管理的。

Azure CLI

az login
az identity create -g <RESOURCE GROUP> -n <USER ASSIGNED IDENTITY NAME>

Azure REST API A。使用Azure CLI获取访问令牌

az login
az account get-access-token

b.调用rest api

curl 'https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroup
s/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>?api-version=2015-08-31-preview' -X PUT -d '{"loc
ation": "<LOCATION>"}' -H "Content-Type: application/json" -H "Authorization: Bearer <ACCESS TOKEN>"
az login
az account get-access-token
PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.KeyVault/vaults/{vaultName}?api-version=2018-02-14
Header :
   Content-Type: application/json
   Authorization: Bearer <ACCESS TOKEN>
Body

  {
  "location": "westus",
  "properties": {
    "tenantId": "<your tenant id>",
    "sku": {
      "family": "A",
      "name": "standard"
    },
    "accessPolicies": [
      {
        "tenantId": "<your tenant id>",
        "objectId": "<the object id of the MSI>",
        "permissions": {
          "keys": [
            "encrypt",
            "decrypt",
            "wrapKey",
            "unwrapKey",
            "sign",
            "verify",
            "get",
            "list",
            "create",
            "update",
            "import",
            "delete",
            "backup",
            "restore",
            "recover",
            "purge"
          ],
          "secrets": [
            "get",
            "list",
            "set",
            "delete",
            "backup",
            "restore",
            "recover",
            "purge"
          ],
          "certificates": [
            "get",
            "list",
            "delete",
            "create",
            "import",
            "update",
            "managecontacts",
            "getissuers",
            "listissuers",
            "setissuers",
            "deleteissuers",
            "manageissuers",
            "recover",
            "purge"
          ]
        }
      }
    ],
    "enabledForDeployment": true,
    "enabledForDiskEncryption": true,
    "enabledForTemplateDeployment": true
  }
}
az login
az ad sp create-for-rbac -n "MyApp" --role contributor --sdk-auth

b.代码。更多详情请参阅示例

// please install package  Microsoft.Azure.Management.Fluent
var credentials = SdkContext.AzureCredentialsFactory
    .FromServicePrincipal(<the sp app id>,
    <the sp password>,
    tenantId, 
    AzureEnvironment.AzureGlobalCloud);
var azure = Microsoft.Azure.Management.Fluent.Azure
    .Configure()
    .Authenticate(credentials)
    .WithSubscription ("<your subscription id>");
var vault =await azure.Vaults.Define("")
                       .WithRegion(Region.AsiaSouthEast)
                       .WithExistingResourceGroup("groupname")
                       .DefineAccessPolicy()
                              .ForObjectId("the object id of msi")
                              .AllowCertificateAllPermissions()
                              .AllowKeyAllPermissions()
                              .AllowSecretAllPermissions()
                              .Attach()
                       .WithDeploymentEnabled()
                       .WithDiskEncryptionEnabled()
                       .WithTemplateDeploymentEnabled()
                       .WithSku(Microsoft.Azure.Management.KeyVault.Fluent.Models.SkuName.Standard)
                       .CreateAsync()
 类似资料:
  • 我正在python中构建由事件网格事件触发的Azure函数,它应该能够从Kay Vault收集秘密。 我将系统分配的托管标识添加到我的功能应用程序中,然后我可以在密钥库访问策略中选择我的应用程序。我授予它如下所示的权限: (我尝试了不同的组合在这一个)

  • 是否有一种方法可以使用Delphi访问Azure密钥库?我可以使用柏林的data.cloud.azureapi单元访问数据库和blob存储,但想从密钥库中获取数据库连接字符串,但似乎找不到任何用于此操作的代码。

  • 我试图在Visual Studio中本地运行Docker中的。NET Core3.1应用程序。应用程序需要访问Azure密钥库。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/53D4D1E1-3360-4735-8AAD-21C6155F528A。异常消息:试图使用Azure CLI获取令牌

  • 我想通过托管服务标识(MSI)从我的Service Fabric应用程序访问密钥库。我已经在Azure门户中设置的虚拟机规模上启用了MSI,并授予它访问我的密钥库资源的权限。这就像一个云中的魅力。然而,我的本地开发环境有问题。 据我所知,我可以授予自己对密钥库的访问权,并在Azure CLI中运行。唉,当在本地Service Fabric集群中运行应用程序时,这就不起作用了。我假设这是因为一个本地

  • 我已经能够通过外部web应用程序使用oauth rest api访问azure key vault,但出于某种原因,我无法从密钥中检索机密。经过长时间的研究,我发现用powershell和C#可以做到这一点,但还没有找到用Python解决方案。有人知道python是否有可能,或者有一种方法可以模拟powershell正在做什么吗?以下是检索秘密的代码: 此外,我已经在azure portal中注册

  • 这在调试期间也有效,但是当我发布到Azure时,它也会失败,因为我的密钥返回null。 任何帮助在哪里我应该看看如何解决这将是伟大的。为什么在生产中会得到null,而在提供相同凭据时却不进行调试?