Получение секрета от azure keyvault с помощью узла из linux vm с MSI - PullRequest
1 голос
/ 08 апреля 2019

У меня возникают проблемы при получении секрета от azure keyvault с помощью пакета azure-keyvault из приложения узла, работающего на linux vm на azure.

Я использую следующий код:

import * as KeyVault from 'azure-keyvault';
import * as msRestAzure from 'ms-rest-azure'

function getKeyVaultCredentials(){
    return msRestAzure.loginWithVmMSI();
}

function getKeyVaultSecret(credentials) {
    let keyVaultClient = new KeyVault.KeyVaultClient(credentials,null);
    return keyVaultClient.getSecret("my keyvault url here", 'my keyvault secret name here', "", null,null);
}

getKeyVaultCredentials().then(
    getKeyVaultSecret
).then(function (secret){
    //not getting here....
}).catch(function (err) {
    //...error handling...
});

Я получаю ответ 401 при вызове getSecret.На keyvault и MSI установлены права доступа к машине.В сообщении об ошибке, похоже, нет заголовка аутентификации или токена, хотя в ответе я вижу заголовок, который выглядит как заголовок аутентификации.

Есть ли что-то, чего мне не хватает в моемреализация?

РЕДАКТИРОВАТЬ: Похоже, что пример, которым я поделился здесь, сработал бы, если бы я использовал

msRestAzure.loginWithVmMSI({resource: 'https://vault.azure.net' });

вместо вызова без параметров.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

В вашем keyvault убедитесь, что вы добавили субъект службы (созданный автоматически при включении MSI) в Access policies с правильным секретным разрешением.Затем попробуйте нажать Click to show advanced access policies -> выбрать параметр Enable access to Azure Virtual Machines for deployment -> Сохранить.

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

var http = require('http');
const KeyVault = require('azure-keyvault');
const msRestAzure = require('ms-rest-azure');


var server = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
});

// The ms-rest-azure library allows us to login with MSI by providing the resource name. In this case the resource is Key Vault.
// For public regions the resource name is Key Vault
msRestAzure.loginWithAppServiceMSI({resource: 'https://vault.azure.net'}).then( (credentials) => {
    const keyVaultClient = new KeyVault.KeyVaultClient(credentials);

    var vaultUri = "https://" + "<YourVaultName>" + ".vault.azure.net/";

    // We're setting the Secret value here and retrieving the secret value
    keyVaultClient.setSecret(vaultUri, 'my-secret', 'test-secret-value', {})
        .then( (kvSecretBundle, httpReq, httpResponse) => {
            console.log("Secret id: '" + kvSecretBundle.id + "'.");
            return keyVaultClient.getSecret(kvSecretBundle.id, {});
        })
        .then( (bundle) => {
            console.log("Successfully retrieved 'test-secret'");
            console.log(bundle);
        })
        .catch( (err) => {
            console.log(err);
        });

    // Below code demonstrates how to retrieve a secret value

    // keyVaultClient.getSecret(vaultUri, "AppSecret", "").then(function(response){
    //     console.log(response);    
    // })
});

Для получения дополнительной информации вы можете обратиться к: Установить и получить секрет из хранилища ключей Azure с помощью Node Web App .

0 голосов
/ 25 июля 2019

Вы можете использовать read-azure-secrets , который будет извлекать все секреты из хранилища ключей Azure.

Например

let secretClient = require('read-azure-secrets');

async function loadKeyVaultValues() {

    let applicationID = '';
    let applicationSecret = '';
    let vaultURL = 'https://<your-key-vault-name>.vault.azure.net/';
    let secrets = await secretClient.getSecrets(applicationID, applicationSecret, vaultURL);

    secrets.forEach(secret => {
        console.log(secret);
    });

}

loadKeyVaultValues();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...