Migrace aplikace pro použití bez hesel s Využitím služby Azure Database for MySQL

Tento článek vysvětluje, jak migrovat z tradičních metod ověřování na bezpečnější připojení bez hesla pomocí služby Azure Database for MySQL.

Žádosti o aplikace do služby Azure Database for MySQL musí být ověřeny. Azure Database for MySQL nabízí několik různých způsobů, jak se aplikace bezpečně připojit. Jedním ze způsobů je použití hesel. Pokud je to však možné, měli byste upřednostnit připojení bez hesla ve vašich aplikacích.

Porovnání možností ověřování

Když se aplikace ověří ve službě Azure Database for MySQL, poskytne pár uživatelského jména a hesla pro připojení k databázi. V závislosti na tom, kde jsou identity uložené, existují dva typy ověřování: ověřování Microsoft Entra a ověřování MySQL.

Ověřování Microsoft Entra

Ověřování Microsoft Entra je mechanismus pro připojení ke službě Azure Database for MySQL pomocí identit definovaných v MICROSOFT Entra ID. Pomocí ověřování Microsoft Entra můžete spravovat identity uživatelů databáze a další služby Microsoft v centrálním umístění, což zjednodušuje správu oprávnění.

Použití ID Microsoft Entra pro ověřování poskytuje následující výhody:

  • Jednotné ověřování uživatelů ve službách Azure
  • Správa zásad hesel a obměně hesel na jednom místě
  • Více forem ověřování, které podporuje ID Microsoft Entra, což může eliminovat potřebu ukládat hesla.
  • Zákazníci můžou spravovat oprávnění k databázi pomocí externích skupin (Microsoft Entra ID).
  • Ověřování Microsoft Entra používá uživatele databáze MySQL k ověřování identit na úrovni databáze.
  • Podpora ověřování na základě tokenů pro aplikace připojující se ke službě Azure Database for MySQL

Ověřování MySQL

V MySQL můžete vytvářet účty. Pokud se rozhodnete používat hesla jako přihlašovací údaje pro účty, budou tyto přihlašovací údaje uloženy v user tabulce. Vzhledem k tomu, že tato hesla jsou uložená v MySQL, musíte spravovat rotaci hesel sami.

I když se můžete připojit ke službě Azure Database for MySQL pomocí hesel, měli byste je používat opatrně. Musíte být usilovní, abyste nikdy nezpřístupnili hesla v nezabezpečeném umístění. Každý, kdo získá přístup k heslům, se může ověřit. Existuje například riziko, že uživatel se zlými úmysly může získat přístup k aplikaci, pokud se připojovací řetězec omylem přihlásí ke správě zdrojového kódu, odešle se prostřednictvím nezabezpečeného e-mailu, vloží do nesprávného chatu nebo ho někdo, kdo by neměl mít oprávnění. Místo toho zvažte aktualizaci aplikace tak, aby používala připojení bez hesla.

Představujeme připojení bez hesla

S připojením bez hesla se můžete připojit ke službám Azure, aniž byste museli ukládat přihlašovací údaje v kódu aplikace, jeho konfiguračních souborech nebo v proměnných prostředí.

Mnoho služeb Azure podporuje připojení bez hesla, například prostřednictvím spravované identity Azure. Tyto techniky poskytují robustní funkce zabezpečení, které můžete implementovat pomocí DefaultAzureCredential z klientských knihoven identit Azure. V tomto kurzu se dozvíte, jak aktualizovat existující aplikaci tak, aby používala DefaultAzureCredential místo alternativ, jako jsou připojovací řetězec.

DefaultAzureCredential podporuje více metod ověřování a automaticky určuje, které metody by se měly používat za běhu. Tento přístup umožňuje vaší aplikaci používat různé metody ověřování v různých prostředích (místní vývoj a produkční prostředí) bez implementace kódu specifického pro prostředí.

Pořadí a umístění, ve kterých DefaultAzureCredential se hledají přihlašovací údaje, najdete v přehledu knihovny identit Azure. Pokud například pracujete místně, bude se obecně ověřovat pomocí účtu, DefaultAzureCredential který vývojář použil k přihlášení k sadě Visual Studio. Po nasazení aplikace do Azure DefaultAzureCredential se automaticky přepne na použití spravované identity. Pro tento přechod nejsou vyžadovány žádné změny kódu.

Pokud chcete zajistit, aby připojení byla bez hesla, musíte vzít v úvahu místní vývoj i produkční prostředí. Pokud se připojovací řetězec vyžaduje na jiném místě, aplikace není bez hesla.

V místním vývojovém prostředí se můžete ověřit pomocí Azure CLI, Azure PowerShellu, sady Visual Studio nebo modulů plug-in Azure pro Visual Studio Code nebo IntelliJ. V takovém případě můžete místo konfigurace vlastností použít tyto přihlašovací údaje ve vaší aplikaci.

Když nasadíte aplikace do hostitelského prostředí Azure, jako je virtuální počítač, můžete v tomto prostředí přiřadit spravovanou identitu. Pak nebudete muset zadávat přihlašovací údaje pro připojení ke službám Azure.

Poznámka:

Spravovaná identita poskytuje identitu zabezpečení, která představuje aplikaci nebo službu. Identitu spravuje platforma Azure a nevyžaduje, abyste zřizovali nebo rotovali tajné kódy. Další informace o spravovaných identitách najdete v přehledové dokumentaci.

Migrace existující aplikace pro použití připojení bez hesla

Následující postup vysvětluje, jak migrovat existující aplikaci tak, aby místo řešení založeného na heslech používala připojení bez hesla.

0) Příprava pracovního prostředí

Nejprve pomocí následujícího příkazu nastavte některé proměnné prostředí.

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)

Zástupné symboly nahraďte následujícími hodnotami, které se používají v tomto článku:

  • <YOUR_RESOURCE_GROUP>: Název skupiny prostředků, ve které jsou vaše prostředky.
  • <YOUR_DATABASE_SERVER_NAME>: Název vašeho serveru MySQL, který by měl být jedinečný v rámci Azure.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: Zobrazované jméno uživatele Microsoft Entra, který není správcem. Ujistěte se, že je jméno platným uživatelem ve vašem tenantovi Microsoft Entra.
  • <YOUR_AZURE_AD_MI_DISPLAY_NAME>: Zobrazovaný název uživatele Microsoft Entra pro vaši spravovanou identitu. Ujistěte se, že je jméno platným uživatelem ve vašem tenantovi Microsoft Entra.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: Název serveru spravované identity přiřazeného uživatelem, který by měl být jedinečný v rámci Azure.

1) Konfigurace služby Azure Database for MySQL

1.1) Povolení ověřování založeného na ID microsoftu Entra

Pokud chcete používat přístup k ID Microsoft Entra se službou Azure Database for MySQL, měli byste nejprve nastavit uživatele správce Microsoft Entra. Pouze uživatel Microsoft Entra Správa může vytvářet nebo povolovat uživatele pro ověřování založené na ID Microsoft Entra.

Pokud používáte Azure CLI, spusťte následující příkaz, abyste měli jistotu, že má dostatečná oprávnění:

az login --scope https://graph.microsoft.com/.default

Spuštěním následujícího příkazu vytvořte identitu uživatele pro přiřazení:

az identity create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_USER_IDENTITY_NAME

Důležité

Po vytvoření identity přiřazené uživatelem požádejte globální Správa istrator nebo privilegovanou roli Správa istrator udělit následující oprávnění pro tuto identitu: User.Read.All, GroupMember.Read.Alla Application.Read.ALL. Další informace najdete v části Oprávnění ověřování active directory.

Spuštěním následujícího příkazu přiřaďte identitu k serveru MySQL pro vytvoření správce Microsoft Entra:

az mysql flexible-server identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --identity $AZ_USER_IDENTITY_NAME

Potom spuštěním následujícího příkazu nastavte správce 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

Tento příkaz nastaví správce Microsoft Entra na aktuální přihlášeného uživatele.

Poznámka:

Na server MySQL můžete vytvořit pouze jednoho správce Microsoft Entra. Výběr jiného přepíše stávající správce Microsoft Entra nakonfigurovaný pro server.

2) Konfigurace služby Azure Database for MySQL pro místní vývoj

2.1) Konfigurace pravidla brány firewall pro místní IP adresu

Instance Azure Database for MySQL jsou ve výchozím nastavení zabezpečené. Obsahuje bránu firewall, která nepovoluje žádné příchozí připojení.

Tento krok můžete přeskočit, pokud používáte Bash, protože flexible-server create příkaz už detekoval vaši místní IP adresu a nastavil ji na serveru MySQL.

Pokud se připojujete k serveru MySQL z Subsystém Windows pro Linux (WSL) na počítači s Windows, musíte do brány firewall přidat ID hostitele WSL. Získejte IP adresu hostitelského počítače spuštěním následujícího příkazu ve WSL:

cat /etc/resolv.conf

Zkopírujte IP adresu za termínem nameservera pak pomocí následujícího příkazu nastavte proměnnou prostředí pro IP adresu WSL:

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

Pak pomocí následujícího příkazu otevřete bránu firewall serveru pro vaši aplikaci založenou na 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) Vytvoření uživatele bez oprávnění správce MySQL a udělení oprávnění

Dále vytvořte uživatele Microsoft Entra, který není správcem, a udělte mu všechna oprávnění k $AZ_DATABASE_NAME databázi. Název $AZ_DATABASE_NAME databáze můžete změnit tak, aby vyhovoval vašim potřebám.

Vytvořte skript SQL s názvem create_ad_user.sql pro vytvoření uživatele bez oprávnění správce. Přidejte následující obsah a uložte ho místně:

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

Potom pomocí následujícího příkazu spusťte skript SQL a vytvořte uživatele Microsoft Entra bez oprávnění správce:

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

Teď pomocí následujícího příkazu odeberte dočasný soubor skriptu SQL:

rm create_ad_user.sql

Poznámka:

Podrobnější informace o vytváření uživatelů MySQL najdete v tématu Vytváření uživatelů ve službě Azure Database for MySQL.

3) Přihlaste se a migrujte kód aplikace tak, aby používal připojení bez hesla.

V případě místního vývoje se ujistěte, že jste ověřeni pomocí stejného účtu Microsoft Entra, ke kterému jste přiřadili roli ve službě MySQL. Ověřování můžete provést prostřednictvím Azure CLI, sady Visual Studio, Azure PowerShellu nebo jiných nástrojů, jako je IntelliJ.

Přihlaste se k Azure přes Azure CLI pomocí následujícího příkazu:

az login

Dále pomocí následujících kroků aktualizujte kód tak, aby používal připojení bez hesla. I když jsou koncepčně podobné, každý jazyk používá různé podrobnosti implementace.

  1. Do projektu přidejte do balíčku následující odkaz azure-identity-extensions . Tato knihovna obsahuje všechny entity potřebné k implementaci připojení bez hesla.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Povolte ověřovací modul plug-in Azure MySQL v adrese URL JDBC. Identifikujte umístění v kódu, která aktuálně vytvářejí připojení ke službě java.sql.Connection Azure Database for MySQL. Aktualizujte urlsoubor application.properties a user v souboru application.properties tak, aby odpovídaly následujícím hodnotám:

    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
    

    Poznámka:

    Pokud třídu MysqlConnectionPoolDataSource používáte jako zdroj dat v aplikaci, nezapomeňte ji z adresy URL odebrat defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin .

    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
    
  3. Nahraďte jednu $AZ_DATABASE_SERVER_NAME proměnnou, jednu $AZ_DATABASE_NAME proměnnou a jednu $AZ_MYSQL_AD_NON_ADMIN_USERNAME proměnnou hodnotami, které jste nakonfigurovali na začátku tohoto článku.

  4. Odeberte adresu password URL JDBC.

Místní spuštění aplikace

Po provedení těchto změn kódu spusťte aplikaci místně. Pokud jste přihlášení k kompatibilnímu integrovanému vývojovému prostředí nebo nástroji příkazového řádku, jako je Azure CLI, Visual Studio nebo IntelliJ, měla by nová konfigurace vyzvednout vaše místní přihlašovací údaje. Role, které jste přiřadili místnímu vývojovému uživateli v Azure, umožní vaší aplikaci připojit se ke službě Azure místně.

4) Konfigurace hostitelského prostředí Azure

Jakmile je vaše aplikace nakonfigurovaná tak, aby používala připojení bez hesla a běží místně, může se stejný kód po nasazení do Azure ověřit ve službách Azure. Například aplikace nasazená do instance služby Aplikace Azure, která má přiřazenou spravovanou identitu, se může připojit ke službě Azure Storage.

V této části provedete dva kroky, které vaší aplikaci umožní spouštět v hostitelském prostředí Azure bez hesla:

  • Přiřaďte spravovanou identitu pro hostitelské prostředí Azure.
  • Přiřaďte spravované identitě role.

Poznámka:

Azure také poskytuje service Připojení or, který vám může pomoct s propojením hostitelské služby s PostgreSQL. Pomocí nástroje Service Připojení or pro konfiguraci hostitelského prostředí můžete vynechat krok přiřazování rolí spravované identitě, protože služba Připojení or to udělá za vás. Následující část popisuje, jak nakonfigurovat hostitelské prostředí Azure dvěma způsoby: jedno prostřednictvím služby Připojení or a druhé konfigurací každého hostitelského prostředí přímo.

Důležité

Příkazy služby Připojení or vyžadují Azure CLI 2.41.0 nebo vyšší.

Přiřazení spravované identity pomocí webu Azure Portal

Následující kroky ukazují, jak přiřadit spravovanou identitu přiřazenou systémem pro různé služby hostování webů. Spravovaná identita se může bezpečně připojit k jiným službám Azure pomocí konfigurací aplikací, které jste nastavili dříve.

  1. Na hlavní stránce přehledu vaší instance služby Aplikace Azure vyberte v navigačním podokně identitu.

  2. Na kartě Přiřazený systém nezapomeňte nastavit pole Stav na zapnuto. Identitu přiřazenou systémem spravuje Azure interně a zpracovává úlohy správy za vás. Podrobnosti a ID identity se ve vašem kódu nikdy nezpřístupní.

    Screenshot of Azure portal Identity page of App Service resource with System assigned tab showing and Status field highlighted.

Spravovanou identitu můžete také přiřadit v hostitelském prostředí Azure pomocí Azure CLI.

Spravovanou identitu můžete přiřadit instanci služby Aplikace Azure pomocí příkazu az webapp identity assign, jak je znázorněno v následujícím příkladu:

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

Přiřazení rolí ke spravované identitě

Dále udělte oprávnění spravované identitě, kterou jste přiřadili pro přístup k vaší instanci MySQL.

Tento postup vytvoří uživatele Microsoft Entra pro spravovanou identitu a udělí mu všechna oprávnění pro databázi $AZ_DATABASE_NAME . Název $AZ_DATABASE_NAME databáze můžete změnit tak, aby vyhovoval vašim potřebám.

Nejprve vytvořte skript SQL s názvem create_ad_user.sql pro vytvoření uživatele bez oprávnění správce. Přidejte následující obsah a uložte ho místně:

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

Potom pomocí následujícího příkazu spusťte skript SQL a vytvořte uživatele Microsoft Entra bez oprávnění správce:

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

Teď pomocí následujícího příkazu odeberte dočasný soubor skriptu SQL:

rm create_ad_user.sql

Otestování aplikace

Před nasazením aplikace do hostitelského prostředí je potřeba provést další změnu kódu, protože se aplikace bude připojovat k MySQL pomocí uživatele vytvořeného pro spravovanou identitu.

Aktualizujte kód tak, aby používal uživatele vytvořeného pro spravovanou identitu:

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

Po provedení těchto změn kódu můžete aplikaci sestavit a znovu nasadit. Pak přejděte do hostované aplikace v prohlížeči. Vaše aplikace by se měla úspěšně připojit k databázi MySQL. Mějte na paměti, že rozšíření přiřazení rolí v prostředí Azure může trvat několik minut. Vaše aplikace je teď nakonfigurovaná tak, aby běžela místně i v produkčním prostředí, aniž by vývojáři museli spravovat tajné kódy v samotné aplikaci.

Další kroky

V tomto kurzu jste zjistili, jak migrovat aplikaci na připojení bez hesla.

Podrobnější informace o konceptech probíraných v tomto článku najdete v následujících zdrojích informací: