Учебник. Создание приложения-функции, которое подключается к службам Azure, с помощью удостоверений вместо секретов

В этом руководстве показано, как настроить приложение-функцию с помощью удостоверений Microsoft Entra вместо секретов или строка подключения, где это возможно. Использование удостоверений позволяет избежать случайной утечки конфиденциальных секретов и помогает получить более четкое представление о способах доступа к данным. Дополнительные сведения о подключениях на основе удостоверений см. в разделе Настройка подключения на основе удостоверений.

Хотя представленные процедуры работают обычно для всех языков, сейчас этот учебник поддерживает только функции библиотеки классов C# в Windows.

В этом руководстве описано следующее:

  • Создание приложения-функции в Azure с помощью шаблона ARM
  • Включение назначенных системой и назначенных пользователем управляемых удостоверений в приложении-функции
  • Создание назначений ролей, предоставляющих разрешения другим ресурсам
  • Перемещение секретов, которые нельзя заменить удостоверениями, в Azure Key Vault
  • Настройка приложения для подключения к хранилищу узлов по умолчанию с помощью управляемого удостоверения

По завершении работы с этим учебником следует выполнить инструкции по использованию подключений на основе удостоверений вместо секретов с триггерами и привязками.

Необходимые компоненты

Зачем использовать удостоверение?

Управление секретами и учетными данными является распространенной проблемой для команд всех размеров. Секреты необходимо защитить от кражи или случайного раскрытия, а также может потребоваться периодически менять их. Многие службы Azure позволяют использовать удостоверение в идентификаторе Microsoft Entra для проверки подлинности клиентов и проверка с разрешениями, которые можно быстро изменить и отозвать. Это обеспечивает больший контроль над безопасностью приложений с меньшими эксплуатационными издержками. Удостоверение может быть реальным пользователем, например разработчиком приложения, или работающим приложением в Azure с управляемым удостоверением.

Некоторые службы не поддерживают проверку подлинности Microsoft Entra, поэтому секреты могут по-прежнему требоваться вашими приложениями. Однако они могут храниться в Azure Key Vault, что помогает упростить жизненный цикл управления для ваших секретов. Доступ к хранилищу ключей также контролируется с помощью удостоверений.

Поняв, как использовать удостоверения вместо секретов, когда это возможно, и использовать Key Vault, когда это невозможно, вы сможете снизить риски, эксплуатационные расходы и в целом повысить безопасность приложений.

Создание приложения-функции, которое использует Key Vault для необходимых секретов

Файлы Azure — это пример службы, которая еще не поддерживает проверку подлинности Microsoft Entra для общих папок S МБ. Служба "Файлы Azure" — это файловая система по умолчанию для развертываний Windows в планах "Премиум" и "Потребление". Хотя мы можем полностью удалить службу "Файлы Azure", из-за этого вы можете столкнуться с нежелательными ограничениями. Вместо этого вы переместите строку подключения службы "Файлы Azure" в Azure Key Vault. Таким образом управление осуществляется централизованно с доступом, управляемым удостоверением.

создать Azure Key Vault;

Сначала вам потребуется хранилище ключей для хранения секретов. Вы настроите его на использование управления доступом на основе ролей Azure, чтобы определить, кто может читать секреты из хранилища.

  1. На портале Azure выберите Создать ресурс (+).

  2. На странице Создать ресурс выберите Безопасность>Key Vault.

  3. На странице Основное настройте хранилище ключей согласно приведенной ниже таблице.

    Вариант Предлагаемое значение Description
    Подписка Ваша подписка Подписка, в которой создано приложение-функция.
    Группа ресурсов myResourceGroup Имя для новой группы ресурсов, в которой создается приложение-функция.
    Имя хранилища ключей Глобально уникальное имя Имя, которое идентифицирует ваше новое хранилище ключей. Имя хранилища должно содержать только буквы, цифры и дефисы и не может начинаться с цифры.
    Ценовая категория Standard Параметры выставления счетов. Уровня "Стандартный" достаточно для этого учебника.
    Регион Предпочтительный регион Выберите ближайший регион или регион рядом с другими службами, к которому получают доступ ваши функции.

    Используйте значения по умолчанию для разделов "Параметры восстановления".

  4. Запишите имя, которое вы использовали, так как оно понадобится позже.

  5. Нажмите кнопку Далее: Политика доступа, чтобы перейти на вкладку Политика доступа.

  6. В разделе Модель разрешений выберите Управление доступом на основе ролей Azure.

  7. Выберите Review + create (Просмотреть и создать). Просмотрите конфигурацию и щелкните Создать.

Настройка удостоверения и разрешений для приложения

Чтобы использовать Azure Key Vault, приложение должно иметь удостоверение, которому может быть предоставлено разрешение на чтение секретов. Это приложение будет использовать назначенное пользователем удостоверение, чтобы можно было настроить разрешения до создания приложения. Дополнительные сведения об управляемых удостоверениях для Функций Azure см. в статье Использование управляемых удостоверений в функциях Azure.

  1. На портале Azure выберите Создать ресурс (+).

  2. На странице Создать ресурс выберите Удостоверение>Управляемое удостоверение, назначаемое пользователем.

  3. На странице Основное настройте удостоверение согласно приведенной ниже таблице.

    Вариант Предлагаемое значение Description
    Подписка Ваша подписка Подписка, в которой создано приложение-функция.
    Группа ресурсов myResourceGroup Имя для новой группы ресурсов, в которой создается приложение-функция.
    Регион Предпочтительный регион Выберите ближайший регион или регион рядом с другими службами, к которому получают доступ ваши функции.
    Название Глобально уникальное имя Имя, идентифицирующее новое удостоверение, назначаемое пользователем.
  4. Выберите Review + create (Просмотреть и создать). Просмотрите конфигурацию и щелкните Создать.

  5. Когда удостоверение будет создано, перейдите к нему на портале. Выберите Свойства и запишите идентификатор ресурса, так как он понадобится позже.

  6. Выберите Azure Role Assignments (Назначения ролей Azure) и щелкните Добавление назначения роли (предварительная версия).

  7. На странице Добавление назначения роли (предварительная версия) используйте параметры, как показано в таблице ниже.

    Вариант Предлагаемое значение Description
    Область применения Key Vault Область — это набор ресурсов, к которому применяется назначение ролей. Область имеет уровни, которые наследуются на более низких уровнях. Например, если выбрать область подписки, назначение ролей будет применяться ко всем группам ресурсов и ресурсам в подписке.
    Подписка Ваша подписка Подписка, в которой создано приложение-функция.
    Ресурс Хранилище ключей Созданное ранее хранилище ключей.
    Роль Пользователь секретов хранилища ключей Роль — это коллекция предоставляемых разрешений. Пользователь секретов хранилища ключей предоставляет разрешение для удостоверения на чтение значений секретов из хранилища.
  8. Выберите Сохранить. Для отображения роли при обновлении списка назначений ролей для удостоверения может потребоваться несколько минут.

Теперь удостоверение сможет считывать секреты, хранящиеся в хранилище ключей. Далее в этом учебнике вы добавите дополнительные назначения ролей для разных целей.

Создание шаблона для создания приложения-функции

Интерфейс портала для создания приложения-функции не взаимодействует с Azure Key Vault, поэтому необходимо создать и изменить шаблон Azure Resource Manager. Затем этот шаблон можно использовать для создания приложения-функции, ссылающегося на строку подключения Файлов Azure из хранилища ключей.

Важно!

Не создавайте приложение-функцию, пока не измените шаблон ARM. Конфигурацию Файлов Azure необходимо настроить во время создания приложения.

  1. На портале Azure выберите Создать ресурс (+).

  2. На странице Создать ресурс выберите Вычисления>Приложение-функция.

  3. На странице Основное используйте приведенную ниже таблицу, чтобы настроить приложение-функцию.

    Вариант Предлагаемое значение Description
    Подписка Ваша подписка Подписка, в которой создано приложение-функция.
    Группа ресурсов myResourceGroup Имя для новой группы ресурсов, в которой создается приложение-функция.
    Имя приложения-функции Глобально уникальное имя Имя, которое идентифицирует ваше новое приложение-функцию. Допустимые символы: a-z (без учета регистра), 0-9 и -.
    Опубликовать Код Параметр для публикации файлов кода или контейнера Docker.
    Стек среды выполнения .NET В этом руководстве используется .NET.
    Регион Предпочтительный регион Выберите ближайший регион или регион рядом с другими службами, к которому получают доступ ваши функции.
  4. Выберите Review + create (Просмотреть и создать). Приложение использует значения по умолчанию на странице Размещение и Мониторинг. Вы можете ознакомиться с параметрами по умолчанию, и они будут включены в создаваемый шаблон ARM.

  5. Вместо создания приложения-функции выберите Скачать шаблон для автоматизации, который находится справа от кнопки Далее.

  6. На странице шаблонов выберите Развернуть, после чего на странице "Настраиваемое развертывание" выберите Изменение шаблона.

    Screenshot of where to find the deploy button at the top of the template screen.

Изменение шаблона

Теперь измените шаблон, чтобы сохранить строку подключения Файлов Azure в Key Vault и разрешить приложению-функции ссылаться на него. Прежде чем продолжить, убедитесь, что у вас есть следующие значения из предыдущих разделов:

  • ИД ресурса управляемого удостоверения, назначаемого пользователем
  • имя хранилища ключей.

Примечание.

Если нужно создать полный шаблон для автоматизации, необходимо включить определения для ресурсов назначения ролей и удостоверений с соответствующими предложениями dependsOn. При этом будут заменены предыдущие шаги, использовавшиеся на портале. Обратитесь к руководству по Azure Resource Manager и документации для каждой службы.

  1. В редакторе найдите начало массива resources. Перед определением приложения-функции добавьте следующий раздел, который помещает строку подключения Файлов Azure в Key Vault. Вместо "VAULT_NAME" укажите имя вашего хранилища ключей.

    {
        "type": "Microsoft.KeyVault/vaults/secrets",
        "apiVersion": "2016-10-01",
        "name": "VAULT_NAME/azurefilesconnectionstring",
        "properties": {
            "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
        },
        "dependsOn": [
            "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]"
        ]
    },
    
  2. В определении ресурса приложения-функции (для параметра type которого задано значение Microsoft.Web/sites) добавьте Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring в массив dependsOn. Снова замените "VAULT_NAME" именем вашего хранилища ключей. Таким образом приложение не будет создано до определения секрета. Массив dependsOn должен выглядеть так, как показано в следующем примере:

        {
            "type": "Microsoft.Web/sites",
            "apiVersion": "2018-11-01",
            "name": "[parameters('name')]",
            "location": "[parameters('location')]",
            "tags": null,
            "dependsOn": [
                "microsoft.insights/components/idcxntut",
                "Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring",
                "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]"
            ],
            // ...
        }
    
  3. Добавьте блок identity из следующего примера в определение ресурса приложения функции. Замените "IDENTITY_RESOURCE_ID" ИД ресурса своего удостоверения, назначенного пользователю.

    {
        "apiVersion": "2018-11-01",
        "name": "[parameters('name')]",
        "type": "Microsoft.Web/sites",
        "kind": "functionapp",
        "location": "[parameters('location')]",
        "identity": {
            "type": "SystemAssigned,UserAssigned",
            "userAssignedIdentities": {
                "IDENTITY_RESOURCE_ID": {}
            }
        },
        "tags": null,
        // ...
    }
    

    Этот блок identity также задает назначаемое системой удостоверение, которое будет использоваться далее в этом учебнике.

  4. Добавьте свойство keyVaultReferenceIdentity в объект properties для приложения-функции, как показано в примере ниже. Замените "IDENTITY_RESOURCE_ID" ИД ресурса своего удостоверения, назначенного пользователю.

    {
        // ...
         "properties": {
                "name": "[parameters('name')]",
                "keyVaultReferenceIdentity": "IDENTITY_RESOURCE_ID",
                // ...
         }
    }
    

    Эта конфигурация необходима, так как для приложения можно настроить несколько удостоверений, назначенных пользователем. Всякий раз, когда необходимо использовать назначенное пользователем удостоверение, необходимо указать, какое из них, с помощью идентификатора. Это не относится к удостоверениям, назначенным системой, так как приложение будет иметь только одно из них. Во многих функциях, использующих управляемое удостоверение, предполагается, что им по умолчанию следует использовать назначенное системой удостоверение.

  5. Теперь найдите объекты JSON, определяющие параметр приложения WEBSITE_CONTENTAZUREFILECONNECTIONSTRING, который должен выглядеть, как в следующем примере:

    {
        "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]"
    },
    
  6. Замените поле value ссылкой на секрет, как показано в следующем примере. Вместо "VAULT_NAME" укажите имя вашего хранилища ключей.

    {
        "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
        "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', 'VAULT_NAME', 'azurefilesconnectionstring')).secretUri, ')')]"
    },
    
  7. Щелкните Сохранить, чтобы сохранить обновленный шаблон ARM.

Развертывание измененного шаблона

  1. Убедитесь, что параметры создания, включая группу ресурсов, по-прежнему верны, и выберите Просмотр и создание.

  2. После проверки шаблона запишите имя учетной записи службы хранилища, так как эта учетная запись будет использоваться позже. Наконец, выберите Создать, чтобы создать ресурсы Azure и развернуть код в приложении-функции.

  3. После завершения развертывания выберите пункт Перейти к группе ресурсов, а затем — новое приложение-функцию.

Поздравляем! Вы успешно создали приложение-функцию для ссылки на строку подключения Файлов Azure из Azure Key Vault.

Каждый раз, когда приложению потребуется добавить ссылку на секрет, необходимо просто определить новый параметр приложения, указывающий на значение, хранящееся в Key Vault. Дополнительные сведения об этом см. в статье Использование ссылок на Key Vault в Функциях Azure.

Совет

Строка подключения Application Insights и ее ключ инструментирования не считаются секретами и ее можно получить из App Insights с помощью разрешений читателя. Их не нужно перемещать в Key Vault, хотя это наверняка можно.

Использование управляемого удостоверения для AzureWebJobs служба хранилища

Далее будет использоваться назначенное системой удостоверение, настроенное на предыдущих шагах для подключения AzureWebJobsStorage. AzureWebJobsStorage используется средой выполнения Функций и несколькими триггерами и привязками для координации между несколькими выполняющимися экземплярами. Он необходим для работы приложения-функции, и, как и для Файлов Azure, по умолчанию при создании нового приложения-функции для него настраивается строка подключения.

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

Подобно действиям, выполненным ранее с помощью назначенного пользователем удостоверения и хранилища ключей, вы создадите назначение роли, предоставляющее системному удостоверению доступ к учетной записи хранения.

  1. На портале Azure перейдите к учетной записи хранения, созданной ранее в приложении-функции.

  2. Выберите Управление доступом (IAM). Здесь можно просмотреть и настроить, кто имеет доступ к ресурсу.

  3. Щелкните Добавить, затем выберите Добавить назначение ролей.

  4. Найдите элемент Владелец данных BLOB-объектов хранилища, выберите его и нажмите кнопку Далее

  5. На вкладке Участники в разделе Назначение доступа для выберите Управляемое удостоверение

  6. Щелкните Выбор участников, чтобы открыть панель Выбор управляемых удостоверений.

  7. Убедитесь, что для значения Подписка указана подписка, в которой вы создали ресурсы ранее.

  8. В селекторе Управляемое удостоверение выберите Приложение-функция из категории Управляемое удостоверение, назначаемое системой. Метка "Приложение-функция" может включать число в скобках рядом с ней, указывающее на число приложений в подписке с удостоверениями, назначаемыми системой.

  9. Ваше приложение отобразится в списке под полями для ввода данных. Если вы не видите его, воспользуйтесь полем Выбор, чтобы отфильтровать результаты по имени вашего приложения.

  10. Щелкните свое приложение. Оно должно переместиться вниз в раздел Выбранные участники. Щелкните Выбрать.

  11. На экране Добавление назначения ролей щелкните Проверка + назначение. Просмотрите конфигурацию и щелкните Проверка + назначение.

Совет

Если планируется использовать приложение-функцию для функции, активируемой большим двоичным объектом, необходимо повторить эти действия для ролей Участник учетной записи хранения и Участник для данных очереди хранилища в учетной записи, используемой AzureWebJobsStorage. Дополнительные сведения см. в статье Подключения на основе удостоверений, активируемые BLOB-объектом.

Изменение конфигурации AzureWebJobsStorage

Затем вы обновите приложение-функцию, чтобы использовать назначенное ему удостоверение при использовании службы BLOB-объектов для хранилища узла.

Важно!

Конфигурация AzureWebJobsStorage используется некоторыми триггерами и привязками, и эти расширения должны иметь возможность использовать подключения на основе удостоверений. Для приложений, использующих триггеры больших двоичных объектов или триггеры концентратора событий, может потребоваться обновить эти расширения. Так как для этого приложения не определены никакие функции, проблема еще не возникает. Дополнительные сведения об этом требовании см. в разделе Подключение размещения хранилища с удостоверением.

Аналогичным образом AzureWebJobsStorage используется для артефактов развертывания при использовании сборки на стороне сервера в плане "Потребление Linux". При включении подключений на основе удостоверений AzureWebJobsStorage в плане "Потребление Linux" вам потребуется выполнить развертывание с помощью внешнего пакета развертывания.

  1. На портале Azure перейдите к своему приложению-функции.

  2. В разделе Параметры выберите пункт Конфигурация.

  3. Нажмите кнопку Изменить рядом с параметром приложения AzureWebJobsStorage и измените его на основе следующих значений.

    Вариант Предлагаемое значение Описание:
    Название AzureWebJobsStorage__accountName Измените имя с AzureWebJobsStorage на точное имя AzureWebJobsStorage__accountName. Этот параметр указывает узлу использовать удостоверение вместо того, чтобы искать сохраненный секрет. Новый параметр использует двойное подчеркивание (__), которое является специальным символом в параметрах приложения.
    значение Имя вашей учетной записи Обновите имя из строки подключения, используя только параметр StorageAccountName.

    Такая конфигурация позволит системе понять, что для подключения к ресурсу необходимо использовать удостоверение.

  4. Нажмите кнопку ОК, а затем Сохранить>Продолжить, чтобы сохранить изменения.

Вы удалили требование к строке подключения к хранилищу для AzureWebJobsStorage, настроив приложение для подключения к большим двоичным объектам с помощью управляемых удостоверений.

Примечание.

Синтаксис __accountName уникален для подключения AzureWebJobsStorage и не может использоваться для других подключений к хранилищу. Чтобы узнать, как определить другие подключения, просмотрите ссылки для каждого триггера и привязки, используемых приложением.

Следующие шаги

В этом учебнике продемонстрировано, как создать приложение-функцию без сохранения секретов в его конфигурации.

В следующем учебнике описывается, как использовать удостоверение в подключениях триггера и привязки.