Как использовать @ azure / identity с DefaultCredentials из 'az login' вместо учетной записи службы при локальной разработке?

Не уверен, возможно ли это уже каким-то образом, или есть другой ожидаемый и имеющий смысл «поток», который мне еще предстоит обнаружить.

Мы используем @ azure / keyvault-secrets + @ azure / identity для доступа и управления всеми нашими секретами / ключами в наших приложениях и средах разработки.

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

Однако локально, для целей разработки, не идеально получать секретные ключи / конфигурацию для приложения, над которым мы работаем, было бы идеально иметь возможность использовать учетные данные из azure cli для получения секретов на основе разработчик, работающий над приложением и тем, к чему у них есть доступ, чтобы мы могли применять mfa к их учетной записи и управлять доступом к ключам только для их учетной записи пользователя и т. д.

Поддерживает ли модуль @ azure / identity это поведение в настоящее время? если нет, существует ли рекомендуемое поведение для этого варианта использования, помимо простой настройки учетных записей служб для каждого приложения в среде разработки. среда?


person SebastianG    schedule 04.11.2019    source источник


Ответы (1)


Насколько я понимаю, вы хотите использовать Azure cli creds, чтобы получить секрет хранилища ключей Azure. Если это так, вы можете использовать sdk @azure/ms-rest-nodeauth. Подробнее см. https://github.com/Azure/azure-sdk-for-node/issues/2284. Подробные инструкции приведены ниже.

  1. Создать защиту с помощью кода VS
npm init -y
npm install @azure/ms-rest-nodeauth
npm install @azure/keyvault
  1. Вход в Azure с помощью Azure CLI
az login
  1. Код
var azure = require('@azure/ms-rest-nodeauth')
var keyvault = require('@azure/keyvault')

async function main() {
    const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })


        const client = new keyvault.KeyVaultClient(creds)
        const secret = await client.getSecret('https://testkey08.vault.azure.net', 'test', '517cc458b7464c379d1d3e85bd2a5c94')
         console.log(secret)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });

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


Обновлять

Согласно моему тесту, если вы используете sdk @azure/keyvault-secrets для получения секрета хранилища ключей, обратитесь к следующему коду:

var azure = require('@azure/ms-rest-nodeauth')
var keyvault = require('@azure/keyvault-secrets')

async function main() {
    const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })



        const client = new keyvault.SecretClient('https://<your key vault name>.vault.azure.net',creds)
        const secret = await client.getSecret('your secret name')
         console.log(secret)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });

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

Кроме того, согласно моим тестам и исследованиям, если мы используем sdk @azure/keyvault-secrets и @azure/keyvault-secrets, у нас не будет возможности использовать учетные данные из azure cli для получения секретов. Дополнительные сведения см. В документе  введите здесь описание изображения

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

  1. создать sp
az ad sp create-for-rbac -n <your-application-name> --skip-assignment
az keyvault set-policy --name <your-key-vault-name> --spn $AZURE_CLIENT_ID --secret-permissions backup delete get list purge recover restore set

  1. создать файл .env
AZURE_TENANT_ID=<tenant id>
AZURE_CLIENT_ID=<app id>
AZURE_CLIENT_SECRET=<password>
  1. код
var keyvault = require('@azure/keyvault-secrets')
var azure1 = require('@azure/identity')
const dotenv = require('dotenv');
dotenv.config();
async function main() {
    //const creds = await azure.AzureCliCredentials.create({ resource: "https://vault.azure.net" })


        // console.log("way1")
        // const client = new keyvault.SecretClient('https://testkey08.vault.azure.net',creds)
        // const secret = await client.getSecret('test')
        // //const secret = await client.getSecret('https://testkey08.vault.azure.net', 'test', '517cc458b7464c379d1d3e85bd2a5c94')
        //  console.log(secret)
         console.log("-----------------------")
         console.log("way2")
         const creds1 = new  azure1.DefaultAzureCredential()


          const client1 = new keyvault.SecretClient('https://testkey08.vault.azure.net',creds1)
          const secret1 = await client1.getSecret('test')
          console.log(secret1)
}

main()
  .then(() => {
    console.log("Successfully executed sample.");
  })
  .catch((err) => {
    console.log(err.message);
  });

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

person Jim Xu    schedule 05.11.2019
comment
@michaelB Есть ли у вас другие проблемы? Если у вас нет других проблем, не могли бы вы принять это? это может помочь большему количеству людей - person Jim Xu; 06.11.2019
comment
Привет, похоже, это работает для @ azure / keyvault, но я использовал его с @ azure / keyvault-secrets, и, похоже, он не принимает такие учетные данные. В настоящее время это ошибки с this.authenticationProvider.signRequest is not a function Я буду исследовать дальше - person SebastianG; 06.11.2019