подключиться к серверу Sql с помощью Active Directory из nodejs на Linux-машине

У меня есть служба nodejs, которая работает на машине с Linux. Мне нужно подключиться к серверу Sql (Mssql).

Я использую пакет mssql и не вижу никакой поддержки в подключении к AD.

Существует также Azure Keyvault, к которому мы можем подключиться с помощью MSI, подключенного к машине, вызвав:

import * as msRestAzure from 'ms-rest-azure'
msRestAzure.loginWithVmMSI({ resource: this.azureKeyVaultResourceName })

Есть ли способ использовать учетные данные, которые я получаю от loginWithVmMSI, и подключаться к серверу Sql? Есть ли способ вызвать Sql Server напрямую через AD?

Есть ли его поддержка в другом драйвере? утомительно или nodemssql?


person Mithir    schedule 06.05.2019    source источник
comment
Вы можете вызвать обычную хранимую процедуру с помощью node-mssql, тогда это процедура, которая выполняет работу по подключению к AD. Но я предполагаю, что вы имеете в виду фактическую аутентификацию с учетными данными AD для mssql, а не просто доступ к AD через node-mssql. Последнее возможно через связанный сервер с AD.   -  person smoore4    schedule 13.05.2019
comment
@smoore4 smoore4 - не могли бы вы рассказать, как здесь поможет Linked Server to AD? тоже похоже на проблему с безопасностью...   -  person Mithir    schedule 14.05.2019


Ответы (1)


Если вы можете использовать Tedious (поддерживает Azure AD начиная с [email protected]).

Существует опция верхнего уровня authentication, которая позволяет указать используемый метод аутентификации:

new Connection({
  'config': {
    'server': '<server>',
    'authentication': {
      'type': 'azure-active-directory-password',
      'options': {
        'userName': '<userName>',
        'password': '<password>'
      }
    },
    'options': {
      'encrypt': true
    }
  }
})

Что касается встроенной части безопасности (поддержка аутентификации MSI), в настоящее время (19.5.2019) существует запрос на извлечение ожидается на github. Если он будет одобрен/принят, вы получите поддержку — вы также можете добавить ее вручную.

Конфигурация будет выглядеть так

Простая конфигурация подключения:

var connectionADMSI = {
    server: [Server Name], 
    options: {
        database:[Database Name],
        encrypt: true
    },
    authentication: {
        type: "azure-active-directory-MSI",
        // Option client id, if provided, then the token will be only valid for that user
        options: {
        clientID: [Client ID For User Assigned Identity]
        }
    }
};

Если вы используете msnodesqlv8, вам не повезло. Это решение только для Windows и еще не поддерживается в Linux. Для информационных целей я в том числе, как подключиться к нему:

// Init connection string
var dbConfig = {    
    driver: 'msnodesqlv8',
    connectionString:'Driver={SQL Server Native Client 11.0};Server={localhost\\SQLNode};Database={nodedb};Trusted_Connection={yes};'
};
person tukan    schedule 15.05.2019
comment
Кроме того... похоже на проблему, так как нам все еще нужно где-то хранить пароль... нет? - person Mithir; 16.05.2019
comment
@Mithir в 'options' вы храните пароль. - person tukan; 16.05.2019
comment
@Mithir Я думаю, ты не понял разницы в драйверах. Драйвер Windows поддерживает SSO через доверенное соединение. В Linux у вас другой подход, вы должны идентифицировать себя с AD. В этом случае система единого входа недоступна, и для идентификации пользователя необходимо указать id/passwd. - person tukan; 18.05.2019
comment
Я понимаю... но я могу аутентифицировать конкретную машину с Linux, используя MSI (без имени пользователя и пароля) при подключении к Azure KeyVault. Вариант, который вы предлагаете, требует сохранения пароля где-то... также это означает, что другие пользователи и машины смогут использовать этот идентификатор AD... так что ваш ответ хорош для подключения к AD, но он не дает нам полностью безопасный способ сделать это. - person Mithir; 19.05.2019
comment
@Mithir Я вижу, у Тедиуса есть ожидающий патч для этого. Я обновлю ответ. Но да, пока патч не будет принят, вы можете либо исправить его вручную, либо подождать, пока он не будет принят. - person tukan; 19.05.2019
comment
как я могу сам проверить наличие обновлений об этом патче? Как его можно было пропатчить вручную? - person Mithir; 19.05.2019
comment
@Mithir, вы просто проверяете состояние патча (по ссылке), когда он объединен, а выпуск выходит после даты слияния патча. Я никоим образом не являюсь экспертом по созданию приложений javascript, но я бы сделал это так же, как npm делает это с помощью git checkout (исправленной версии) и удовлетворяет зависимости. Их можно найти по адресу: npmjs.com/package/tedious?activeTab=dependencies - person tukan; 19.05.2019
comment
Я не уверен насчет ссылки, которой вы поделились в своем комментарии, но я нашел этот github.com /tediousjs/tedious/pull/896 — это реализация входа в систему с помощью MSI, ожидающая одобрения — это выглядит именно то, что я ищу! Кроме того, кажется, что я уже могу сделать это сейчас, выполнив 2 шага: получить токен доступа с помощью MSI и затем подключиться с токеном... не знаю, почему я не видел этого ни в одной документации... - person Mithir; 19.05.2019
comment
@Mithir, это именно ссылка в моем ответе (не комментарий!), Вы действительно читали это?! Документация не существует, так как этот код не был объединен и протестирован. Документация создается позже. - person tukan; 19.05.2019
comment
@Mihir, спасибо, я обычно добавляю слово EDIT, но, поскольку я отвечал по мобильному телефону, это боль. - person tukan; 19.05.2019