mssparkutils kullanarak bağlı hizmetlerle kimlik bilgilerinin güvenliğini sağlama

Dış kaynaklardan verilere erişmek yaygın bir desendir. Dış veri kaynağı anonim erişime izin vermediği sürece, bağlantınızın güvenliğini bir kimlik bilgileri, gizli dizi veya bağlantı dizesi ile sağlamanız gerekebilir.

Azure Synapse Analytics, kaynaklar arasında kimlik doğrulaması için varsayılan olarak Microsoft Entra geçişi kullanır. Başka kimlik bilgilerini kullanarak bir kaynağa bağlanmanız gerekiyorsa, doğrudan mssparkutils kullanın. mssparkutils paketi SAS belirteçlerini, Microsoft Entra belirteçlerini, bağlantı dizesi'leri ve bağlı bir hizmette veya Azure Key Vault'tan depolanan gizli dizileri alma işlemini basitleştirir.

Microsoft Entra geçişi, Synapse'e veya ayrı bir hizmet sorumlusuna atanan izinler yerine Microsoft Entra Kimliği'nde size kullanıcı olarak atanan izinleri kullanır. Örneğin, depolama hesabındaki bir bloba erişmek için Microsoft Entra geçişini kullanmak istiyorsanız bu depolama hesabına gidip blob katkıda bulunan rolünü kendinize atamanız gerekir.

Azure Key Vault'tan gizli dizileri alırken Azure Key Vault'unuza bağlı bir hizmet oluşturmanızı öneririz. Synapse çalışma alanı yönetilen hizmet kimliğinin (MSI) Azure Key Vault'unuzda Gizli Dizi Alma ayrıcalıklarına sahip olduğundan emin olun. Synapse, Synapse çalışma alanı yönetilen hizmet kimliğini kullanarak Azure Key Vault'ta kimlik doğrulaması yapar. Bağlı bir hizmet olmadan doğrudan Azure Key Vault'a bağlanırsanız, kullanıcı Microsoft Entra kimlik bilgilerinizi kullanarak kimlik doğrulaması yapma.

Daha fazla bilgi için bkz . bağlı hizmetler.

Kullanım

belirteçler ve gizli diziler için mssparkutils yardımı

Bu işlev Synapse'te gizli diziler ve belirteç yönetimi için yardım belgelerini görüntüler.

mssparkutils.credentials.help()
mssparkutils.credentials.help()
Console.WriteLine(TokenLibrary.help());

Sonucu al:

 getToken(audience: String, name: String): returns AAD token for a given audience, name (optional)
 isValidToken(token: String): returns true if token hasn't expired
 getConnectionStringOrCreds(linkedService: String): returns connection string or credentials for the linked service
 getFullConnectionString(linkedService: String): returns full connection string with credentials for the linked service
 getPropertiesAll(linkedService: String): returns all the properties of the linked service
 getSecret(akvName: String, secret: String, linkedService: String): returns AKV secret for a given AKV linked service, akvName, secret key using workspace MSI
 getSecret(akvName: String, secret: String): returns AKV secret for a given akvName, secret key using user credentials
 getSecretWithLS(linkedService: String, secret: String): returns AKV secret for a given linked service, secret key
 putSecret(akvName: String, secretName: String, secretValue: String): puts AKV secret for a given akvName, secretName
 putSecret(akvName: String, secretName: String, secretValue: String, linkedService: String): puts AKV secret for a given akvName, secretName
 putSecretWithLS(linkedService: String, secretName: String, secretValue: String): puts AKV secret for a given linked service, secretName

Erişim Azure Data Lake Storage 2. Nesil

ADLS 2. Nesil Birincil Depolama

Birincil Azure Data Lake Storage'dan dosyalara erişmek, varsayılan olarak kimlik doğrulaması için Microsoft Entra geçişini kullanır ve mssparkutils'in açıkça kullanılmasını gerektirmez. Geçiş kimlik doğrulamasında kullanılan kimlik, birkaç faktöre göre farklılık gösterir. Varsayılan olarak, etkileşimli not defterleri kullanıcının kimliği kullanılarak yürütülür, ancak çalışma alanı tarafından yönetilen hizmet kimliğine (MSI) değiştirilebilir. Toplu işler ve not defterinin etkileşimli olmayan yürütmeleri Çalışma Alanı MSI'sini kullanır.

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")
display(df.limit(10))
df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')
display(df.limit(10))

Bağlı hizmetlerle ADLS 2. Nesil depolama

Azure Synapse Analytics, Azure Data Lake Storage 2. Nesil bağlanırken tümleşik bir bağlı hizmetler deneyimi sağlar. Bağlı hizmetler Hesap Anahtarı, Hizmet Sorumlusu, Yönetilen Kimlik veya Kimlik Bilgileri kullanılarak kimlik doğrulaması yapmak üzere yapılandırılabilir.

Bağlı hizmet kimlik doğrulama yöntemi Hesap Anahtarı olarak ayarlandığında, bağlı hizmet sağlanan depolama hesabı anahtarını kullanarak kimlik doğrulaması yapar, bir SAS anahtarı isteyin ve LinkedServiceBasedSASProvider kullanarak bunu depolama isteğine otomatik olarak uygulayın.

Synapse, kullanıcıların belirli bir depolama hesabı için bağlı hizmeti ayarlamasına olanak tanır. Bu, tek bir Spark uygulamasında/sorgusunda birden çok depolama hesabından veri okumayı/yazmayı mümkün kılar. Kullanılacak her depolama hesabı için ayarlama spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName yaptığımızda Synapse, belirli bir okuma/yazma işlemi için hangi bağlı hizmetin kullanılacağını belirler. Ancak Spark işimiz yalnızca tek bir depolama hesabıyla ilgileniyorsa depolama hesabı adını atlayabilir ve kullanabiliriz spark.storage.synapse.linkedServiceName.

Not

Varsayılan ABFS depolama kapsayıcısının kimlik doğrulama yöntemini değiştirmek mümkün değildir.

val sc = spark.sparkContext
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(s"spark.storage.synapse.$source_full_storage_account_name.linkedServiceName", "<LINKED SERVICE NAME>")
sc.hadoopConfiguration.set(s"fs.azure.account.auth.type.$source_full_storage_account_name", "SAS")
sc.hadoopConfiguration.set(s"fs.azure.sas.token.provider.type.$source_full_storage_account_name", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedSASProvider")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
# Set the required configs
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(f"spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName", "<lINKED SERVICE NAME>")
sc._jsc.hadoopConfiguration().set(f"fs.azure.account.auth.type.{source_full_storage_account_name}", "SAS")
sc._jsc.hadoopConfiguration().set(f"fs.azure.sas.token.provider.type.{source_full_storage_account_name}", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedSASProvider")

# Python code
df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<DIRECTORY PATH>')

df.show()

Bağlı hizmet kimlik doğrulama yöntemi Yönetilen Kimlik veya Hizmet Sorumlusu olarak ayarlandığında, bağlı hizmet LinkedServiceBasedTokenProvider sağlayıcısıyla Yönetilen Kimlik veya Hizmet Sorumlusu belirtecini kullanır.

val sc = spark.sparkContext
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(s"spark.storage.synapse.$source_full_storage_account_name.linkedServiceName", "<LINKED SERVICE NAME>")
sc.hadoopConfiguration.set(s"fs.azure.account.oauth.provider.type.$source_full_storage_account_name", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider") 
val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
# Python code
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
spark.conf.set(f"spark.storage.synapse.{source_full_storage_account_name}.linkedServiceName", "<LINKED SERVICE NAME>")
sc._jsc.hadoopConfiguration().set(f"fs.azure.account.oauth.provider.type.{source_full_storage_account_name}", "com.microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<DIRECTORY PATH>')

df.show()

Spark yapılandırması aracılığıyla kimlik doğrulama ayarlarını belirleme

Kimlik doğrulama ayarları spark deyimlerini çalıştırmak yerine Spark yapılandırmaları aracılığıyla da belirtilebilir. Tüm Spark yapılandırmalarına ön ek spark. eklenmelidir ve tüm hadoop yapılandırmalarına ön ek spark.hadoop.eklenmelidir.

Spark yapılandırma adı Yapılandırma değeri
spark.storage.synapse.teststorage.dfs.core.windows.net.linkedServiceName BAĞLı HIZMET ADı
spark.hadoop.fs.azure.account.oauth.provider.type.teststorage.dfs.core.windows.net microsoft.azure.synapse.tokenlibrary.LinkedServiceBasedTokenProvider

Bağlı hizmetler olmadan ADLS 2. Nesil depolama

SAS anahtarı kullanarak ADLS 2. Nesil depolamaya doğrudan bağlanın. ConfBasedSASProvider ve komutunu kullanın ve yapılandırma ayarına spark.storage.synapse.sas SAS anahtarını sağlayın. SAS belirteçleri kapsayıcı düzeyinde, hesap düzeyinde veya genel olarak ayarlanabilir. İş birden fazla depolama hesabından okuma/yazma işlemi gerçekleştiremeyeceğinden SAS anahtarlarını genel düzeyde ayarlamanızı önermeyiz.

Depolama kapsayıcısı başına SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<CONTAINER>.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<CONTAINER>.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Depolama hesabı başına SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type.<ACCOUNT>.dfs.core.windows.net", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.<ACCOUNT>.dfs.core.windows.net.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Tüm depolama hesaplarının SAS yapılandırması

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.sas", "<SAS KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark

sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ConfBasedSASProvider")
spark.conf.set("spark.storage.synapse.sas", "<SAS KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Belirteçleri almak için MSAL kullanma (özel uygulama kimlik bilgilerini kullanarak)

ABFS depolama sürücüsü kimlik doğrulamaları için MSAL'yi doğrudan kullanacak şekilde yapılandırıldığında , sağlayıcı belirteçleri önbelleğe almaz. Bu, güvenilirlik sorunlarına neden olabilir. Synapse Spark'ın bir parçası olarak kullanılmasını ClientCredsTokenProvider öneririz.

%%spark
val source_full_storage_account_name = "teststorage.dfs.core.windows.net"
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.$source_full_storage_account_name", "<Entra AppId>")
spark.conf.set("fs.azure.account.oauth2.client.secret.$source_full_storage_account_name", "<Entra app secret>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint.$source_full_storage_account_name", "https://login.microsoftonline.com/<tenantid>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
source_full_storage_account_name = "teststorage.dfs.core.windows.net"
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.ClientCredsTokenProvider")
spark.conf.set(f"fs.azure.account.oauth2.client.id.{source_full_storage_account_name}.linkedServiceName", "<Entra AppId>")
spark.conf.set(f"fs.azure.account.oauth2.client.secret.{source_full_storage_account_name}.linkedServiceName", "<Entra app secret>")
spark.conf.set(f"fs.azure.account.oauth2.client.endpoint.{source_full_storage_account_name}.linkedServiceName", "https://login.microsoftonline.com/<tenantid>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')
display(df.limit(10))

SAS belirteci ile ADLS 2. Nesil depolama (Azure Key Vault'tan)

Azure Key Vault gizli dizisinde depolanan bir SAS belirtecini kullanarak ADLS 2. Nesil depolamaya bağlanın.

%%spark
sc.hadoopConfiguration.set("fs.azure.account.auth.type", "SAS")
sc.hadoopConfiguration.set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.AkvBasedSASProvider")
spark.conf.set("spark.storage.synapse.akv", "<AZURE KEY VAULT NAME>")
spark.conf.set("spark.storage.akv.secret", "<SECRET KEY>")

val df = spark.read.csv("abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>")

display(df.limit(10))
%%pyspark
sc._jsc.hadoopConfiguration().set("fs.azure.account.auth.type", "SAS")
sc._jsc.hadoopConfiguration().set("fs.azure.sas.token.provider.type", "com.microsoft.azure.synapse.tokenlibrary.AkvBasedSASProvider")
spark.conf.set("spark.storage.synapse.akv", "<AZURE KEY VAULT NAME>")
spark.conf.set("spark.storage.akv.secret", "<SECRET KEY>")

df = spark.read.csv('abfss://<CONTAINER>@<ACCOUNT>.dfs.core.windows.net/<FILE PATH>')

display(df.limit(10))

Diğer bağlı hizmetler için TokenLibrary

Diğer bağlı hizmetlere bağlanmak için TokenLibrary'ye doğrudan çağrı yapabilirsiniz.

getConnectionString()

bağlantı dizesi almak için işlevini kullanın getConnectionString ve bağlı hizmet adını geçirin.

%%spark
// retrieve connectionstring from mssparkutils

mssparkutils.credentials.getFullConnectionString("<LINKED SERVICE NAME>")
%%pyspark
# retrieve connectionstring from mssparkutils

mssparkutils.credentials.getFullConnectionString("<LINKED SERVICE NAME>")
%%csharp
// retrieve connectionstring from TokenLibrary

using Microsoft.Spark.Extensions.Azure.Synapse.Analytics.Utils;

string connectionString = TokenLibrary.GetConnectionString(<LINKED SERVICE NAME>);
Console.WriteLine(connectionString);

getPropertiesAll()

getPropertiesAll, bağlı bir hizmetin tüm özelliklerini almak için Scala ve Python'da kullanılabilen bir yardımcı işlevdir

%%pyspark
import json
# retrieve connectionstring from mssparkutils

json.loads(mssparkutils.credentials.getPropertiesAll("<LINKED SERVICE NAME>"))

Çıkış şuna benzer olacaktır:

{
    'AuthType': 'Key',
    'AuthKey': '[REDACTED]',
    'Id': None,
    'Type': 'AzureBlobStorage',
    'Endpoint': 'https://storageaccount.blob.core.windows.net/',
    'Database': None
}

GetSecret()

Azure Key Vault'tan depolanan bir gizli diziyi almak için Synapse çalışma alanında Azure Key Vault'a bağlı bir hizmet oluşturmanızı öneririz. Synapse çalışma alanı yönetilen hizmet kimliğine Azure Key Vault için GET Gizli Dizileri izni verilmesi gerekir. Bağlı hizmet, gizli diziyi almak üzere Azure Key Vault hizmetine bağlanmak için yönetilen hizmet kimliğini kullanır. Aksi takdirde, doğrudan Azure Key Vault'a bağlanmak kullanıcının Microsoft Entra kimlik bilgilerini kullanır. Bu durumda kullanıcıya Azure Key Vault'ta Gizli Dizi Al izinlerinin verilmesi gerekir.

Kamu bulutlarında keyvault'un tam etki alanı adını sağlayın.

mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>" [, <LINKED SERVICE NAME>])

Azure Key Vault'tan gizli dizi almak için işlevini kullanın mssparkutils.credentials.getSecret() .


mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>")

mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>")
using Microsoft.Spark.Extensions.Azure.Synapse.Analytics.Utils;

string connectionString = TokenLibrary.GetSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>", "<LINKED SERVICE NAME>");
Console.WriteLine(connectionString);

Spark çalışma zamanından desteklenen bağlı hizmet bağlantıları

Azure Synapse Analytics çeşitli bağlı hizmet bağlantılarını (işlem hatlarından ve diğer Azure ürünlerinden) desteklese de bunların tümü Spark çalışma zamanında desteklenmez. Desteklenen bağlı hizmetlerin listesi aşağıdadır:

  • Azure Blob Storage
  • Azure Yapay Zeka Hizmetleri
  • Azure Cosmos DB
  • Azure Data Explorer
  • MySQL için Azure Veritabanı
  • PostgreSQL için Azure Veritabanı
  • Azure Data Lake Store (1. Nesil)
  • Azure Key Vault
  • Azure Machine Learning
  • Azure Purview
  • Azure SQL Veritabanı
  • Azure SQL Veri Ambarı (Ayrılmış ve Sunucusuz)
  • Azure Depolama

mssparkutils.credentials.getToken()

Hizmetlere doğrudan erişmek için OAuth taşıyıcı belirtecine getToken ihtiyacınız olduğunda yöntemini kullanabilirsiniz. Aşağıdaki kaynaklar desteklenir:

Hizmet Adı API çağrısında kullanılacak dize değişmez değeri
Azure Storage Storage
Azure Key Vault Vault
Azure Management AzureManagement
Azure SQL Data Warehouse (Dedicated and Serverless) DW
Azure Synapse Synapse
Azure Data Lake Store DataLakeStore
Azure Data Factory ADF
Azure Data Explorer AzureDataExplorer
Azure Database for MySQL AzureOSSDB
Azure Database for MariaDB AzureOSSDB
Azure Database for PostgreSQL AzureOSSDB

Spark çalışma zamanından desteklenmeyen bağlı hizmet erişimi

Aşağıdaki bağlı hizmetlere erişme yöntemleri Spark çalışma zamanında desteklenmez:

  • Bağımsız değişkenleri parametreli bağlı hizmete geçirme
  • Kullanıcı tarafından atanan yönetilen kimliklerle bağlantılar (UAMI)
  • Not Defteriniz / SparkJobDefinition yönetilen kimlik olarak çalıştığında keyvault kaynağına taşıyıcı belirteci alma
    • Alternatif olarak, erişim belirteci almak yerine Keyvault'a bağlı bir hizmet oluşturabilir ve gizli diziyi Not Defterinizden / toplu iş işinizden alabilirsiniz
  • Azure Cosmos DB bağlantıları için tek başına anahtar tabanlı erişim desteklenir. Belirteç tabanlı erişim desteklenmez.

Not defteri veya Spark işi çalıştırılırken, bağlı hizmet kullanarak belirteç/gizli dizi alma istekleri 'BadRequest' hata iletisiyle başarısız olabilir. Bunun nedeni genellikle bağlı hizmetle ilgili bir yapılandırma sorunudur. Bu hata iletisini görürseniz lütfen bağlı hizmetinizin yapılandırmasını denetleyin. Sorularınız varsa Azure portalından Microsoft Azure Desteği'ne başvurun.