Подключение фабрики данных Azure к хранилищу данных не работает при использовании хранилища ключей для извлечения токена

#azure #azure-data-factory #http-status-code-403 #azure-keyvault #azure-databricks

#azure #azure-data-factory #http-status-code-403 #azure-keyvault #azure-databricks

Вопрос:

У меня есть экземпляр Databricks, который выполняет некоторую работу. Задания запускаются с фабрики данных Azure. Существует несколько сред, и каждая из них имеет свое собственное хранилище ключей для хранения секретов.

Пока я сохранял токен доступа — скажем, «жестко закодированный» — в конфигурации службы, связанной с Databricks, все работало нормально. Но мне нужно соблюдать стандарты безопасности, поэтому хранить его в формате JSON, который где-то лежит, не вариант — на данный момент это было нормально.

Хранилище ключей для токена аварийного доступа к хранилищу данных создается через API и хранится в хранилище ключей, теперь я хотел использовать хранилище ключей как связанную службу в связанной службе Databricks для заполнения токена доступа, и вот сюрприз — он не работает.

Я не могу отладить конвейер, я не могу его запустить, я даже не могу протестировать соединение, оно всегда завершается ошибкой с 403 недопустимым токеном доступа:

введите описание изображения здесь

JSON для этой связанной службы:

 {
    "name": "ls_databricks",
    "type": "Microsoft.DataFactory/factories/linkedservices",
    "properties": {
        "annotations": [],
        "type": "AzureDatabricks",
        "typeProperties": {
            "domain": "https://**************.azuredatabricks.net",
            "accessToken": {
                "type": "AzureKeyVaultSecret",
                "store": {
                    "referenceName": "ls_keyVault",
                    "type": "LinkedServiceReference"
                },
                "secretName": "DatabricksAccessToken"
            },
            "existingClusterId": "*********"
        }
    }
}
  

В то время как с помощью Postman я могу легко получить доступ к API Databricks, используя тот же токен доступа:
введите описание изображения здесь


Сама служба, связанная с хранилищем ключей, работает нормально, и проверка соединения проходит: введите описание изображения здесь


Я настроил другую связанную службу для подключения к ADL с использованием хранилища ключей, и она работает, как ожидалось: введите описание изображения здесь

У кого-нибудь есть идеи, что здесь не так? Он просто сломан или я делаю что-то не так?

p.s. Извиняюсь за то, что залил вас всеми этими скриншотами 🙂

Я использую https://docs.databricks.com/dev-tools/api/latest/scim/scim-sp.html SCIM API для присвоения моему участнику службы соответствующей группы в экземпляре Databricks.

Ответ №1:

Настроили ли вы соответствующую политику доступа в хранилище ключей? Предпочтительной методологией было бы включить управляемую идентификацию для фабрики данных, а затем добавить идентификатор фабрики данных в политику доступа к хранилищу ключей

Хранилище ключей имеет отдельный уровень доступа к секретам, который необходимо настроить для фабрики данных, поскольку фабрика данных пытается получить к ней доступ, и ей необходимо предоставить доступ к секретам.

Комментарии:

1. Да, мой конвейер подготовки инфраструктуры настраивает политики доступа для ADF в хранилище ключей, как я упоминал в своем посте, сама служба, связанная с хранилищем ключей, работает, служба, связанная с ADLS, также работает, используя хранилище ключей для получения секрета, кстати. если политика доступа отсутствует, ошибка при тестировании соединения будет выглядеть примерно так: «Политика доступа ADF не найдена в хранилище ключей бла-бла-бла» вместо «403 Недопустимый токен доступа»

Ответ №2:

Наконец, я смог решить эту проблему с помощью расширений командной строки Databricks.

Рабочее решение (интересно, как долго, это экспериментальное расширение):

   az extension add --name datafactory
  
  $lsDatabricks = @{
      "type" = "AzureDatabricks"
      "typeProperties" = @{
          "domain" = "https://***********.azuredatabricks.net"
          "existingClusterId" = "************-vale**"
          "accessToken" = @{ 
              "type" = "SecureString"
              "value" = "dapi******************************"
          }
      }
  }

  $lsJson = $lsDatabricks | ConvertTo-Json -Compress 
  $lsJson = $lsJson -Replace '"', '"'

  az datafactory linked-service create --factory-name "yourAdf" --name "yourDatabricksLinkckedService" --resource-group "yourGroup" --properties "$lsJson"
  

Я прошел очень ухабистую дорогу только для настройки глупой связанной службы. Кстати, я пытался сделать это с помощью параметризованного шаблона, например:

 "AzureDatabricks": {
    "properties": {
        "typeProperties": {
            "domain": "=",
            "existingClusterId": "=",
            "accessToken": "=:accessToken:secureString"
        }
    }
  

К сожалению, какое бы значение я ни переопределял при развертывании шаблона ARM, конечное значение не изменилось.