Упражнение. Ограничение доступа к среде приложений контейнеров 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.