Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo explica como migrar dos métodos tradicionais de autenticação para conexões mais seguras e sem senha com o Banco de Dados do Azure para MySQL.
As solicitações de aplicativo para o Banco de Dados do Azure para MySQL devem ser autenticadas. O Banco de Dados do Azure para MySQL fornece várias maneiras diferentes de 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 do Azure para MySQL, 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 MySQL.
autenticação do Microsoft Entra
A autenticação do Microsoft Entra é um mecanismo para se conectar ao Banco de Dados do Azure para MySQL usando identidades definidas na ID do Microsoft Entra. Usando Microsoft Entra autenticação, você pode gerenciar identidades de usuário de banco de dados e outras serviços Microsoft em um local 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 senha em um único lugar.
- Várias formas de autenticação compatíveis com a ID do Microsoft Entra, 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 MySQL 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 MySQL.
Autenticação mySQL
Você pode criar contas no MySQL. Se você optar por usar senhas como credenciais para as contas, a user tabela armazenará essas credenciais. Como o MySQL armazena essas senhas, você precisa gerenciar a rotação das senhas por conta própria.
Embora você possa se conectar a Banco de Dados do Azure para MySQL usando senhas, use-as com cuidado. Seja diligente para nunca expor as senhas em um local inseguro. Qualquer pessoa que tenha acesso às senhas pode se autenticar. Por exemplo, um usuário malicioso pode acessar o aplicativo se você acidentalmente adicionar uma cadeia de conexão ao controle de origem, enviá-la por um email não seguro, colá-la em um chat inadequado ou se alguém sem permissão o exibir. 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 dão 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 clientes da Identidade do Azure. 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 em 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 procura credenciais podem ser encontrados na visão geral da biblioteca Azure Identity. Por exemplo, ao trabalhar localmente, DefaultAzureCredential geralmente será autenticado usando a conta que o desenvolvedor usou para entrar no Visual Studio. Quando o aplicativo é implantado no Azure, DefaultAzureCredential alternará automaticamente para usar uma identidade gerenciada. Nenhuma alteração de código é necessária para essa transição.
Para garantir que as conexões sejam sem senha, você deve considerar tanto o desenvolvimento local quanto 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 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 Azure e não exige que você faça o provisionamento nem a rotação de segredos. 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 comando a seguir 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_MYSQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
export AZ_MYSQL_AD_MI_USERNAME=<YOUR_AZURE_AD_MI_DISPLAY_NAME>
export AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
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, usados ao longo deste artigo:
-
<YOUR_RESOURCE_GROUP>: o nome do grupo de recursos para seus recursos. -
<YOUR_DATABASE_SERVER_NAME>: o nome do servidor MySQL, que deve ser exclusivo no 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 corresponde a um usuário válido no seu tenant do Microsoft Entra. -
<YOUR_AZURE_AD_MI_DISPLAY_NAME>: o nome de exibição do usuário do Microsoft Entra para sua identidade gerenciada. Verifique se o nome corresponde a um usuário válido no seu tenant do Microsoft Entra. -
<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: o nome do servidor de identidade gerenciada atribuído pelo usuário, que deve ser exclusivo no Azure.
1) Configurar o Banco de Dados do Azure para MySQL
1.1) Habilitar a autenticação baseada em ID do Microsoft Entra
Para usar o acesso com o Microsoft Entra ID no Banco de Dados do Azure para MySQL, primeiro defina o usuário administrador do Microsoft Entra ID. Somente um usuário Microsoft Entra administrador pode criar ou habilitar usuários para autenticação baseada em Microsoft Entra ID.
Se você estiver usando CLI do Azure, execute o seguinte comando para garantir que ele tenha permissão suficiente:
az login --scope https://graph.microsoft.com/.default
Execute o seguinte comando para criar uma identidade de usuário para atribuir:
az identity create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_USER_IDENTITY_NAME
Importante
Depois de criar a identidade atribuída pelo usuário, peça ao administrador global ou administrador de função com privilégios para conceder as seguintes permissões para essa identidade: User.Read.All, GroupMember.Read.Alle Application.Read.ALL. Para obter mais informações, consulte a seção Permissões da autenticação do Active Directory.
Execute o seguinte comando para atribuir a identidade ao servidor MySQL para criar o administrador do Microsoft Entra:
az mysql flexible-server identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_SERVER_NAME \
--identity $AZ_USER_IDENTITY_NAME
Em seguida, execute o seguinte comando para definir o administrador do Microsoft Entra:
az mysql flexible-server ad-admin create \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_SERVER_NAME \
--display-name $CURRENT_USERNAME \
--object-id $CURRENT_USER_OBJECTID \
--identity $AZ_USER_IDENTITY_NAME
Esse comando define o Microsoft Entra administrador para o usuário conectado atual.
Observação
Você só pode criar um administrador do Microsoft Entra por servidor MySQL. A seleção de outro administrador substitui o administrador Microsoft Entra existente configurado para o servidor.
2) Configurar o Banco de Dados do Azure para MySQL para desenvolvimento local
2.1) Configurar uma regra de firewall para IP local
As instâncias do Banco de Dados do Azure para MySQL são protegidas por padrão. Eles têm um firewall que não permite nenhuma conexão de entrada.
Você pode ignorar essa etapa se estiver usando o Bash porque o flexible-server create comando já detectou seu endereço IP local e o definiu no servidor MySQL.
Se você estiver se conectando ao servidor MySQL do Subsistema do Windows para Linux (WSL) em um computador Windows, precisará adicionar a 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 nameservere use o seguinte comando para definir uma variável de ambiente para o endereço IP do 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 mysql server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \
--server $AZ_DATABASE_SERVER_NAME \
--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 MySQL e conceder permissão
Em seguida, crie um usuário não administrador do Microsoft Entra e conceda a ele todas as permissões no $AZ_DATABASE_NAME banco de dados. 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.sql para criar um usuário não administrador. Adicione o seguinte conteúdo e salve-o localmente:
export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)
cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';
FLUSH privileges;
EOF
Em seguida, use o seguinte comando para executar o script SQL e criar o Microsoft Entra usuário não administrador:
mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql
Agora, use o seguinte comando para remover o arquivo de script SQL temporário:
rm create_ad_user.sql
Observação
Para obter mais informações sobre como criar usuários do MySQL, consulte Criar usuários no Banco de Dados do Azure para MySQL.
3) Entrar e migrar 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 você atribuiu a função no MySQL. Autentique por meio do 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 idioma usa detalhes de implementação diferentes.
Dentro do projeto, adicione a referência a seguir ao
azure-identity-extensionspacote. 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>Habilite o plug-in de autenticação do MySQL do Azure na URL JDBC. Identifique os locais em seu código que atualmente criam um
java.sql.Connectionpara se conectar ao Banco de Dados do Azure para MySQL. Atualizeurleuserno arquivo application.properties para corresponder aos seguintes valores:url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin user=$AZ_MYSQL_AD_NON_ADMIN_USERNAMEObservação
Se você estiver usando a
MysqlConnectionPoolDataSourceclasse como a fonte de dados em seu aplicativo, removadefaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPluginda URL.url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin user=$AZ_MYSQL_AD_NON_ADMIN_USERNAMESubstitua as
$AZ_DATABASE_SERVER_NAMEvariáveis ,$AZ_DATABASE_NAMEe$AZ_MYSQL_AD_NON_ADMIN_USERNAMEpelos valores que você configurou no início deste artigo.Remova o
passwordda URL JDBC.
Executar o aplicativo localmente
Depois de fazer essas alterações de código, execute seu aplicativo localmente. A nova configuração pegará suas credenciais locais se você estiver conectado a um IDE compatível ou ferramenta de linha de comando, como o CLI do Azure, Visual Studio ou IntelliJ. As funções atribuídas ao usuário de desenvolvimento local no Azure permitem que seu aplicativo se conecte ao serviço Azure localmente.
4) Configurar o ambiente de hospedagem do Azure
Depois de configurar seu aplicativo para usar conexões sem senha e executá-lo localmente, o mesmo código pode se autenticar nos serviços de Azure depois de implantá-lo no Azure. Por exemplo, um aplicativo implantado em uma instância do Serviço de Aplicativo do Azure que tem 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 Azure de maneira 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 ao PostgreSQL. Usando 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 as atribui para 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 pelo sistema para vários serviços de hospedagem da Web. A identidade gerenciada pode se conectar com segurança a outros serviços Azure usando as configurações de aplicativo configuradas anteriormente.
- Serviço de Aplicativo
- Conector de Serviços
- Aplicativos de Contêiner
- Aplicativos Spring do Azure
- máquinas virtuais
- AKS
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.
Na guia Atribuída pelo sistema, certifique-se de definir o campo Status como ativado. Uma identidade atribuída pelo sistema é gerenciada internamente pelo Azure e manipula tarefas administrativas para você. Os detalhes e os identificadores da identidade nunca são expostos no seu código.
Você também pode atribuir uma identidade gerenciada em um ambiente de hospedagem Azure usando o CLI do Azure.
- Serviço de Aplicativo
- Conector de Serviços
- Aplicativos de Contêiner
- Aplicativos Spring do Azure
- 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ê atribuiu para acessar sua instância do MySQL.
Essas etapas criam um usuário Microsoft Entra para a identidade gerenciada e concedem todas as permissões para o banco de dados$AZ_DATABASE_NAME. Você pode alterar o nome $AZ_DATABASE_NAME do banco de dados para atender às suas necessidades.
Primeiro, crie um script SQL chamado create_ad_user.sql para criar um usuário não administrador. Adicione o seguinte conteúdo e salve-o localmente:
export AZ_MYSQL_AD_MI_USERID=$(az ad sp show --id $AZ_MI_OBJECT_ID --query appId --output tsv)
cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '$AZ_MYSQL_AD_MI_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_MI_USERID';
GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_MI_USERNAME'@'%';
FLUSH privileges;
EOF
Em seguida, use o seguinte comando para executar o script SQL e criar o Microsoft Entra usuário não administrador:
mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql
Agora, use o seguinte comando para remover o arquivo de script SQL temporário:
rm create_ad_user.sql
Testar o aplicativo
Antes de implantar o aplicativo no ambiente de hospedagem, você precisa fazer mais uma alteração no código porque o aplicativo se conecta ao MySQL usando o usuário que você criou para a identidade gerenciada.
Atualize seu código para usar o usuário criado para a identidade gerenciada:
properties.put("user", "$AZ_MYSQL_AD_MI_USERNAME");
Depois de fazer essas alterações de código, você pode compilar 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 MySQL com êxito. Pode levar vários minutos para que as atribuições de função se propaguem por meio de seu ambiente de 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.
Para explorar mais detalhadamente os conceitos abordados neste artigo, confira os seguintes recursos: