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

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

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

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

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

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

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

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

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

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

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

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

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

С помощью бессерверного подключения можно подключиться к службам 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_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)

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

  • <YOUR_RESOURCE_GROUP>: имя группы ресурсов, в которые находятся ваши ресурсы.
  • <YOUR_DATABASE_SERVER_NAME>: имя сервера PostgreSQL. Оно должно быть уникальным в Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: отображаемое имя пользователя Microsoft Entra, отличного от администратора. Убедитесь, что имя является допустимым пользователем в клиенте Microsoft Entra.
  • <YOUR_LOCAL_IP_ADDRESS>: IP-адрес локального компьютера, с которого будет запущено приложение Spring Boot. Один из удобных способов найти его — открыть whatismyip.akamai.com.

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

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

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

Чтобы настроить администратора Microsoft Entra после создания сервера, выполните действия по управлению ролями Microsoft Entra в База данных Azure для PostgreSQL — гибкий сервер.

Примечание.

Гибкий сервер PostgreSQL может создавать несколько администраторов Microsoft Entra.

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

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

Экземпляры Базы данных Azure для PostgreSQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения. Чтобы вы могли использовать нашу базу данных, добавьте правило брандмауэра, которое разрешит локальному IP-адресу обращаться к серверу базы данных.

Так как вы настроили локальный IP-адрес ранее, вы можете открыть брандмауэр сервера, выполнив следующую команду:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

Если вы подключаетесь к серверу PostgreSQL из подсистема 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 postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

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

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

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

cat << EOF > create_ad_user_local.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF

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

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user_local.sql

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

rm create_ad_user_local.sql

Примечание.

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

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

Для локальной разработки убедитесь, что вы прошли проверку подлинности с той же учетной записью Microsoft Entra, которую вы назначили роль в PostgreSQL. Аутентификацию можно выполнить с помощью 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 PostgreSQL в URL-адресе JDBC. Определите расположения в коде, которые в настоящее время создаются java.sql.Connection для подключения к База данных Azure для PostgreSQL. Обновите url и user в файле application.properties , чтобы соответствовать следующим значениям:

    url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin
    user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME
    
  3. $AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME Замените две $AZ_DATABASE_SERVER_NAME переменные значением, настроенным в начале этой статьи.

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

После внесения этих изменений кода запустите приложение локально. Новая конфигурация должна получить локальные учетные данные, если вы вошли в совместимую интегрированную среду разработки или средство командной строки, например 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)

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

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

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

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

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

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

Примечание.

Если вы использовали команду service Подключение or, пропустите этот шаг.

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

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

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

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

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