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