Как использовать секретные ключи в конвейерах службы машинного обучения Azure
Я использую службы машинного обучения Azure и функции конвейера для подготовки данных, обучения и тестирования моих моделей машинного обучения. Однако на этапе подготовки данных мне необходимо подключиться к базе данных, и я хочу найти способ передачи своих секретных паролей или ключей без записи их в виде простого текста в моих файлах сценариев.
Локально я использую переменные среды для использования секретных паролей и ключей, но, насколько мне известно, это невозможно в инфраструктуре конвейера, поскольку Conda не поддерживает передачу переменных среды. Если кто-то может подтвердить или опровергнуть это, это будет полезно.
В службах машинного обучения Azure на портале Azure я обнаружил ресурс "хранилище ключей", который создается автоматически при создании ресурса "Рабочая область службы машинного обучения". Кажется, это именно то, что мне нужно. Это? И если да, то как мне его использовать?
Если ни одно из вышеперечисленных не решает мою проблему, есть ли другой способ безопасно использовать секретные пароли и ключи в моих сценариях, не записывая их в виде простого текста в сценариях?
РЕДАКТИРОВАТЬ: я понимаю, что мой вопрос сосредоточен на соединениях с базой данных. Однако на самом деле речь идет о любых видах секретов или паролей, а не только об учетных данных базы данных. Как было указано в ответе, здесь стоит упомянуть, что соединения с базой данных SQL Azure могут (и должны) решаться с помощью DataTransferStep.
1 ответ
Вместо того, чтобы использовать переменные среды, вы можете просто передать учетные данные через arguments
параметр:
pipeline_step = PythonScriptStep(
script_name='train.py',
arguments=['--keyvault_name', 'MyKV', '--secret_name', 'MyPW'], ...
И определить аргументы скрипта в train.py
следующее:
parser = argparse.ArgumentParser('train')
parser.add_argument('--keyvault_name')
parser.add_argument('--secret_name')
args = parser.parse_args()
Затем вы можете использовать переменные args.keyvault_name
а также args.secret_name
в вашем сценарии. Вы можете использовать эти значения для считывания пароля из хранилища ключей. Конечно, вы должны сначала создать хранилище ключей и сохранить там пароль. Кроме того, вы также должны убедиться, что AML Workspace имеет разрешение на чтение секретов из хранилища ключей.
Конечно, вы также можете передать пароль в аргументе script в виде обычного текста, но это не рекомендуется.
Какую базу данных вы используете? Если это Azure SQL, вы можете использовать DataTransferStep вместо передачи секретов. Соответствующие классы:
Passing secrets to remote runs is now supported, as of Azure ML SDK version 1.0.57, through azureml.core.keyvault.KeyVault object:
See Using Secrets in Remote Runs section in this notebook