Упражнение. Ограничение доступа к среде приложений контейнеров Azure
В этом уроке необходимо убедиться, что база данных PostgreSQL доступна только приложением Quarkus, а не другими внешними клиентами. В настоящее время вы можете получить доступ к базе данных из любого клиента с помощью Azure CLI и локального запуска Quarkus. Эта конфигурация не безопасна. Необходимо добавить правило брандмауэра, чтобы разрешить доступ к серверу базы данных только IP-адреса в среде приложений контейнеров Azure.
Доступ к серверу 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_2023-1-3_10-20-4 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
Эта команда возвращает список всех элементов для выполнения из базы данных. Доступ к серверу PostgreSQL можно получить из приложения Quarkus, работающего в службе Azure, но к нему не удается получить доступ извне Azure.