Учебник. Создание приложения-функции, которое подключается к службам 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 для общих папок блока сообщений сервера (SMB). Служба "Файлы Azure" — это файловая система по умолчанию для развертываний Windows в планах "Премиум" и "Потребление". Хотя мы могли бы полностью удалить Файлы Azure, это приведет к ограничениям, которые могут не потребоваться. Вместо этого вы перемещаете Файлы Azure строка подключения в Azure Key Vault. Таким образом, он централизованно управляется с доступом, контролируемым удостоверением.

создать Azure Key Vault;

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

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

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

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

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

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

  4. Запишите используемое имя для последующего использования.

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

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

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

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

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

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

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

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

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

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

  6. Выберите назначения ролей 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. На странице шаблонов выберите Развернуть, после чего на странице "Настраиваемое развертывание" выберите Изменение шаблона.

    Снимок экрана: кнопка

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

Теперь вы измените шаблон, чтобы сохранить Файлы 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, хотя это наверняка можно.

Использование управляемого удостоверения для AzureWebJobsStorage

Затем вы используете назначаемое системой удостоверение, настроенное на предыдущих шагах для 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. Этот параметр указывает узлу использовать удостоверение вместо поиска сохраненного секрета. Новый параметр использует двойное подчеркивание (__), которое является специальным символом в параметрах приложения.
    Value Имя вашей учетной записи Обновите имя из строки подключения, используя только параметр StorageAccountName.

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

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

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

Примечание.

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

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

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

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