Упражнение. Ограничение доступа к среде приложений контейнеров Azure
В этом уроке необходимо убедиться, что база данных PostgreSQL доступна только приложением Quarkus, а не другими внешними клиентами. В настоящее время вы можете получить доступ к базе данных из любого клиента с помощью Azure CLI и локального запуска Quarkus. Эта конфигурация не безопасна. Необходимо добавить правило брандмауэра, чтобы допустить доступ к серверу базы данных только для IP-адресов внутри среды Azure Container Apps.
Доступ к серверу PostgreSQL с помощью интерфейса командной строки
Сначала убедитесь, что вы можете получить доступ к серверу PostgreSQL с помощью Azure CLI. Для этого выполните следующую команду:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
Вы должны видеть содержимое базы данных. Если это возможно, доступ к базе данных можно получить за пределами среды.
Удалите разрешающее правило брандмауэра
База данных Azure для PostgreSQL обеспечивает безопасность по умолчанию. Его брандмауэр обычно не разрешает входящие подключения. Но при создании сервера PostgreSQL вы указали параметр --public-access "All"
, чтобы включить внешний доступ, который настроит брандмауэр, открытый для общественности.
Вы можете перечислить существующие правила брандмауэра, выполнив следующую команду:
az postgres flexible-server firewall-rule list \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
Вы увидите следующие выходные данные:
EndIpAddress Name ResourceGroup StartIpAddress
--------------- --------------------------- ---------------------- ----------------
255.255.255.255 AllowAll_2025-2-26_16-57-40 rgazure-deploy-quarkus 0.0.0.0
Обратите внимание, что диапазон разрешенных IP-адресов 0.0.0.0
через 255.255.255.255
. Такое правило брандмауэра позволяет любому клиенту получить доступ к базе данных. Чтобы обеспечить доступ к базе данных только приложению Quarkus, необходимо обновить правила брандмауэра сервера PostgreSQL.
В этом случае достаточно просто удалить публичное правило. Чтобы удалить его, выполните следующую команду:
az postgres flexible-server firewall-rule delete \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name <name of the AllowAll firewall rule> \
--yes
Теперь попробуйте выполнить запрос к базе данных, выполнив инструкцию SQL из ИНТЕРФЕЙСА командной строки:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
Вызов в итоге прерывается. Вы должны увидеть это сообщение:
Unable to connect to flexible server: connection to server failed: Operation timed out
Так как вы удалили все правила брандмауэра, теперь даже приложение Quarkus не может получить доступ к базе данных. Если вы попытаетесь получить задачи из базы данных, запрос завершится сбоем. Выполните следующий запрос cURL:
curl https://$AZ_APP_URL/api/todos
Добавление нового правила брандмауэра
Необходимо настроить брандмауэр, чтобы разрешить доступ только к приложению Quarkus. Необходимо добавить новое правило брандмауэра. Чтобы добавить правило, выполните следующую команду:
az postgres flexible-server firewall-rule create \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--rule-name "Allow_Azure-internal-IP-addresses" \
--start-ip-address "0.0.0.0" \
--end-ip-address "0.0.0.0"
Настройка start-ip-address
и end-ip-address
для 0.0.0.0
разрешает доступ ко всем внутренним IP-адресам Azure, но не позволяет доступ из внешних IP-адресов. Эта практика помогает защитить базу данных от внешнего доступа.
Если вы попытаетесь получить доступ к базе данных из интерфейса командной строки, выполнив следующую команду, попытка должна завершиться ошибкой:
az postgres flexible-server execute \
--name "$AZ_POSTGRES_SERVER_NAME" \
--database-name "$AZ_POSTGRES_DB_NAME" \
--admin-user "$AZ_POSTGRES_USERNAME" \
--admin-password "$AZ_POSTGRES_PASSWORD" \
--querytext "select * from Todo" \
--output table
Но если вы попытаетесь использовать следующую команду, чтобы получить задачи из базы данных с помощью приложения Quarkus, работающего в контейнерных приложениях, попытка завершается успешно:
curl https://$AZ_APP_URL/api/todos
Эта команда возвращает список всех to-do элементов из базы данных. Доступ к серверу PostgreSQL можно получить из приложения Quarkus, работающего в службе Azure, но к нему не удается получить доступ извне Azure.