Проверка подлинности Kerberos в Node.js https.get или https.request

Я пытаюсь написать простой script, который запрашивает некоторые данные из инструмента во внутренней сети. Вот код:

#!/usr/bin/node

var https = require('https');
var fs = require('fs');

var options = {
  host: '<link>',
  port: 443,
  path: '<path>',
  auth: 'username:password',
  ca: [fs.readFileSync('../.cert/newca.crt')]
};

https.get(options, function(res) {
  console.log("Got response: " + res.statusCode);
  res.on('data', function (d) {
    console.log('BODY: ' + d);
  });
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

Теперь вопрос в том, как я могу использовать билет Kerberos для аутентификации вместо того, чтобы предоставлять мои учетные данные в auth: в виде обычного текста?

Ответы

Ответ 1

В ответе Пол Шехтема вам нужно получить билетные данные с глубины операционной системы. Вы (или модуль от вашего имени) должны использовать GSS-API для получения билета, созданного Active Directory для вас.

Такой механизм присутствует в Chrome, но кажется, что он не включен в Node.js(только механизм javascript из Chrome), поэтому вам может понадобиться добавить модуль, например:

Чтобы установить/скомпилировать такой модуль, возможно, потребуется Visual Studio.


Чтобы настроить среду, - На всех компьютерах вы должны иметь tcp и udp для портов 88 (Kerberos) и 53 (dns). - В Windows Server должен быть запущен Active Directory (ldap, dns, kdc) - На странице https://www.npmjs.org/package/passport-kerberos они используют термин REALM. Это имя домена, написанное заглавное.

Ответ 2

из http://docs.oracle.com/cd/E24191_01/common/tutorials/authn_kerberos_service.html

Расположение токена клиента для стандартов уровня сообщений: Kerberos Сервисный билет может быть отправлен в HTTP-заголовке авторизации или внутри самого сообщения, например, внутри элемент. В качестве альтернативы он может содержаться в сообщении атрибут. Выберите один из следующих вариантов:

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

в качестве альтернативы вы можете, как указано ниже, указать, что информация помещена в тело сообщения или в качестве атрибута сообщения

var request = https.request(options, function(resource) {
  var chunks = [];
   resource.on('data', function (chunk) {
     chunks.push(chunk);
   });
   resource.on('end', function () {
     var data = chunks.join('');
     console.log(data);
   });
}

request.on('error',...)
request.send('<body-with-ticket>');
request.end();

EDIT:

"часть" была моим примером того, где использовать билет, поместить его в тело multtytype и отправить его, или же использовать заголовок WWW-Authenticate для его отправки

например. добавьте его в параметры https.request

options = {
    host: 'hostname',
    port: 443, 
    'WWW-Authenticate': 'Negotiate ' + ticketdata
};

В Google есть несколько полезных диаграмм о том, как это работает: https://developers.google.com/search-appliance/kb/secure/kerberos-diagram

Ответ 3

Я получил эту работу, используя модуль "kerberos", версия 0.0.12. Я создал Gist с рабочим примером:

https://gist.github.com/dmansfield/c75817dcacc2393da0a7

В принципе, вы используете три метода для получения данных заголовка "Авторизация" :

  • authGSSClientInit, для которого требуется имя службы, например. [email protected]
  • authGSSClientStep, который требует наличия кеша учетных данных (в Linux вы получаете это, выполняя "kinit" и можете проверить его с помощью "klist" ), и на самом деле возвращает вам нужный материал base64 (без ведущего "Negotiate" "строка)
  • authGSSClientClean, который освобождает все выделенные структуры памяти

Затем вы создаете заголовок "Авторизация" (NOT WWW-Authenticate, как показано выше, это то, что сервер отправляет обратно), и он должен работать.

Примечание: обычно веб-браузеры запрашивают ресурс, возвращают обратно 401 с заголовком WWW-Authenticate: Negotiate в ответ, а затем повторно запрашивают ресурс с данными о билетах, указанными в заголовке "Авторизация" . Этот двухэтапный танец происходит для каждого ресурса. Я не уверен, что это означает что-то или нет.