Миграция Java-приложения для использования подключений без пароля к Базе данных Azure SQL

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

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

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

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

Аутентификация Microsoft Entra

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

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

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

Проверка подлинности базы данных SQL Azure

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

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

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

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

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

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

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

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

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

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

Замечание

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

Замечание

Так как драйвер JDBC для База данных SQL 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 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>: имя сервера Базы данных SQL Azure. Он должен быть уникальным в Azure.

1) Настройка базы данных SQL Azure

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

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

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

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

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

az sql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

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

Замечание

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

2) Переведите код приложения на использование подключений без пароля

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

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

    <dependency>
         <groupId>com.azure</groupId>
         <artifactId>azure-identity</artifactId>
         <version>1.5.4</version>
    </dependency>
    
  2. Включите аутентификацию с помощью управляемого удостоверения Microsoft Entra в URL JDBC.v Найдите в коде места, в которых сейчас создаётся java.sql.Connection для подключения к базе данных Azure SQL. Обновите код, чтобы он соответствовал следующему примеру:

    String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;"   
    Connection con = DriverManager.getConnection(url);
    
  3. Замените две $AZ_DATABASE_SERVER_NAME переменные и одну $AZ_DATABASE_NAME переменную значениями, настроенными в начале этой статьи.

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

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

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

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

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

Замечание

Azure также предоставляет Service Connector, который поможет подключить службу размещения к SQL Server. Используя Service Connector для настройки среды размещения, можно пропустить этап назначения ролей управляемому удостоверению, поскольку Service Connector выполняет это автоматически. В следующем разделе описывается, как настроить среду размещения Azure двумя способами: один через соединитель службы и другой путем настройки каждой среды размещения напрямую.

Это важно

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

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

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

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

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

Вы также можете назначить управляемое удостоверение в среде хостинга 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)

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

Затем предоставьте разрешения управляемой идентификации, которую вы создали, для доступа к базе данных SQL.

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

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

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

Дальнейшие шаги

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

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