Compartilhar via


Migrar o aplicativo para usar conexões sem senha com o Banco de Dados do Azure para PostgreSQL

Este artigo explica como migrar de métodos de autenticação tradicionais para conexões mais seguras e sem senha com o Banco de Dados do Azure para PostgreSQL.

As solicitações de aplicativo para o Banco de Dados do Azure para PostgreSQL devem ser autenticadas. O Banco de Dados do Azure para PostgreSQL fornece várias maneiras diferentes para os aplicativos se conectarem com segurança. Uma das formas é usar senhas. No entanto, você deve priorizar conexões sem senha em seus aplicativos quando possível.

Comparar opções de autenticação

Quando o aplicativo se autentica com o Banco de Dados do Azure para PostgreSQL, ele fornece um par de nome de usuário e senha para conectar o banco de dados. Dependendo de onde as identidades são armazenadas, há dois tipos de autenticação: autenticação Microsoft Entra e autenticação PostgreSQL.

autenticação do Microsoft Entra

A autenticação do Microsoft Entra é um mecanismo de conexão do Banco de Dados do Azure para PostgreSQL que usa as identidades definidas no Microsoft Entra ID. Com a autenticação do Microsoft Entra, você pode gerenciar as identidades de usuários do banco de dados e outros serviços da Microsoft em uma só localização central, o que simplifica o gerenciamento de permissões.

O uso da ID do Microsoft Entra para autenticação oferece os seguintes benefícios:

  • Autenticação de usuários nos Serviços do Azure de maneira uniforme.
  • Gerenciamento de políticas de senha e rotação de senhas em um único local.
  • Várias formas de autenticação suportadas pelo Microsoft Entra ID, que pode eliminar a necessidade de armazenar senhas.
  • Os clientes podem gerenciar permissões de banco de dados usando grupos externos (Microsoft Entra ID).
  • A autenticação do Microsoft Entra usa usuários de banco de dados PostgreSQL para autenticar identidades no nível do banco de dados.
  • Suporte à autenticação baseada em token para aplicativos que se conectam ao Banco de Dados do Azure para PostgreSQL.

Autenticação do PostgreSQL

Você pode criar contas no PostgreSQL. Se você optar por usar senhas como credenciais para as contas, essas credenciais serão armazenadas na tabela user. Como essas senhas são armazenadas no PostgreSQL, você precisa gerenciar a rotação das senhas por conta própria.

Embora seja possível se conectar ao Banco de Dados do Azure para PostgreSQL com senhas, você deve usá-las com cuidado. Você deve ser diligente para nunca expor as senhas em um local não seguro. Qualquer pessoa que tenha acesso às senhas é capaz de autenticar. Por exemplo, há o risco de que um usuário mal-intencionado possa acessar o aplicativo se uma cadeia de conexão for acidentalmente verificada no controle do código-fonte, enviada por meio de um e-mail não seguro, colada no bate-papo errado ou visualizada por alguém que não deveria ter permissão. Em vez disso, considere atualizar seu aplicativo para usar conexões sem senha.

Introdução a conexões sem senha

Com uma conexão sem senha, você pode se conectar aos serviços do Azure sem armazenar credenciais no código do aplicativo, em seus arquivos de configuração ou em variáveis de ambiente.

Muitos serviços do Azure oferecem suporte a conexões sem senha, por exemplo, por meio da Identidade Gerenciada do Azure. Essas técnicas fornecem recursos de segurança robustos que você pode implementar usando DefaultAzureCredential das bibliotecas de cliente do Azure Identity. Neste tutorial, você aprenderá a atualizar um aplicativo existente para usar DefaultAzureCredential em vez de alternativas, como cadeias de conexão.

DefaultAzureCredential dá suporte a vários métodos de autenticação e determina automaticamente quais devem ser usados no runtime. Essa abordagem permite que seu aplicativo use diferentes métodos de autenticação em ambientes diferentes (desenvolvimento local versus produção) sem implementar código específico do ambiente.

A ordem e os locais em que DefaultAzureCredential as pesquisas por credenciais podem ser encontradas na visão geral da biblioteca de Identidades do Azure. Por exemplo, ao trabalhar localmente, DefaultAzureCredential geralmente autenticará usando a conta que o desenvolvedor usou para entrar no Visual Studio. Quando o aplicativo for implantado no Azure, DefaultAzureCredential mudará automaticamente para usar uma identidade gerenciada. Nenhuma alteração de código é necessária para essa transição.

Para garantir que as conexões não tenham senha, você deve levar em consideração o desenvolvimento local e o ambiente de produção. Se uma cadeia de conexão for necessária em qualquer lugar, o aplicativo não será sem senha.

Em seu ambiente de desenvolvimento local, você pode se autenticar com a CLI do Azure, o Azure PowerShell, o Visual Studio ou os plug-ins do Azure para Visual Studio Code ou IntelliJ. Nesse caso, você pode usar essa credencial em seu aplicativo em vez de configurar propriedades.

Ao implantar aplicativos em um ambiente de hospedagem do Azure, como uma máquina virtual, você pode atribuir identidade gerenciada nesse ambiente. Em seguida, você não precisará fornecer credenciais para se conectar aos serviços do Azure.

Observação

Uma identidade gerenciada fornece uma identidade de segurança para representar um aplicativo ou serviço. A identidade é gerenciada pela plataforma do Azure e não exige provisionamento ou giro de nenhum segredo. Você pode ler mais sobre identidades gerenciadas na documentação de visão geral.

Migrar um aplicativo existente para usar conexões sem senha

As etapas a seguir explicam como migrar um aplicativo existente para usar conexões sem senha em vez de uma solução baseada em senha.

0) Preparar o ambiente de trabalho

Primeiro, use o seguinte comando para configurar algumas variáveis de ambiente.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)

Substitua os espaços reservados pelos seguintes valores, que são usados em todo este artigo:

  • <YOUR_RESOURCE_GROUP>: O nome do grupo de recursos em que seus recursos estão.
  • <YOUR_DATABASE_SERVER_NAME>: O nome do seu servidor PostgreSQL. O nome deve ser exclusivo em todo o Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: O nome de exibição do usuário não administrador do Microsoft Entra. Verifique se o nome é um usuário válido no locatário do Microsoft Entra.
  • <YOUR_LOCAL_IP_ADDRESS>: O endereço IP do computador local, do qual você executará o aplicativo Spring Boot. Uma forma conveniente de encontrá-lo é abrir whatismyip.akamai.com.

1) Configurar o Banco de Dados do Azure para PostgreSQL

1.1) Habilitar a autenticação baseada em ID do Microsoft Entra

Para usar o acesso à ID do Microsoft Entra com o Banco de Dados do Azure para PostgreSQL, você deve definir o usuário administrador do Microsoft Entra primeiro. Somente um usuário administrador do Microsoft Entra podem criar/habilitar usuários para a autenticação baseada no Microsoft Entra ID.

Para configurar um administrador do Microsoft Entra depois de criar o servidor, siga as etapas em Gerenciar funções do Microsoft Entra no Banco de Dados do Azure para PostgreSQL – Servidor Flexível.

Observação

O PostgreSQL Flexible Server pode criar vários administradores do Microsoft Entra.

2) Configurar o Banco de Dados do Azure para PostgreSQL para desenvolvimento local

2.1) Configurar uma regra de firewall para IP local

As instâncias do Banco de Dados do Azure para PostgreSQL são protegidas por padrão. Elas têm um firewall que não permite nenhuma conexão de entrada. Para usar o banco de dados, você precisa adicionar uma regra de firewall que permitirá que o endereço IP local acesse o servidor de banco de dados.

Como você configurou seu endereço IP local no início deste artigo, abra o firewall do servidor executando o seguinte comando:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

Se você estiver se conectando ao servidor PostgreSQL a partir do Windows Subsystem for Linux (WSL) em um computador Windows, será necessário adicionar o ID do host WSL ao firewall.

Obtenha o endereço IP do computador host executando o seguinte comando no WSL:

cat /etc/resolv.conf

Copie o endereço IP após o termo nameserver e use o seguinte comando para definir uma variável de ambiente para o endereço IP WSL:

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Em seguida, use o seguinte comando para abrir o firewall do servidor para seu aplicativo baseado em WSL:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) Criar um usuário não-administrador do PostgreSQL e conceder permissão

Em seguida, crie um usuário do Microsoft Entra não administrador e conceda todas as permissões no $AZ_DATABASE_NAME banco de dados a ele. Você pode alterar o nome $AZ_DATABASE_NAME do banco de dados para atender às suas necessidades.

Crie um script SQL chamado create_ad_user_local.sql para criar um usuário não administrador. Adicione o seguinte conteúdo e salve-o localmente:

cat << EOF > create_ad_user_local.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF

Em seguida, use o seguinte comando para executar o script SQL, a fim de criar o usuário não administrador do Microsoft Entra:

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user_local.sql

Agora, use o seguinte comando para remover o arquivo de script SQL temporário:

rm create_ad_user_local.sql

Observação

Você pode ler informações mais detalhadas sobre como criar usuários do PostgreSQL em Criar usuários no Banco de Dados do Azure para PostgreSQL.

3) Entre e migre o código do aplicativo para usar conexões sem senha

Para desenvolvimento local, verifique se você está autenticado com a mesma conta do Microsoft Entra à qual atribuiu a função em seu PostgreSQL. Você pode autenticar por meio da CLI do Azure, visual Studio, Azure PowerShell ou outras ferramentas, como o IntelliJ.

Entre no Azure por meio da CLI do Azure usando o seguinte comando:

az login

Em seguida, use as etapas a seguir para atualizar seu código para usar conexões sem senha. Embora conceitualmente semelhante, cada linguagem usa detalhes de implementação diferentes.

  1. Dentro do azure-identity-extensions seu projeto, adicione a seguinte referência ao pacote. Essa biblioteca contém todas as entidades necessárias para implementar conexões sem senha.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Habilite o plug-in de autenticação do Azure PostgreSQL na URL JDBC. Identifique os locais em seu código que atualmente criam um java.sql.Connection para se conectar ao Banco de Dados do Azure para PostgreSQL. Atualize url e user no arquivo application.properties para corresponder aos seguintes valores:

    url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin
    user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME
    
  3. Substitua as $AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME e as duas $AZ_DATABASE_SERVER_NAME variáveis pelo valor que você configurou no início deste artigo.

Executar o aplicativo localmente

Depois de fazer essas alterações de código, execute seu aplicativo localmente. A nova configuração deve pegar suas credenciais locais se você estiver conectado a um IDE compatível ou ferramenta de linha de comando, como a CLI do Azure, o Visual Studio ou o IntelliJ. As funções atribuídas ao usuário de desenvolvimento local no Azure permitirão que seu aplicativo se conecte ao serviço do Azure localmente.

4) Configurar o ambiente de hospedagem do Azure

Depois que seu aplicativo é configurado para usar conexões sem senha e é executado localmente, o mesmo código pode se autenticar nos serviços do Azure depois de implantado no Azure. Por exemplo, um aplicativo implantado em uma instância do Serviço de Aplicativo do Azure que tenha uma identidade gerenciada atribuída pode se conectar ao Armazenamento do Azure.

Nesta seção, você executará duas etapas para permitir que seu aplicativo seja executado em um ambiente de hospedagem do Azure sem senha:

  • Atribua a identidade gerenciada para seu ambiente de hospedagem do Azure.
  • Atribua funções à identidade gerenciada.

Observação

O Azure também fornece o Service Connector, que pode ajudá-lo a conectar seu serviço de hospedagem com o PostgreSQL. Com o Service Connector para configurar seu ambiente de hospedagem, você pode omitir a etapa de atribuição de funções à sua identidade gerenciada, pois o Service Connector fará isso por você. A seção a seguir descreve como configurar seu ambiente de hospedagem do Azure de duas maneiras: uma por meio do Service Connector e a outra configurando cada ambiente de hospedagem diretamente.

Importante

Os comandos do Service Connector exigem a CLI 2.41.0 do Azure ou superior.

Atribuir a identidade gerenciada usando o portal do Azure

As etapas a seguir mostram como atribuir uma identidade gerenciada atribuída pelo sistema para vários serviços de hospedagem na Web. A identidade gerenciada pode se conectar com segurança a outros Serviços do Azure usando as configurações de aplicativo que você configurou anteriormente.

  1. Na página de visão geral principal da instância do Serviço de Aplicativo do Azure, selecione Identidade no painel de navegação.

  2. Na guia Sistema atribuído, certifique-se de definir o campo Status como ativado. Uma identidade atribuída pelo sistema é gerenciada internamente pelo Azure e lida com tarefas administrativas para você. Os detalhes e as IDs da identidade nunca são expostos em seu código.

Você também pode atribuir identidade gerenciada em um ambiente de hospedagem do Azure usando a CLI do Azure.

Você pode atribuir uma identidade gerenciada a uma instância do Serviço de Aplicativo do Azure com o comando az webapp identity assign , conforme mostrado no exemplo a seguir:

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

Atribuir funções à identidade gerenciada

Em seguida, conceda permissões à identidade gerenciada atribuída para acessar sua instância do PostgreSQL.

Se você conectou seus serviços usando o Service Connector, os comandos da etapa anterior já atribuíram a função, portanto, você pode ignorar esta etapa.

Testar o aplicativo

Antes de implantar o aplicativo no ambiente de hospedagem, você precisa fazer mais uma alteração no código, pois o aplicativo se conectará ao PostgreSQL usando o usuário criado para a identidade gerenciada.

Atualize seu código para usar o usuário criado para a identidade gerenciada:

Observação

Se você usou o comando Service Connector, ignore esta etapa.

properties.put("user", "$AZ_POSTGRESQL_AD_MI_USERNAME");

Depois de fazer essas alterações de código, você pode criar e reimplantar o aplicativo. Em seguida, navegue até o aplicativo hospedado no navegador. Seu aplicativo deve ser capaz de se conectar ao banco de dados PostgreSQL com êxito. Lembre-se de que pode levar vários minutos para que as atribuições de função se propaguem pelo ambiente do Azure. Seu aplicativo agora está configurado para ser executado localmente e em um ambiente de produção sem que os desenvolvedores precisem gerenciar segredos no próprio aplicativo.

Próximas etapas

Neste tutorial, você aprendeu a migrar um aplicativo para conexões sem senha.

Você pode ler os seguintes recursos para explorar os conceitos discutidos neste artigo com mais detalhes: