Защита учетных данных с помощью связанных служб с помощью mssparkutils
Доступ к данным из внешних источников является распространенным шаблоном. Если внешний источник данных разрешает анонимный доступ, то, вероятно, потребуется защитить подключение с помощью учетных данных, секрета или строки подключения.
Azure Synapse Analytics использует сквозное руководство Microsoft Entra по умолчанию для проверки подлинности между ресурсами. Если необходимо подключиться к ресурсу с помощью других учетных данных, используйте mssparkutils напрямую. Пакет mssparkutils упрощает процесс получения маркеров SAS, маркеров Microsoft Entra, строка подключения и секретов, хранящихся в связанной службе или из Azure Key Vault.
Сквозное руководство Microsoft Entra использует разрешения, назначенные пользователю в идентификаторе Microsoft Entra, а не разрешения, назначенные Synapse или отдельному субъекту-службе. Например, если вы хотите использовать сквозное руководство Microsoft Entra для доступа к большому двоичному объекту в учетной записи хранения, перейдите к этой учетной записи хранения и назначите ему роль участник BLOB-объектов.
Для получения секретов из Azure Key Vault мы рекомендуем создать службу, связанную с Azure Key Vault. При этом нужно предоставить удостоверению управляемой службы рабочей области Synapse привилегии на получение секретов из такого хранилища Azure Key Vault. Чтобы аутентифицироваться в Azure Key Vault, Synapse будет использовать удостоверение управляемой службы рабочей области Synapse. Если вы подключаетесь непосредственно к Azure Key Vault без связанной службы, вы будете проходить проверку подлинности с помощью учетных данных Microsoft Entra пользователя.
Дополнительные сведения см. в статье о связанных службах.
Использование
Mssparkutils помогает для маркеров и секретов
Эта функция отображает справочную документацию по управлению секретами и токенами в Synapse.
mssparkutils.credentials.help()
mssparkutils.credentials.help()
Console.WriteLine(TokenLibrary.help());
Полученный результат:
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
Доступ к Azure Data Lake Storage 2-го поколения
Основное хранилище Azure Data Lake Storage 2-го поколения
Доступ к файлам из основного azure Data Lake служба хранилища использует сквозное руководство Microsoft Entra для проверки подлинности по умолчанию и не требует явного использования mssparkutils. Удостоверение, используемое в сквозной проверке подлинности, отличается на основе нескольких факторов. По умолчанию интерактивные записные книжки выполняются с помощью удостоверения пользователя, но его можно изменить на удостоверение управляемой службы рабочей области (MSI). Пакетные задания и неинтерактивные выполнения записной книжки используют MSI рабочей области.
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))
Хранилище ADLS 2-го поколения со связанными службами
Azure Synapse Analytics предоставляет интегрированные связанные службы при подключении к Azure Data Lake Storage 2-го поколения. Связанные службы можно настроить для проверки подлинности с помощью ключа учетной записи, субъекта-службы, управляемого удостоверения или учетных данных.
Если в качестве метода аутентификации для связанной службы выбран ключ учетной записи, связанная служба будет выполнять аутентификацию с использованием предоставленного ключа учетной записи хранения, запрашивать ключ SAS и автоматически применять его к запросу хранилища через поставщика LinkedServiceBasedSASProvider.
Synapse позволяет пользователям указывать связанную службу для определенной учетной записи хранения. Благодаря этому можно считывать и записывать данные в нескольких учетных записях хранения в одном приложении или запросе Spark. После установки параметра spark.storage.synapse.{полное_имя_исходной_учетной_записи}.linkedServiceName для каждой используемой учетной записи хранения Synapse определяет, какая связанная служба будет применяться для определенной операции чтения/записи. Однако если задание Spark работает только с одной учетной записью хранения, можно просто опустить имя учетной записи хранения и использовать spark.storage.synapse.linkedServiceName.
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()
Если в качестве метода аутентификации для связанной службы выбрано управляемое удостоверение или субъект-служба, связанная служба будет использовать управляемое удостоверение или маркер субъекта-службы с поставщиком LinkedServiceBasedTokenProvider.
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()
Хранилище ADLS 2-го поколения без связанных служб
Подключение в хранилище ADLS 2-го поколения непосредственно с помощью ключа SAS. ConfBasedSASProvider
Используйте и укажите ключ SAS для spark.storage.synapse.sas
параметра конфигурации. Маркеры SAS можно задать на уровне контейнера, уровне учетной записи или глобальном. Не рекомендуется устанавливать ключи SAS на глобальном уровне, так как задание не сможет читать и записывать данные из нескольких учетных записей хранения.
Конфигурация SAS для контейнера хранилища
%%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))
Конфигурация SAS для учетной записи хранения
%%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))
Конфигурация SAS всех учетных записей хранения
%%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))
Хранилище ADLS 2-го поколения с Azure Key Vault
Вы можете подключиться к хранилищу ADLS 2-го поколения с помощью маркера SAS, сохраненного в секрете Azure Key Vault.
%%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))
TokenLibrary для других связанных служб
Чтобы подключиться к другим связанным службам, можно выполнить прямой вызов TokenLibrary.
getConnectionString()
Чтобы получить строку подключения, используйте функцию getConnectionString и передайте имя связанной службы.
%%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 — это вспомогательные функции, доступные в Scala и Python, чтобы получить все свойства связанной службы.
%%pyspark
import json
# retrieve connectionstring from mssparkutils
json.loads(mssparkutils.credentials.getPropertiesAll("<LINKED SERVICE NAME>"))
Выходные данные будут выглядеть следующим образом.
{
'AuthType': 'Key',
'AuthKey': '[REDACTED]',
'Id': None,
'Type': 'AzureBlobStorage',
'Endpoint': 'https://storageaccount.blob.core.windows.net/',
'Database': None
}
GetSecret()
Для получения секрета, хранящегося в Azure Key Vault, мы рекомендуем создать связанную службу для Azure Key Vault в рабочей области Synapse. При этом удостоверению управляемой службы рабочей области Synapse потребуется предоставить права на получение секретов из Azure Key Vault. Связанная служба будет использовать удостоверение управляемой службы для подключения к службе Azure Key Vault, чтобы получить секрет. В противном случае подключение непосредственно к Azure Key Vault будет использовать учетные данные Microsoft Entra пользователя. В такой ситуации необходимо будет предоставить пользователю разрешения на получение секретов из Azure Key Vault.
В облаках государственных организаций укажите полное доменное имя ключа.
mssparkutils.credentials.getSecret("<AZURE KEY VAULT NAME>", "<SECRET KEY>" [, <LINKED SERVICE NAME>])
Чтобы получить секрет из Azure Key Vault, используйте функцию 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
Хотя Azure Synapse Analytics поддерживает различные подключения к связанной службе (из конвейеров и других продуктов Azure), не все из них поддерживаются из среды выполнения Spark. Ниже приведен список поддерживаемых связанных служб:
- Хранилище BLOB-объектов Azure
- Службы искусственного интеллекта Azure
- Azure Cosmos DB
- Azure Data Explorer
- База данных Azure для MySQL
- База данных Azure для PostgreSQL
- Azure Data Lake Store (1-го поколения)
- Azure Key Vault
- Машинное обучение Azure
- Azure Purview
- База данных SQL Azure
- Хранилище данных SQL Azure (выделенное и бессерверное)
- Хранилище Azure
mssparkutils.credentials.getToken()
Если вам нужен маркер носителя OAuth для доступа к службам напрямую, можно использовать getToken
этот метод. Поддерживаются следующие ресурсы:
Имя службы | Строковый литерал, используемый в вызове API |
---|---|
Хранилище Azure | Storage |
Azure Key Vault | Vault |
Управление и безопасность | AzureManagement |
Хранилище данных SQL Azure (выделенное и бессерверное) | DW |
Azure Synapse | Synapse |
Azure Data Lake Store | DataLakeStore |
Azure Data Factory | ADF |
Azure Data Explorer | AzureDataExplorer |
База данных Azure для MySQL | AzureOSSDB |
База данных Azure для MariaDB | AzureOSSDB |
База данных Azure для PostgreSQL | AzureOSSDB |
Неподдерживаемый доступ к связанной службе из среды выполнения Spark
Следующие методы доступа к связанным службам не поддерживаются из среды выполнения Spark:
- Передача аргументов параметризованной связанной службе
- Подключение ions с назначенными пользователем управляемыми удостоверениями (UAMI)
- Управляемые удостоверения, назначенные системой, не поддерживаются в ресурсе Keyvault
- Для подключений Azure Cosmos DB поддерживается только доступ на основе ключей. Доступ на основе маркеров не поддерживается.
При выполнении задания Записной книжки или Spark запросы на получение маркера или секрета с помощью связанной службы могут завершиться ошибкой с сообщением об ошибке, указывающее "BadRequest". Это часто вызвано проблемой конфигурации связанной службы. Если вы видите это сообщение об ошибке, проверка конфигурацию связанной службы. Если у вас возникли вопросы, обратитесь в службу поддержки Microsoft Azure в портал Azure.