web-dev-qa-db-ja.com

Node.js https.getまたはhttps.requestでのKerberos認証

内部ネットワーク上のツールからデータを要求する簡単なスクリプトを記述しようとしています。これがコードです:

#!/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);
});

質問は、資格情報をプレーンテキストでauth:に提供するのではなく、Kerberosチケットを使用して認証するにはどうすればよいですか?

15
mart1n

Paul Scheltemaの答えでは、オペレーティングシステムの深さからticketdataを取得する必要があります。ユーザー(またはユーザーに代わるモジュール)は、GSS-APIを使用して、Active Directoryによってチケットデータを生成させる必要があります。

このようなメカニズムはChromeに存在しますが、Node.js(ChromeのJavaScriptエンジンのみ)には含まれていないようです。そのため、たとえば次のようにモジュールを追加する必要があります。

このようなモジュールをインストール/コンパイルするには、Visual Studioが必要になる場合があります。


環境をセットアップするには、-すべてのコンピューターで、ポート88(Kerberos)および53(dns)でtcpおよびudpを有効にする必要があります。 -Windows Serverでは、Active Directoryが実行されている必要があります(ldap、dns、kdc)-ページでは https://www.npmjs.org/package/passport-kerberos 彼らはREALMという用語を使用しています。ドメインの名前で、大文字で書かれています

3
greenmarker

から http://docs.Oracle.com/cd/E24191_01/common/tutorials/authn_kerberos_service.html

メッセージレベルの標準のクライアントトークンの場所:Kerberosサービスチケットは、Authorization 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();

編集:

「」部分は、チケットを使用する場所の例であり、マルチタイプの本文に入れて送信します。または、WWW-Authenticateヘッダーを使用して送信します

例えば。 https.requestのオプションに追加します

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

グーグルはそれがどのように機能するかについていくつかの素晴らしい図を持っています: https://developers.google.com/search-appliance/kb/secure/kerberos-diagram

6
Paul Scheltema

「kerberos」モジュール、バージョン0.0.12を使用してこれを動作させることができました。私は実用的な例で要旨を作成しました:

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

基本的に、「Authorization」ヘッダーデータを取得するには3つの方法を使用します。

  • authGSSClientInit。サービス名が必要です。 [email protected]
  • authGSSClientStep、これは資格情報キャッシュの存在を必要とし(Linuxでは「kinit」を実行してこれを取得し、「klist」で確認できます)、実際に必要なbase64ものを返します(先頭の「Negotiate」文字列なし)。
  • authGSSClientClean、割り当てられたすべてのメモリ構造を解放します

次に、 "Authorization"ヘッダー(上記のWWW-Authenticateではなく、サーバーが送信するもの)を作成し、機能するはずです。

注:通常、ウェブブラウザはリソースをリクエストし、レスポンスでWWW-Authenticate:Negotiateヘッダーで401を取得してから、「Authorization」ヘッダーで提供されたチケットデータでリソースを再リクエストします。この2ステップのダンスは、すべてのリソースで発生します。それが何か意味があるのか​​どうかわかりません。

4
dmansfield

Windowsを使用している場合は、SSPIインターフェースを使用できます。プロジェクトnode-expose-sspiでNodeに公開されています。

SSPIインターフェイスを使用すると、SSO(NTLMおよびKerberos)を使用して任意のクライアントまたはサーバーを作成できます。

https://github.com/jlguenego/node-expose-sspi

注:私はnode-expose-sspiの作成者です。

0
jlguenego