MySQL için Azure Veritabanı ile parolasız bağlantılar kullanmak için bir uygulamayı geçirme

Bu makalede, geleneksel kimlik doğrulama yöntemlerinden MySQL için Azure Veritabanı ile daha güvenli, parolasız bağlantılara nasıl geçirilir açıklanmaktadır.

MySQL için Azure Veritabanı uygulama isteklerinin kimliği doğrulanmalıdır. MySQL için Azure Veritabanı, uygulamaların güvenli bir şekilde bağlanması için birkaç farklı yol sağlar. Yollardan biri parolaları kullanmaktır. Ancak, mümkün olduğunda uygulamalarınızda parolasız bağlantılara öncelik vermelisiniz.

Kimlik doğrulama seçeneklerini karşılaştırma

Uygulama MySQL için Azure Veritabanı ile kimlik doğrulaması yaparken veritabanına bağlanmak için bir kullanıcı adı ve parola çifti sağlar. Kimliklerin depolandığı yere bağlı olarak iki kimlik doğrulaması türü vardır: Microsoft Entra kimlik doğrulaması ve MySQL kimlik doğrulaması.

Microsoft Entra doğrulaması

Microsoft Entra kimlik doğrulaması, Microsoft Entra Id'de tanımlanan kimlikleri kullanarak MySQL için Azure Veritabanı bağlanmaya yönelik bir mekanizmadır. Microsoft Entra kimlik doğrulaması ile veritabanı kullanıcı kimliklerini ve diğer Microsoft hizmetleri merkezi bir konumda yönetebilir ve bu da izin yönetimini basitleştirir.

Kimlik doğrulaması için Microsoft Entra Id kullanmak aşağıdaki avantajları sağlar:

  • Azure Hizmetleri genelinde kullanıcıların tekdüzen bir şekilde kimlik doğrulaması.
  • Parola ilkelerinin ve parola döndürmenin tek bir yerde yönetimi.
  • Microsoft Entra Id tarafından desteklenen ve parolaları depolama gereksinimini ortadan kaldırabilen birden çok kimlik doğrulaması biçimi.
  • Müşteriler dış (Microsoft Entra Id) gruplarını kullanarak veritabanı izinlerini yönetebilir.
  • Microsoft Entra kimlik doğrulaması, kimlikleri veritabanı düzeyinde doğrulamak için MySQL veritabanı kullanıcılarını kullanır.
  • MySQL için Azure Veritabanı bağlanan uygulamalar için belirteç tabanlı kimlik doğrulaması desteği.

MySQL kimlik doğrulaması

MySQL'de hesap oluşturabilirsiniz. Hesaplar için kimlik bilgileri olarak parolaları kullanmayı seçerseniz, bu kimlik bilgileri tabloda depolanır user . Bu parolalar MySQL'de depolandığından, parolaların döndürmesini kendiniz yönetmeniz gerekir.

parolalarla MySQL için Azure Veritabanı bağlanmak mümkün olsa da, bunları dikkatli kullanmanız gerekir. Parolaları güvenli olmayan bir konumda asla kullanıma sunmamak için dikkatli olmanız gerekir. Parolalara erişim kazanan herkes kimlik doğrulaması yapabilir. Örneğin, bir bağlantı dizesi yanlışlıkla kaynak denetimine iade edilirse, güvenli olmayan bir e-postayla gönderilirse, yanlış sohbete yapıştırılırsa veya izni olmayan biri tarafından görüntülenirse kötü amaçlı bir kullanıcının uygulamaya erişme riski vardır. Bunun yerine, uygulamanızı parolasız bağlantıları kullanacak şekilde güncelleştirmeyi göz önünde bulundurun.

Parolasız bağlantılara giriş

Parolasız bağlantıyla, uygulama kodunda, yapılandırma dosyalarında veya ortam değişkenlerinde kimlik bilgilerini depolamadan Azure hizmetlerine bağlanabilirsiniz.

Birçok Azure hizmeti, örneğin Azure Yönetilen Kimliği aracılığıyla parolasız bağlantıları destekler. Bu teknikler, Azure Identity istemci kitaplıklarından DefaultAzureCredential kullanarak uygulayabileceğiniz güçlü güvenlik özellikleri sağlar. Bu öğreticide, bağlantı dizesi gibi alternatifler yerine mevcut bir uygulamayı kullanmak DefaultAzureCredential üzere güncelleştirmeyi öğreneceksiniz.

DefaultAzureCredential birden çok kimlik doğrulama yöntemini destekler ve hangilerinin çalışma zamanında kullanılması gerektiğini otomatik olarak belirler. Bu yaklaşım, uygulamanızın ortama özgü kod uygulamadan farklı ortamlarda (yerel geliştirme ve üretim) farklı kimlik doğrulama yöntemleri kullanmasını sağlar.

Kimlik bilgilerini arama sırası ve konumları DefaultAzureCredential Azure Kimlik kitaplığına genel bakış sayfasında bulabilirsiniz. Örneğin, yerel olarak çalışırken genellikle DefaultAzureCredential geliştiricinin Visual Studio'da oturum açmak için kullandığı hesabı kullanarak kimlik doğrulaması yapar. Uygulama Azure'a dağıtıldığında, DefaultAzureCredential otomatik olarak yönetilen kimlik kullanmaya geçer. Bu geçiş için kod değişikliği gerekmez.

Bağlantıların parolasız olduğundan emin olmak için hem yerel geliştirmeyi hem de üretim ortamını dikkate almanız gerekir. Her iki yerde de bir bağlantı dizesi gerekiyorsa, uygulama parolasız değildir.

Yerel geliştirme ortamınızda, Visual Studio Code veya IntelliJ için Azure CLI, Azure PowerShell, Visual Studio veya Azure eklentileriyle kimlik doğrulaması yapabilirsiniz. Bu durumda, özellikleri yapılandırmak yerine uygulamanızda bu kimlik bilgilerini kullanabilirsiniz.

Uygulamaları sanal makine gibi bir Azure barındırma ortamına dağıttığınızda, bu ortamda yönetilen kimlik atayabilirsiniz. Ardından, Azure hizmetlerine bağlanmak için kimlik bilgileri sağlamanız gerekmez.

Not

Yönetilen kimlik, bir uygulamayı veya hizmeti temsil eden bir güvenlik kimliği sağlar. Kimlik Azure platformu tarafından yönetilir ve herhangi bir gizli dizi sağlamanızı veya döndürmenizi gerektirmez. Yönetilen kimlikler hakkında daha fazla bilgiyi genel bakış belgelerinde okuyabilirsiniz.

Var olan bir uygulamayı parolasız bağlantıları kullanacak şekilde geçirme

Aşağıdaki adımlarda, mevcut bir uygulamanın parola tabanlı bir çözüm yerine parolasız bağlantıları kullanacak şekilde nasıl geçirilir açıklanmaktadır.

0) Çalışma ortamını hazırlama

İlk olarak, bazı ortam değişkenlerini ayarlamak için aşağıdaki komutu kullanın.

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)

Yer tutucuları, bu makale boyunca kullanılan aşağıdaki değerlerle değiştirin:

  • <YOUR_RESOURCE_GROUP>: Kaynaklarınızın içinde olduğu kaynak grubunun adı.
  • <YOUR_DATABASE_SERVER_NAME>: MySQL sunucunuzun adıdır ve bu ad Azure genelinde benzersiz olmalıdır.
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: Microsoft Entra yönetici olmayan kullanıcınızın görünen adı. Adın Microsoft Entra kiracınızda geçerli bir kullanıcı olduğundan emin olun.
  • <YOUR_AZURE_AD_MI_DISPLAY_NAME>: Yönetilen kimliğiniz için Microsoft Entra kullanıcısının görünen adı. Adın Microsoft Entra kiracınızda geçerli bir kullanıcı olduğundan emin olun.
  • <YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>: Azure genelinde benzersiz olması gereken, kullanıcı tarafından atanan yönetilen kimlik sunucunuzun adı.

1) MySQL için Azure Veritabanı yapılandırma

1.1) Microsoft Entra Id tabanlı kimlik doğrulamasını etkinleştirme

Microsoft Entra Id erişimini MySQL için Azure Veritabanı kullanmak için önce Microsoft Entra yönetici kullanıcısını ayarlamanız gerekir. Yalnızca bir Microsoft Entra Admin kullanıcısı, Microsoft Entra Id tabanlı kimlik doğrulaması için kullanıcı oluşturabilir/etkinleştirebilir.

Azure CLI kullanıyorsanız, yeterli izne sahip olduğundan emin olmak için aşağıdaki komutu çalıştırın:

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

Atamak üzere kullanıcı kimliği oluşturmak için aşağıdaki komutu çalıştırın:

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

Önemli

Kullanıcı tarafından atanan kimliği oluşturduktan sonra, Genel Yöneticinizden veya Ayrıcalıklı Rol Yöneticinizden bu kimlik için aşağıdaki izinleri vermesini isteyin: User.Read.All, GroupMember.Read.Allve Application.Read.ALL. Daha fazla bilgi için Active Directory kimlik doğrulamasının İzinler bölümüne bakın.

Kimliği Microsoft Entra yöneticisini oluşturmak üzere MySQL sunucusuna atamak için aşağıdaki komutu çalıştırın:

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

Ardından, Microsoft Entra yöneticisini ayarlamak için aşağıdaki komutu çalıştırın:

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

Bu komut, Microsoft Entra yöneticisini geçerli oturum açmış kullanıcıya ayarlar.

Not

MySQL sunucusu başına yalnızca bir Microsoft Entra yöneticisi oluşturabilirsiniz. Başka bir seçim, sunucu için yapılandırılan mevcut Microsoft Entra yöneticisinin üzerine yazılır.

2) yerel geliştirme için MySQL için Azure Veritabanı yapılandırma

2.1) Yerel IP için güvenlik duvarı kuralı yapılandırma

MySQL için Azure Veritabanı örnekleri varsayılan olarak güvenlidir. Gelen bağlantılara izin vermeyen bir güvenlik duvarı vardır.

Komut yerel IP adresinizi zaten algıladığı ve MySQL sunucusunda ayarladığı için flexible-server create Bash kullanıyorsanız bu adımı atlayabilirsiniz.

Windows bilgisayarda Linux için Windows Alt Sistemi 'den (WSL) MySQL sunucunuza bağlanıyorsanız, WSL ana bilgisayar kimliğini güvenlik duvarınıza eklemeniz gerekir. WSL'de aşağıdaki komutu çalıştırarak konak makinenizin IP adresini alın:

cat /etc/resolv.conf

teriminden nameserversonra IP adresini kopyalayın ve WSL IP adresi için bir ortam değişkeni ayarlamak için aşağıdaki komutu kullanın:

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

Ardından aşağıdaki komutu kullanarak sunucunun güvenlik duvarını WSL tabanlı uygulamanızda açın:

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) Yönetici olmayan bir MySQL kullanıcısı oluşturma ve izin verme

Ardından yönetici olmayan bir Microsoft Entra kullanıcısı oluşturun ve veritabanındaki $AZ_DATABASE_NAME tüm izinleri ona verin. Veritabanı adını $AZ_DATABASE_NAME gereksinimlerinize uyacak şekilde değiştirebilirsiniz.

Yönetici olmayan kullanıcı oluşturmak için create_ad_user.sql adlı bir SQL betiği oluşturun. Aşağıdaki içeriği ekleyin ve yerel olarak kaydedin:

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

Ardından aşağıdaki komutu kullanarak SQL betiğini çalıştırarak Microsoft Entra yönetici olmayan kullanıcıyı oluşturun:

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

Şimdi geçici SQL betik dosyasını kaldırmak için aşağıdaki komutu kullanın:

rm create_ad_user.sql

Not

MySQL kullanıcıları oluşturma hakkında daha ayrıntılı bilgileri MySQL için Azure Veritabanı'de kullanıcı oluşturma bölümünden okuyabilirsiniz.

3) Parolasız bağlantıları kullanmak için oturum açın ve uygulama kodunu geçirin

Yerel geliştirme için MySQL'inizde rolü atadığınız Microsoft Entra hesabıyla kimliğinizin doğrulanmış olduğundan emin olun. Azure CLI, Visual Studio, Azure PowerShell veya IntelliJ gibi diğer araçlar aracılığıyla kimlik doğrulaması yapabilirsiniz.

Aşağıdaki komutu kullanarak Azure CLI aracılığıyla Azure'da oturum açın:

az login

Ardından, aşağıdaki adımları kullanarak kodunuzu parolasız bağlantıları kullanacak şekilde güncelleştirin. Kavramsal olarak benzer olsa da, her dil farklı uygulama ayrıntıları kullanır.

  1. Projenizin içine pakete aşağıdaki başvuruyu azure-identity-extensions ekleyin. Bu kitaplık, parolasız bağlantılar uygulamak için gereken tüm varlıkları içerir.

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. JDBC URL'sinde Azure MySQL kimlik doğrulama eklentisini etkinleştirin. Kodunuzda şu anda MySQL için Azure Veritabanı bağlanmak için bir java.sql.Connection oluşturan konumları belirleyin. application.properties dosyanızda ve user değerlerini aşağıdaki değerlerle eşleşecek şekilde güncelleştirinurl:

    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
    

    Not

    Sınıfını MysqlConnectionPoolDataSource uygulamanızda veri kaynağı olarak kullanıyorsanız URL'den kaldırdığınızdan defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin emin olun.

    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. Bir $AZ_DATABASE_SERVER_NAME değişken, bir $AZ_DATABASE_NAME değişken ve bir $AZ_MYSQL_AD_NON_ADMIN_USERNAME değişkeni bu makalenin başında yapılandırdığınız değerlerle değiştirin.

  4. JDBC URL'sinden öğesini password kaldırın.

Uygulamayı yerel olarak çalıştırma

Bu kod değişikliklerini yaptıktan sonra uygulamanızı yerel olarak çalıştırın. Azure CLI, Visual Studio veya IntelliJ gibi uyumlu bir IDE veya komut satırı aracında oturum açtıysanız yeni yapılandırma yerel kimlik bilgilerinizi almalıdır. Azure'da yerel geliştirici kullanıcınıza atadığınız roller, uygulamanızın Azure hizmetine yerel olarak bağlanmasına olanak tanır.

4) Azure barındırma ortamını yapılandırma

Uygulamanız parolasız bağlantıları kullanacak şekilde yapılandırıldıktan ve yerel olarak çalıştırıldıktan sonra, Azure'a dağıtıldıktan sonra aynı kod Azure hizmetlerinde kimlik doğrulaması yapabilir. Örneğin, yönetilen kimliği atanmış bir Azure Uygulaması Hizmeti örneğine dağıtılan bir uygulama Azure Depolama'ya bağlanabilir.

Bu bölümde, uygulamanızın Azure barındırma ortamında parolasız bir şekilde çalışmasını sağlamak için iki adım yürüteceksiniz:

  • Azure barındırma ortamınız için yönetilen kimliği atayın.
  • Yönetilen kimliğe roller atayın.

Not

Azure, barındırma hizmetinizi PostgreSQL'e bağlamanıza yardımcı olabilecek Hizmet Bağlayıcısı da sağlar. Barındırma ortamınızı yapılandırmak için Hizmet Bağlayıcısı ile yönetilen kimliğinize rol atama adımını atlayabilirsiniz çünkü Hizmet Bağlayıcısı bunu sizin yerinize yapar. Aşağıdaki bölümde Azure barındırma ortamınızı iki şekilde yapılandırma adımları açıklanmaktadır: Biri Service Connector aracılığıyla, diğeri ise her barındırma ortamını doğrudan yapılandırarak.

Önemli

Hizmet Bağlayıcısı komutları Için Azure CLI 2.41.0 veya üzeri gerekir.

Azure portalını kullanarak yönetilen kimliği atama

Aşağıdaki adımlarda, çeşitli web barındırma hizmetleri için sistem tarafından atanan yönetilen kimliğin nasıl atandığı gösterilmektedir. Yönetilen kimlik, daha önce ayarladığınız uygulama yapılandırmalarını kullanarak diğer Azure Hizmetlerine güvenli bir şekilde bağlanabilir.

  1. Azure Uygulaması Hizmeti örneğinizin ana genel bakış sayfasında gezinti bölmesinden Kimlik'i seçin.

  2. Sistem tarafından atanan sekmesinde Durum alanını açık olarak ayarladığınızdan emin olun. Sistem tarafından atanan kimlik, Azure tarafından şirket içinde yönetilir ve yönetim görevlerini sizin için gerçekleştirir. Kimliğin ayrıntıları ve kimlikleri kodunuzda hiçbir zaman gösterilmez.

Azure CLI'yı kullanarak azure barındırma ortamında yönetilen kimlik de atayabilirsiniz.

Aşağıdaki örnekte gösterildiği gibi az webapp identity assign komutuyla bir Azure Uygulaması Service örneğine yönetilen kimlik atayabilirsiniz:

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

Yönetilen kimliğe rol atama

Ardından, MySQL örneğine erişmek için atadığınız yönetilen kimliğe izin verin.

Bu adımlar yönetilen kimlik için bir Microsoft Entra kullanıcısı oluşturur ve veritabanı $AZ_DATABASE_NAME için tüm izinleri verir. Veritabanı adını $AZ_DATABASE_NAME gereksinimlerinize uyacak şekilde değiştirebilirsiniz.

İlk olarak, yönetici olmayan kullanıcı oluşturmak için create_ad_user.sql adlı bir SQL betiği oluşturun. Aşağıdaki içeriği ekleyin ve yerel olarak kaydedin:

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

Ardından aşağıdaki komutu kullanarak SQL betiğini çalıştırarak Microsoft Entra yönetici olmayan kullanıcıyı oluşturun:

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

Şimdi geçici SQL betik dosyasını kaldırmak için aşağıdaki komutu kullanın:

rm create_ad_user.sql

Uygulamayı test etme

Uygulamayı barındırma ortamına dağıtmadan önce, uygulama yönetilen kimlik için oluşturulan kullanıcıyı kullanarak MySQL'e bağlanacağından kodda bir değişiklik daha yapmanız gerekir.

Kodunuzu yönetilen kimlik için oluşturulan kullanıcıyı kullanacak şekilde güncelleştirin:

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

Bu kod değişikliklerini yaptıktan sonra uygulamayı derleyebilir ve yeniden dağıtabilirsiniz. Ardından tarayıcıda barındırılan uygulamanıza göz atın. Uygulamanızın MySQL veritabanına başarıyla bağlanabilmesi gerekir. Rol atamalarının Azure ortamınızda yayılmasının birkaç dakika sürebileceğini unutmayın. Uygulamanız artık geliştiricilerin uygulamadaki gizli dizileri yönetmek zorunda kalmadan hem yerel hem de üretim ortamında çalışacak şekilde yapılandırılmıştır.

Sonraki adımlar

Bu öğreticide, bir uygulamayı parolasız bağlantılara geçirmeyi öğrendiniz.

Bu makalede ele alınan kavramları daha ayrıntılı incelemek için aşağıdaki kaynakları okuyabilirsiniz: