Een toepassing migreren om wachtwoordloze verbindingen te gebruiken met Azure Database for MySQL
In dit artikel wordt uitgelegd hoe u migreert van traditionele verificatiemethoden naar veiligere, wachtwoordloze verbindingen met Azure Database for MySQL.
Toepassingsaanvragen voor Azure Database for MySQL moeten worden geverifieerd. Azure Database for MySQL biedt verschillende manieren waarop apps veilig verbinding kunnen maken. Een van de manieren is om wachtwoorden te gebruiken. U moet echter waar mogelijk prioriteit geven aan verbindingen zonder wachtwoord in uw toepassingen.
Verificatieopties vergelijken
Wanneer de toepassing wordt geverifieerd met Azure Database for MySQL, biedt deze een gebruikersnaam en wachtwoordpaar om verbinding te maken met de database. Afhankelijk van waar de identiteiten worden opgeslagen, zijn er twee typen verificatie: Microsoft Entra-verificatie en MySQL-verificatie.
Microsoft Entra-verificatie
Microsoft Entra-verificatie is een mechanisme voor het maken van verbinding met Azure Database for MySQL met behulp van identiteiten die zijn gedefinieerd in Microsoft Entra-id. Met Microsoft Entra-verificatie kunt u databasegebruikersidentiteiten en andere Microsoft-services op een centrale locatie beheren, waardoor het beheer van machtigingen wordt vereenvoudigd.
Het gebruik van Microsoft Entra ID voor verificatie biedt de volgende voordelen:
- Verificatie van gebruikers in Azure Services op een uniforme manier.
- Beheer van wachtwoordbeleid en wachtwoordrotatie op één plaats.
- Meerdere vormen van verificatie die worden ondersteund door Microsoft Entra ID, waardoor wachtwoorden niet meer hoeven op te slaan.
- Klanten kunnen databasemachtigingen beheren met behulp van externe (Microsoft Entra ID)-groepen.
- Microsoft Entra-verificatie maakt gebruik van MySQL-databasegebruikers om identiteiten op databaseniveau te verifiëren.
- Ondersteuning van verificatie op basis van tokens voor toepassingen die verbinding maken met Azure Database for MySQL.
MySQL-verificatie
U kunt accounts maken in MySQL. Als u ervoor kiest om wachtwoorden als referenties voor de accounts te gebruiken, worden deze referenties opgeslagen in de user
tabel. Omdat deze wachtwoorden zijn opgeslagen in MySQL, moet u de rotatie van de wachtwoorden zelf beheren.
Hoewel het mogelijk is om verbinding te maken met Azure Database for MySQL met wachtwoorden, moet u ze voorzichtig gebruiken. U moet ijverig zijn om de wachtwoorden nooit zichtbaar te maken op een onbeveiligde locatie. Iedereen die toegang krijgt tot de wachtwoorden, kan worden geverifieerd. Er bestaat bijvoorbeeld een risico dat een kwaadwillende gebruiker toegang heeft tot de toepassing als een verbindingsreeks per ongeluk wordt ingecheckt bij broncodebeheer, wordt verzonden via een onbeveiligde e-mail, geplakt in de verkeerde chat of wordt bekeken door iemand die niet gemachtigd mag zijn. In plaats daarvan kunt u overwegen uw toepassing bij te werken voor het gebruik van verbindingen zonder wachtwoord.
Introductie van verbindingen zonder wachtwoord
Met een verbinding zonder wachtwoord kunt u verbinding maken met Azure-services zonder referenties op te slaan in de toepassingscode, de configuratiebestanden of in omgevingsvariabelen.
Veel Azure-services ondersteunen verbindingen zonder wachtwoord, bijvoorbeeld via Azure Managed Identity. Deze technieken bieden robuuste beveiligingsfuncties die u kunt implementeren met behulp van DefaultAzureCredential vanuit de Azure Identity-clientbibliotheken. In deze zelfstudie leert u hoe u een bestaande toepassing bijwerkt voor gebruik DefaultAzureCredential
in plaats van alternatieven zoals verbindingsreeks s.
DefaultAzureCredential
ondersteunt meerdere verificatiemethoden en bepaalt automatisch welke tijdens runtime moet worden gebruikt. Met deze aanpak kan uw app verschillende verificatiemethoden gebruiken in verschillende omgevingen (lokale ontwikkelomgeving versus productie) zonder omgevingsspecifieke code te implementeren.
De volgorde en locaties waarin DefaultAzureCredential
wordt gezocht naar referenties, vindt u in het overzicht van de Azure Identity-bibliotheek. Wanneer u bijvoorbeeld lokaal werkt, DefaultAzureCredential
wordt doorgaans geverifieerd met het account dat de ontwikkelaar heeft gebruikt om zich aan te melden bij Visual Studio. Wanneer de app wordt geïmplementeerd in Azure, DefaultAzureCredential
wordt automatisch overgeschakeld naar het gebruik van een beheerde identiteit. Er zijn geen codewijzigingen vereist voor deze overgang.
Om ervoor te zorgen dat verbindingen zonder wachtwoord zijn, moet u rekening houden met zowel lokale ontwikkeling als de productieomgeving. Als een verbindingsreeks op beide plaatsen is vereist, is de toepassing niet wachtwoordloos.
In uw lokale ontwikkelomgeving kunt u zich verifiëren met Azure CLI, Azure PowerShell, Visual Studio of Azure-invoegtoepassingen voor Visual Studio Code of IntelliJ. In dit geval kunt u deze referentie in uw toepassing gebruiken in plaats van eigenschappen te configureren.
Wanneer u toepassingen implementeert in een Azure-hostingomgeving, zoals een virtuele machine, kunt u beheerde identiteit in die omgeving toewijzen. Vervolgens hoeft u geen referenties op te geven om verbinding te maken met Azure-services.
Notitie
Een beheerde identiteit biedt een beveiligingsidentiteit die een app of service vertegenwoordigt. De identiteit wordt beheerd door het Azure-platform en u hoeft geen geheimen in te richten of te draaien. Meer informatie over beheerde identiteiten vindt u in de overzichtsdocumentatie .
Een bestaande toepassing migreren om verbindingen zonder wachtwoord te gebruiken
In de volgende stappen wordt uitgelegd hoe u een bestaande toepassing migreert om verbindingen zonder wachtwoord te gebruiken in plaats van een oplossing op basis van een wachtwoord.
0) De werkomgeving voorbereiden
Gebruik eerst de volgende opdracht om enkele omgevingsvariabelen in te stellen.
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)
Vervang de tijdelijke aanduidingen door de volgende waarden, die overal in dit artikel worden gebruikt:
<YOUR_RESOURCE_GROUP>
: De naam van de resourcegroep waarin uw resources zich bevinden.<YOUR_DATABASE_SERVER_NAME>
: De naam van uw MySQL-server, die uniek moet zijn in Azure.<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>
: De weergavenaam van de niet-beheerdersgebruiker van Microsoft Entra. Zorg ervoor dat de naam een geldige gebruiker is in uw Microsoft Entra-tenant.<YOUR_AZURE_AD_MI_DISPLAY_NAME>
: De weergavenaam van Microsoft Entra-gebruiker voor uw beheerde identiteit. Zorg ervoor dat de naam een geldige gebruiker is in uw Microsoft Entra-tenant.<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>
: De naam van uw door de gebruiker toegewezen beheerde identiteitsserver, die uniek moet zijn in Azure.
1) Azure Database for MySQL configureren
1.1) Verificatie op basis van Microsoft Entra-id inschakelen
Als u Microsoft Entra ID-toegang wilt gebruiken met Azure Database for MySQL, moet u eerst de Microsoft Entra-beheerdergebruiker instellen. Alleen een Microsoft Entra Admin-gebruiker kan gebruikers maken/inschakelen voor verificatie op basis van Microsoft Entra ID.
Als u Azure CLI gebruikt, voert u de volgende opdracht uit om te controleren of deze voldoende machtigingen heeft:
az login --scope https://graph.microsoft.com/.default
Voer de volgende opdracht uit om de gebruikersidentiteit te maken voor het toewijzen:
az identity create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_USER_IDENTITY_NAME
Belangrijk
Nadat u de door de gebruiker toegewezen identiteit hebt gemaakt, vraagt u de globale beheerder of bevoorrechte rolbeheerder om de volgende machtigingen voor deze identiteit te verlenen: User.Read.All
, GroupMember.Read.All
en Application.Read.ALL
. Zie de sectie Machtigingen van Active Directory-verificatie voor meer informatie.
Voer de volgende opdracht uit om de identiteit toe te wijzen aan de MySQL-server voor het maken van de Microsoft Entra-beheerder:
az mysql flexible-server identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_SERVER_NAME \
--identity $AZ_USER_IDENTITY_NAME
Voer vervolgens de volgende opdracht uit om de Microsoft Entra-beheerder in te stellen:
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
Met deze opdracht stelt u de Microsoft Entra-beheerder in op de huidige aangemelde gebruiker.
Notitie
U kunt slechts één Microsoft Entra-beheerder per MySQL-server maken. Als u een andere optie selecteert, wordt de bestaande Microsoft Entra-beheerder overschreven die is geconfigureerd voor de server.
2) Azure Database for MySQL configureren voor lokale ontwikkeling
2.1) Een firewallregel configureren voor lokaal IP-adres
Azure Database for MySQL-instanties worden standaard beveiligd. Ze hebben een firewall die geen enkele binnenkomende verbinding toestaat.
U kunt deze stap overslaan als u Bash gebruikt, omdat met de flexible-server create
opdracht al uw lokale IP-adres is gedetecteerd en dit is ingesteld op de MySQL-server.
Als u verbinding maakt met uw MySQL-server vanaf Windows-subsysteem voor Linux (WSL) op een Windows-computer, moet u de WSL-host-id toevoegen aan uw firewall. Haal het IP-adres van uw hostcomputer op door de volgende opdracht uit te voeren in WSL:
cat /etc/resolv.conf
Kopieer het IP-adres na de term nameserver
en gebruik vervolgens de volgende opdracht om een omgevingsvariabele in te stellen voor het WSL IP-adres:
export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Gebruik vervolgens de volgende opdracht om de firewall van de server te openen naar uw WSL-app:
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) Maak een mySQL-niet-beheerder en ververleent machtigingen
Maak vervolgens een microsoft Entra-gebruiker die geen beheerder is en verdeel alle machtigingen voor de $AZ_DATABASE_NAME
database. U kunt de databasenaam $AZ_DATABASE_NAME
aanpassen aan uw behoeften.
Maak een SQL-script met de naam create_ad_user.sql voor het maken van een niet-beheerdersgebruiker. Voeg de volgende inhoud toe en sla deze lokaal op:
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
Gebruik vervolgens de volgende opdracht om het SQL-script uit te voeren om de niet-beheerdersgebruiker van Microsoft Entra te maken:
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
Gebruik nu de volgende opdracht om het tijdelijke SQL-scriptbestand te verwijderen:
rm create_ad_user.sql
Notitie
Meer gedetailleerde informatie over het maken van MySQL-gebruikers vindt u in Create users in Azure Database for MySQL.
3) Meld u aan en migreer de app-code om wachtwoordloze verbindingen te gebruiken
Zorg ervoor dat u voor lokale ontwikkeling bent geverifieerd met hetzelfde Microsoft Entra-account waaraan u de rol hebt toegewezen in uw MySQL. U kunt zich verifiëren via de Azure CLI, Visual Studio, Azure PowerShell of andere hulpprogramma's, zoals IntelliJ.
Meld u aan bij Azure via de Azure CLI met behulp van de volgende opdracht:
az login
Gebruik vervolgens de volgende stappen om uw code bij te werken voor het gebruik van verbindingen zonder wachtwoord. Hoewel conceptueel vergelijkbaar, gebruikt elke taal verschillende implementatiedetails.
Voeg in uw project de volgende verwijzing toe aan het
azure-identity-extensions
pakket. Deze bibliotheek bevat alle entiteiten die nodig zijn voor het implementeren van verbindingen zonder wachtwoord.<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity-extensions</artifactId> <version>1.0.0</version> </dependency>
Schakel de Azure MySQL-verificatieinvoegtoepassing in de JDBC-URL in. Identificeer de locaties in uw code die momenteel een
java.sql.Connection
verbinding maken met Azure Database for MySQL. Werkurl
het bestand application.properties bij enuser
komt overeen met de volgende waarden: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_USERNAME
Notitie
Als u de
MysqlConnectionPoolDataSource
klasse gebruikt als de gegevensbron in uw toepassing, moet u deze verwijderendefaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
uit de 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_USERNAME
Vervang de ene
$AZ_DATABASE_SERVER_NAME
variabele, één$AZ_DATABASE_NAME
variabele en één$AZ_MYSQL_AD_NON_ADMIN_USERNAME
variabele door de waarden die u aan het begin van dit artikel hebt geconfigureerd.Verwijder de
password
uit de JDBC-URL.
De app lokaal uitvoeren
Nadat u deze codewijzigingen hebt aangebracht, voert u uw toepassing lokaal uit. De nieuwe configuratie moet uw lokale referenties ophalen als u bent aangemeld bij een compatibel IDE- of opdrachtregelprogramma, zoals de Azure CLI, Visual Studio of IntelliJ. Met de rollen die u hebt toegewezen aan uw lokale dev-gebruiker in Azure, kan uw app lokaal verbinding maken met de Azure-service.
4) De Azure-hostingomgeving configureren
Nadat uw toepassing is geconfigureerd voor het gebruik van verbindingen zonder wachtwoord en deze lokaal wordt uitgevoerd, kan dezelfde code worden geverifieerd bij Azure-services nadat deze is geïmplementeerd in Azure. Een toepassing die is geïmplementeerd in een Azure-app Service-exemplaar waaraan een beheerde identiteit is toegewezen, kan bijvoorbeeld verbinding maken met Azure Storage.
In deze sectie voert u twee stappen uit om ervoor te zorgen dat uw toepassing op een wachtwoordloze manier kan worden uitgevoerd in een Azure-hostingomgeving:
- Wijs de beheerde identiteit toe voor uw Azure-hostingomgeving.
- Wijs rollen toe aan de beheerde identiteit.
Notitie
Azure biedt ook serviceconnector, waarmee u uw hostingservice kunt verbinden met PostgreSQL. Met Service Connector om uw hostingomgeving te configureren, kunt u de stap voor het toewijzen van rollen aan uw beheerde identiteit weglaten, omdat Service Connector dit voor u doet. In de volgende sectie wordt beschreven hoe u uw Azure-hostingomgeving op twee manieren configureert: één via serviceconnector en de andere door elke hostingomgeving rechtstreeks te configureren.
Belangrijk
Voor de opdrachten van serviceconnector is Azure CLI 2.41.0 of hoger vereist.
De beheerde identiteit toewijzen met behulp van Azure Portal
De volgende stappen laten zien hoe u een door het systeem toegewezen beheerde identiteit toewijst voor verschillende webhostingservices. De beheerde identiteit kan veilig verbinding maken met andere Azure-services met behulp van de app-configuraties die u eerder hebt ingesteld.
Selecteer Identiteit in het navigatiedeelvenster op de hoofdpagina van uw Azure-app Service-exemplaar.
Zorg ervoor dat u op het tabblad Systeem toegewezen het veld Status instelt op Aan. Een door het systeem toegewezen identiteit wordt intern beheerd door Azure en verwerkt beheertaken voor u. De details en id's van de identiteit worden nooit weergegeven in uw code.
U kunt ook beheerde identiteit toewijzen in een Azure-hostingomgeving met behulp van de Azure CLI.
U kunt een beheerde identiteit toewijzen aan een Azure-app Service-exemplaar met de opdracht az webapp identity assign, zoals wordt weergegeven in het volgende voorbeeld:
export AZ_MI_OBJECT_ID=$(az webapp identity assign \
--resource-group $AZ_RESOURCE_GROUP \
--name <service-instance-name> \
--query principalId \
--output tsv)
Rollen toewijzen aan de beheerde identiteit
Wijs vervolgens machtigingen toe aan de beheerde identiteit die u hebt toegewezen voor toegang tot uw MySQL-exemplaar.
Met deze stappen maakt u een Microsoft Entra-gebruiker voor de beheerde identiteit en verleent u alle machtigingen voor de database $AZ_DATABASE_NAME
. U kunt de databasenaam $AZ_DATABASE_NAME
aanpassen aan uw behoeften.
Maak eerst een SQL-script met de naam create_ad_user.sql voor het maken van een niet-beheerdersgebruiker. Voeg de volgende inhoud toe en sla deze lokaal op:
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
Gebruik vervolgens de volgende opdracht om het SQL-script uit te voeren om de niet-beheerdersgebruiker van Microsoft Entra te maken:
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
Gebruik nu de volgende opdracht om het tijdelijke SQL-scriptbestand te verwijderen:
rm create_ad_user.sql
De app testen
Voordat u de app implementeert in de hostingomgeving, moet u nog een wijziging aanbrengen in de code omdat de toepassing verbinding gaat maken met MySQL met behulp van de gebruiker die is gemaakt voor de beheerde identiteit.
Werk uw code bij om de gebruiker te gebruiken die is gemaakt voor de beheerde identiteit:
properties.put("user", "$AZ_MYSQL_AD_MI_USERNAME");
Nadat u deze codewijzigingen hebt aangebracht, kunt u de toepassing bouwen en opnieuw implementeren. Blader vervolgens naar uw gehoste toepassing in de browser. Uw app moet verbinding kunnen maken met de MySQL-database. Houd er rekening mee dat het enkele minuten kan duren voordat de roltoewijzingen zijn doorgegeven via uw Azure-omgeving. Uw toepassing is nu geconfigureerd om zowel lokaal als in een productieomgeving uit te voeren zonder dat de ontwikkelaars geheimen in de toepassing zelf hoeven te beheren.
Volgende stappen
In deze zelfstudie hebt u geleerd hoe u een toepassing migreert naar verbindingen zonder wachtwoord.
U kunt de volgende bronnen lezen om de concepten die in dit artikel worden besproken, uitgebreider te verkennen: