Migrar um aplicativo Java para usar conexões sem senha com o Banco de Dados SQL do Azure
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 SQL do Azure.
As solicitações de aplicativo para o Banco de Dados SQL do Azure devem ser autenticadas. O Banco de Dados SQL do Azure fornece várias maneiras diferentes para os aplicativos se conectarem com segurança. Uma das maneiras é 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 é autenticado com o Banco de Dados SQL do Azure, ele fornece um par de nome de usuário e senha para se conectar ao banco de dados. Dependendo de onde as identidades são armazenadas, há dois tipos de autenticação: autenticação do Microsoft Entra e autenticação do Banco de Dados SQL do Azure.
Autenticação do Microsoft Entra
A autenticação do Microsoft Entra é um mecanismo para se conectar ao Banco de Dados SQL do Azure usando identidades definidas na ID do Microsoft Entra. Com a autenticação do Microsoft Entra, você pode gerenciar identidades de usuário de banco de dados e outros serviços da Microsoft em um local central, o que simplifica o gerenciamento de permissões.
Usar o Microsoft Entra ID 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 senhas e rotação de senhas em um único lugar.
- Várias formas de autenticação suportadas pelo Microsoft Entra ID, que podem 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 do banco de dados SQL do Azure para autenticar identidades no nível do banco de dados.
- Suporte de autenticação baseada em token para aplicativos que se conectam ao Banco de Dados SQL do Azure.
Autenticação do Banco de Dados SQL do Azure
Você pode criar contas no Banco de Dados SQL do Azure. Se você optar por usar senhas como credenciais para as contas, essas credenciais serão armazenadas na sys.database_principals
tabela. Como essas senhas são armazenadas no Banco de Dados SQL do Azure, você precisa gerenciar a rotação das senhas sozinho.
Embora seja possível conectar-se ao Banco de Dados SQL do Azure com senhas, você deve usá-las com cuidado. Você deve ser diligente para nunca expor as senhas em um local inseguro. Qualquer pessoa que tenha acesso às senhas pode se autenticar. Por exemplo, há um 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 ligações sem palavra-passe
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 suportam ligações sem palavra-passe, por exemplo, através da Identidade Gerida 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á como atualizar um aplicativo existente para usar DefaultAzureCredential
em vez de alternativas, como cadeias de conexão.
DefaultAzureCredential
suporta vários métodos de autenticação e determina automaticamente quais devem ser usados em tempo de execução. Essa abordagem permite que seu aplicativo use métodos de autenticação diferentes 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 de 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
alternará automaticamente para usar uma identidade gerenciada. Não são necessárias alterações de código para esta 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 autenticar com a CLI do Azure, Azure PowerShell, Visual Studio ou 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.
Nota
Uma identidade gerenciada fornece uma identidade de segurança para representar um aplicativo ou serviço. A identidade é gerida pela plataforma do Azure e não precisa de aprovisionar nem rodar segredos. Você pode ler mais sobre identidades gerenciadas na documentação de visão geral .
Nota
Como o driver JDBC para o Banco de Dados SQL do Azure ainda não oferece suporte a conexões sem senha de ambientes locais, este artigo se concentrará apenas em aplicativos implantados em ambientes de hospedagem do Azure e como migrá-los para usar conexões sem senha.
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 CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)
Substitua os marcadores de posição pelos seguintes valores, que são utilizados ao longo deste 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 do Banco de Dados SQL do Azure. Deve ser um nome exclusivo no Azure.
1) Configurar o Banco de Dados SQL do Azure
1.1) Ativar a autenticação baseada em ID do Microsoft Entra
Para usar o acesso à ID do Microsoft Entra com o Banco de Dados SQL do Azure, você deve definir o usuário administrador do Microsoft Entra primeiro. Somente um usuário administrador do Microsoft Entra pode criar/habilitar usuários para autenticação baseada em ID do Microsoft Entra.
Se estiver a utilizar a CLI do Azure, execute o seguinte comando para se certificar de que tem permissão suficiente:
az login --scope https://graph.microsoft.com/.default
Em seguida, execute o seguinte comando para definir o administrador do Microsoft Entra:
az sql server ad-admin create \
--resource-group $AZ_RESOURCE_GROUP \
--server $AZ_DATABASE_SERVER_NAME \
--display-name $CURRENT_USERNAME \
--object-id $CURRENT_USER_OBJECTID
Este comando definirá o administrador do Microsoft Entra como o usuário conectado atual.
Nota
Você só pode criar um administrador do Microsoft Entra por servidor do Banco de Dados SQL do Azure. A seleção de outro substituirá o administrador existente do Microsoft Entra configurado para o servidor.
2) Migre o código do aplicativo para usar conexões sem senha
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.
Dentro do seu projeto, adicione a seguinte referência ao
azure-identity
pacote. Esta biblioteca contém todas as entidades necessárias para implementar conexões sem senha.<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.5.4</version> </dependency>
Habilite a autenticação de identidade gerenciada do Microsoft Entra no JDBC URL.v Identifique os locais em seu código que atualmente criam um
java.sql.Connection
para se conectar ao Banco de Dados SQL do Azure. Atualize seu código para corresponder ao exemplo a seguir:String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;" Connection con = DriverManager.getConnection(url);
Substitua as duas
$AZ_DATABASE_SERVER_NAME
variáveis e uma$AZ_DATABASE_NAME
variável pelos valores que você configurou no início deste artigo.Remova o
user
epassword
do URL JDBC.
3) Configurar o ambiente de hospedagem do Azure
Depois que seu aplicativo for configurado para usar conexões sem senha, o mesmo código poderá ser autenticado 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.
Nota
O Azure também fornece o Service Connector, que pode ajudá-lo a conectar seu serviço de hospedagem ao SQL Server. Com o Service Connector para configurar seu ambiente de hospedagem, você pode omitir a etapa de atribuir funções à sua identidade gerenciada porque 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 outra configurando cada ambiente de hospedagem diretamente.
Importante
Os comandos do Service Connector exigem a CLI do Azure 2.41.0 ou superior.
Atribuir a identidade gerenciada usando o portal do Azure
As etapas a seguir mostram como atribuir uma identidade gerenciada atribuída ao 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.
- Serviço de Aplicações
- Conector de serviço
- Aplicativos de contêiner
- Azure Spring Apps
- Máquinas Virtuais
- AKS
Na página de visão geral principal da sua instância do Serviço de Aplicativo do Azure, selecione Identidade no painel de navegação.
Na guia Sistema atribuído, certifique-se de definir o campo Status como ativado. Uma identidade atribuída ao sistema é gerenciada pelo Azure internamente e lida com tarefas administrativas para você. Os detalhes e IDs da identidade nunca são expostos no seu código.
Você também pode atribuir identidade gerenciada em um ambiente de hospedagem do Azure usando a CLI do Azure.
- Serviço de Aplicações
- Conector de serviço
- Aplicativos de contêiner
- Azure Spring Apps
- Máquinas Virtuais
- AKS
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 que você criou para acessar seu banco de dados SQL.
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 a aplicação
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 SQL do Azure com êxito. Lembre-se de que pode levar vários minutos para que as atribuições de função se propaguem pelo seu ambiente do Azure. Seu aplicativo agora está configurado para ser executado localmente e em um ambiente de produção sem que os desenvolvedores tenham que gerenciar segredos no próprio aplicativo.
Próximos passos
Neste tutorial, você aprendeu como migrar um aplicativo para conexões sem senha.
Você pode ler os seguintes recursos para explorar os conceitos discutidos neste artigo com mais profundidade: