Перенос приложения на использование бессерверных подключений с База данных Azure для MySQL

В этой статье объясняется, как перенести традиционные методы проверки подлинности на более безопасные, без пароля подключения с База данных Azure для MySQL.

Запросы приложений к База данных Azure для MySQL должны проходить проверку подлинности. База данных Azure для MySQL предоставляет несколько различных способов безопасного подключения приложений. Одним из способов является использование паролей. Тем не менее, по возможности следует приоритизировать подключения без пароля в приложениях.

Сравнение параметров проверки подлинности

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

Проверка подлинности Microsoft Entra

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

Использование идентификатора Microsoft Entra для проверки подлинности обеспечивает следующие преимущества:

  • Проверка подлинности пользователей в службах Azure в единообразном режиме.
  • Управление политиками паролей и сменой паролей в одном месте.
  • Несколько форм проверки подлинности, поддерживаемых идентификатором Microsoft Entra, что может устранить необходимость хранения паролей.
  • Клиенты могут управлять разрешениями базы данных с помощью внешних групп (Идентификатор Microsoft Entra).
  • Проверка подлинности Microsoft Entra использует пользователей базы данных MySQL для проверки подлинности удостоверений на уровне базы данных.
  • Поддержка проверки подлинности на основе маркеров для приложений, подключающихся к База данных Azure для MySQL.

Проверка подлинности MySQL

Вы можете создавать учетные записи в MySQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные будут храниться в user таблице. Так как эти пароли хранятся в MySQL, вам нужно самостоятельно управлять сменой паролей.

Хотя можно подключиться к База данных Azure для MySQL с паролями, их следует использовать с осторожностью. Вы должны быть старательными, чтобы никогда не предоставлять пароли в небезопасном расположении. Любой, кто получает доступ к паролям, может пройти проверку подлинности. Например, существует риск того, что злоумышленник может получить доступ к приложению, если строка подключения случайно проверка в систему управления версиями, отправленную через небезопасную электронную почту, вставленную в неправильный чат или просматриваемую кем-то, кто не должен иметь разрешения. Вместо этого рекомендуется обновить приложение для использования подключений без пароля.

Знакомство с бессерверными подключениями

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

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

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

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

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

В локальной среде разработки можно пройти проверку подлинности с помощью Azure CLI, Azure PowerShell, Visual Studio или подключаемых модулей Azure для Visual Studio Code или IntelliJ. В этом случае вы можете использовать эти учетные данные в приложении вместо настройки свойств.

При развертывании приложений в среде размещения Azure, такой как виртуальная машина, можно назначить управляемое удостоверение в этой среде. Затем вам не потребуется предоставить учетные данные для подключения к службам Azure.

Примечание.

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

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

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

0) Подготовка рабочей среды

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

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export AZ_MYSQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_MYSQL_AD_MI_USERNAME=<YOUR_AZURE_AD_MI_DISPLAY_NAME>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

Замените заполнители следующими значениями, которые используются в этой статье:

  • <YOUR_RESOURCE_GROUP>: имя группы ресурсов, в которые находятся ваши ресурсы.
  • <YOUR_DATABASE_SERVER_NAME>: имя сервера MySQL, который должен быть уникальным в Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: отображаемое имя пользователя Microsoft Entra, отличного от администратора. Убедитесь, что имя является допустимым пользователем в клиенте Microsoft Entra.
  • <YOUR_AZURE_AD_MI_DISPLAY_NAME>: отображаемое имя пользователя Microsoft Entra для управляемого удостоверения. Убедитесь, что имя является допустимым пользователем в клиенте Microsoft Entra.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: имя назначаемого пользователем управляемого сервера удостоверений, которое должно быть уникальным в Azure.

1) Настройка База данных Azure для MySQL

1.1) Включение проверки подлинности на основе идентификатора Microsoft Entra

Чтобы использовать доступ к идентификатору Microsoft Entra с База данных Azure для MySQL, сначала необходимо задать пользователя администратора Microsoft Entra. Только пользователь Microsoft Entra Администратор может создавать и включать пользователей для проверки подлинности на основе идентификаторов Microsoft Entra.

Если вы используете Azure CLI, выполните следующую команду, чтобы убедиться, что у вас достаточно разрешений:

az login --scope https://graph.microsoft.com/.default

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

az identity create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_USER_IDENTITY_NAME

Важно!

После создания удостоверения, назначаемого пользователем, попросите глобального Администратор istrator или привилегированного Администратор istrator предоставить следующие разрешения для этого удостоверения: User.Read.Allи GroupMember.Read.AllApplication.Read.ALL. Дополнительные сведения см. в разделе "Разрешения" проверки подлинности Active Directory.

Выполните следующую команду, чтобы назначить удостоверение серверу MySQL для создания администратора Microsoft Entra:

az mysql flexible-server identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --identity $AZ_USER_IDENTITY_NAME

Затем выполните следующую команду, чтобы задать администратора Microsoft Entra:

az mysql flexible-server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID \
    --identity $AZ_USER_IDENTITY_NAME

Эта команда установит администратора Microsoft Entra текущий пользователь, вошедшего в систему.

Примечание.

На сервере MySQL можно создать только одного администратора Microsoft Entra. Выбор другого перезаписывает существующий администратор Microsoft Entra, настроенный для сервера.

2) Настройка База данных Azure для MySQL для локальной разработки

2.1) Настройка правила брандмауэра для локального IP-адреса

Экземпляры Базы данных Azure для MySQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения.

Этот шаг можно пропустить, если вы используете Bash, так как flexible-server create команда уже обнаружила локальный IP-адрес и установите ее на сервере MySQL.

Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить идентификатор узла WSL в брандмауэр. Получите IP-адрес хост-компьютера, выполнив следующую команду в WSL:

cat /etc/resolv.conf

Скопируйте IP-адрес после термина nameserver, а затем используйте следующую команду, чтобы задать переменную среды для IP-адреса WSL:

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Затем используйте следующую команду, чтобы открыть брандмауэр сервера в приложении на основе WSL:

az mysql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) Создание пользователя, отличного от администратора MySQL, и предоставление разрешения

Затем создайте пользователя Microsoft Entra без администратора и предоставьте ему все разрешения для $AZ_DATABASE_NAME базы данных. Имя базы данных $AZ_DATABASE_NAME можно изменить в соответствии с вашими потребностями.

Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';
FLUSH privileges;
EOF

Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Теперь используйте следующую команду, чтобы удалить временный файл скрипта SQL:

rm create_ad_user.sql

Примечание.

Дополнительные сведения о создании пользователей MySQL см. в статье "Создание пользователей" в База данных Azure для MySQL.

3) Вход и перенос кода приложения для использования бессерверных подключений

Для локальной разработки убедитесь, что вы прошли проверку подлинности с той же учетной записью Microsoft Entra, которую вы назначили роли в MySQL. Аутентификацию можно выполнить с помощью Azure CLI, Visual Studio, Azure PowerShell или других средств, таких как IntelliJ.

Войдите в Azure с помощью Azure CLI, выполнив следующую команду:

az login

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

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

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Включите подключаемый модуль проверки подлинности Azure MySQL в URL-адресе JDBC. Определите расположения в коде, которые в настоящее время создаются java.sql.Connection для подключения к База данных Azure для MySQL. Обновите url и user в файле application.properties , чтобы соответствовать следующим значениям:

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    

    Примечание.

    Если вы используете MysqlConnectionPoolDataSource класс в качестве источника данных в приложении, обязательно удалите defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin его из URL-адреса.

    url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
    user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME
    
  3. Замените одну переменную, одну $AZ_DATABASE_SERVER_NAME$AZ_DATABASE_NAME переменную и одну $AZ_MYSQL_AD_NON_ADMIN_USERNAME переменную значениями, настроенными в начале этой статьи.

  4. password Удалите url-адрес JDBC из URL-адреса JDBC.

Локальный запуск приложения

После внесения этих изменений кода запустите приложение локально. Новая конфигурация должна получить локальные учетные данные, если вы вошли в совместимую интегрированную среду разработки или средство командной строки, например Azure CLI, Visual Studio или IntelliJ. Роли, назначенные локальному пользователю разработки в Azure, позволят приложению подключаться к службе Azure локально.

4) Настройка среды размещения Azure

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

В этом разделе описано, как разрешить приложению выполняться в среде размещения Azure без пароля:

  • Назначьте управляемое удостоверение для среды размещения Azure.
  • Назначьте роли управляемому удостоверению.

Примечание.

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

Важно!

Для команд Подключение службы требуется Azure CLI 2.41.0 или более поздней версии.

Назначение управляемого удостоверения с помощью портал Azure

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

  1. На главной странице обзора экземпляра службы приложение Azure выберите Удостоверение в области навигации.

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

    Screenshot of Azure portal Identity page of App Service resource with System assigned tab showing and Status field highlighted.

Вы также можете назначить управляемое удостоверение в среде размещения Azure с помощью Azure CLI.

Управляемое удостоверение можно назначить экземпляру службы приложение Azure с помощью команды az webapp identity assign, как показано в следующем примере:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

Назначение роли управляемому удостоверению

Затем предоставьте разрешения управляемому удостоверению, назначенному для доступа к экземпляру MySQL.

Эти действия создадут пользователя Microsoft Entra для управляемого удостоверения и предоставят ему все разрешения для базы данных $AZ_DATABASE_NAME . Имя базы данных $AZ_DATABASE_NAME можно изменить в соответствии с вашими потребностями.

Сначала создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:

export AZ_MYSQL_AD_MI_USERID=$(az ad sp show --id $AZ_MI_OBJECT_ID --query appId --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_MI_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_MI_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_MI_USERNAME'@'%';
FLUSH privileges;
EOF

Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:

mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Теперь используйте следующую команду, чтобы удалить временный файл скрипта SQL:

rm create_ad_user.sql

Тестирование приложения

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

Обновите код, чтобы использовать пользователя, созданного для управляемого удостоверения:

properties.put("user", "$AZ_MYSQL_AD_MI_USERNAME");

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

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

Из этого учебника вы узнали, как выполнить переход приложения на подключение без пароля.

Дополнительные сведения о понятиях, описанных в этой статье, см. в следующих ресурсах: