Exercício – Restringir o acesso ao ambiente dos Aplicativos de Contêiner do Azure
Nesta unidade, você garante que o banco de dados PostgreSQL possa ser acessado somente pelo aplicativo Quarkus e não por outros clientes externos. Atualmente, você pode acessar o banco de dados de qualquer cliente usando a CLI do Azure e executando o Quarkus localmente. Essa configuração não é segura. Você precisa adicionar uma regra de firewall para permitir que apenas endereços IP no ambiente dos Aplicativos de Contêiner do Azure acessem o servidor de banco de dados.
Acessar o servidor PostgreSQL usando a CLI
Primeiro, garanta que você possa acessar o servidor PostgreSQL usando a CLI do Azure. Para fazer isso, execute este comando:
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
Você deve ser capaz de ver o conteúdo do banco de dados. Se você puder, o banco de dados poderá ser acessado fora do ambiente.
Remover a regra de firewall permissiva
O Banco de Dados PostgreSQL do Azure fornece segurança por padrão. Seu firewall geralmente não permite conexões de entrada. Mas quando você criou o servidor PostgreSQL, você especificou o parâmetro --public-access "All"
para habilitar o acesso externo, que configurou o firewall para ser aberto ao público.
Você pode listar as regras de firewall existentes executando esse comando:
az postgres flexible-server firewall-rule list \
--name "$AZ_POSTGRES_SERVER_NAME" \
--resource-group "$AZ_RESOURCE_GROUP" \
--output table
A seguinte saída deve ser exibida:
EndIpAddress Name ResourceGroup StartIpAddress
--------------- ------------------------- ----------------------- ----------------
255.255.255.255 AllowAll_2023-1-3_10-20-4 rgazure-deploy-quarkus 0.0.0.0
Observe que o intervalo de endereços IP permitidos é 0.0.0.0
até 255.255.255.255
. Uma regra de firewall como essa permite que qualquer cliente acesse o banco de dados. Para garantir que apenas o aplicativo Quarkus possa acessar o banco de dados, precisamos atualizar as regras de firewall do servidor PostgreSQL.
Nesse caso, é apenas uma questão de remover a regra pública. Para removê-lo, execute o seguinte comando:
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
Agora, tente consultar o banco de dados executando uma instrução SQL da 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
A chamada eventualmente atinge o tempo limite. Você verá esta mensagem:
Unable to connect to flexible server: connection to server failed: Operation timed out
Como você removeu todas as regras de firewall, até mesmo o aplicativo Quarkus não pode acessar o banco de dados. Se você tentar recuperar a lista de pendências do banco de dados, a solicitação falhará. Execute a seguinte solicitação cURL:
curl https://$AZ_APP_URL/api/todos
Adicionar uma nova regra de firewall
Você precisa configurar o firewall para permitir o acesso apenas do aplicativo Quarkus. Você precisa adicionar uma nova regra de firewall. Para adicionar a regra, execute este comando:
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"
A configuração de start-ip-address
e end-ip-address
para 0.0.0.0
permite o acesso de todos os endereços IP internos do Azure, mas não permite acesso de endereços IP externos. Essa prática ajuda a proteger o banco de dados contra acesso externo.
Se você tentar acessar o banco de dados da CLI executando o seguinte comando, a tentativa deverá falhar:
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
Mas se você tentar usar o seguinte comando para recuperar as tarefas do banco de dados por meio do aplicativo Quarkus em execução nos Aplicativos de Contêiner, a tentativa terá êxito:
curl https://$AZ_APP_URL/api/todos
Esse comando retorna a lista de todos os itens pendentes do banco de dados. O servidor PostgreSQL ainda pode ser acessado no aplicativo Quarkus em execução em um serviço do Azure, mas não pode ser acessado fora do Azure.