Проверка подлинности 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 в ответ, а затем повторно запрашивают ресурс с данными о билетах, указанными в заголовке "Авторизация" . Этот двухэтапный танец происходит для каждого ресурса. Я не уверен, что это означает что-то или нет.