Использование MSI для доступа к Azure Key Vault в C#. Net - PullRequest
0 голосов
/ 07 февраля 2020

Поскольку я новичок в Azure, этот вопрос может быть глупым. Я пытаюсь создать сервис для предоставления и управления кластером виртуальных машин. Из соображений безопасности я не хочу помещать конфиденциальные данные в каждый кластер. Поэтому я решил предоставить хранилище ключей Azure для каждого кластера для хранения этих данных, а также создать MSI (управляемый идентификатор) и отправить его на каждый узел кластера, чтобы vm мог получить доступ к хранилищу ключей для извлечения секретов.

На стороне службы мне нужно подготовить vms, хранилище ключей и MSI. Присвойте MSI каждой виртуальной машине, а MSI предоставьте право доступа к AKV. Вот мои вопросы:

  1. Системный MSI против пользовательского MSI, так как кластер будет иметь несколько узлов, чтобы уменьшить задержку предоставления всего кластера, пользовательский MSI, вероятно, является лучшей идеей, поскольку мы могли бы предоставить один MSI и предоставить доступ один раз. Для системного MSI нам нужно предоставить доступ для каждой личности. Но недостатком является то, что мы должны удалить MSI при удалении всего кластера. Каково ваше мнение по этому поводу?
  2. Тупой вопрос, как предоставить MSI, Azure Key хранилище и предоставить доступ. Можете ли вы показать мне пример кода? Я попытался найти publi c API do c и учебное пособие в Интернете, но не получилось.

1 Ответ

1 голос
/ 07 февраля 2020

1. В чем разница между назначенным системой и назначенным пользователем управляемым идентификатором?

Согласно моему исследованию, назначенный системой управляемый идентификатор активируется непосредственно на Azure экземпляр службы. Жизненный цикл назначенного системой удостоверения напрямую связан с экземпляром службы Azure, на котором он включен. Если экземпляр удален, Azure автоматически очищает учетные данные и идентификационные данные в Azure AD.

Но назначенный пользователем управляемый идентификационный номер создается как отдельный ресурс Azure. После создания идентификатора его можно назначить одному или нескольким Azure экземплярам службы. Жизненный цикл назначенного пользователем удостоверения управляется отдельно от жизненного цикла Azure экземпляров службы, которым он назначен.

Подробнее см. В документе .

2. Как подготовить MSI, Azure Key хранилище и предоставить доступ

Предоставить назначенный пользователем управляемый идентификатор

Согласно моим исследованиям, если мы Если мы хотим предоставить назначенный пользователем управляемый идентификатор, мы можем использовать Azure REST API , Azure Powershell и Azure CLI

Например,

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. Позвоните остальным 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>"

Provision Azure Key хранилище и предоставьте доступ

Согласно моему исследованию, если мы хотим реализовать это, мы можем, если мы хотим предоставить пользователю назначенный управляемый идентификатор, мы можем использовать Azure REST API , Azure Powershell , Azure CLI и SDK (например, net). Для получения более подробной информации, пожалуйста, обратитесь к документу

Например

Azure Rest API

a. Получить токен доступа с помощью Azure CLI

az login
az account get-access-token

b. Позвоните остальным api

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
  }
}

. Net SDK

a. создать субъект обслуживания с помощью Azure CLI

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()
...