3

私は Java ユーザーです。Hadoop mapReduce にジョブを送信するとき、Hadoop の認証に Kerberos を使用します。成功すると、kerberos チケットの代わりに、Hadoop へのジョブ送信と共に作成され、渡される委任トークンがあります (前述のセキュリティ上の理由から)。 Hadoop による)。現在、ジョブは自分として実行されていますが、ジョブ自体は Kerberos を使用して、Hadoop 外部の他のサービスに要求を送信する必要があります。現在、Hadoop に kerberos TGT がなく、サービス チケットを取得できません。

とにかく、ジョブで Kerberos チケットを渡すことができますか? (シークレットを渡したくないので危険かもしれません)、JobConf は文字列と文字列のペアを Hadoop に渡すことができますが、TGT を json 文字列に変換し、ジョブの実行中に元に戻す必要がありますか?

もしくは委任トークン改革TGTを利用することは可能ですか?

私はそれをグーグルで検索しようとしましたが、あまり情報がありませんでした。ありがとうございました。

**編集済み: * *

TGT を Hadoop に渡さずにこれを行う簡単な方法はないようです。そのため、ジョブ構成マップを介して TGT を文字列として Hadoop (文字列のみ) に渡し、文字列を TGT オブジェクトに変換する次の方法を試します。ジョブが Hadoop で実行されるとき。問題は、ネットワーク経由で資格情報を渡すことです。これはベスト プラクティスではなく、Hadoop がセキュリティのために Kerberos を渡さなかったまさにその理由の 1 つです。サービス チケットを取得するために Hadoop に渡された改良された TGT を再利用できる場合は、セキュリティ上の問題を回避するために、TGT 文字列を可能な限り暗号化しようとします。

したがって、ローカル マシンでジョブを開始する前のコードは次のようになります。

import sun.security.krb5.Credentials;  

Credentials tgt = Credentials.acquireTGTFromCache(null, null); // Make sure kinit is done before this

String tgtStr = tgt.convertToJsonString(); //Need to implement this

Job job = new Job("Test");
JobConf jobConf = job.getJobConf();
jobConf.set("tgtStr", tgtStr);
job.addTask(Test.class, "run", null);
job.submit();
job.waitForCompletion(true);

次に、Hadoop が実行するジョブの関数は次のようになります。

Configuration conf = TaskContext.get().getConfiguration();
String tgtStr = conf.get("tgtStr");
Credentials tgt = reformTGTFromString(tgtStr);//Need to implement this
Credentials serviceTicket = Credentials.acquireServiceCreds(servicePrincipal, tgt); //This is to get any service ticket

そのため、TGT オブジェクト (Credentials.class) を文字列にストリーミングしてからオブジェクトに戻す 2 つの関数を実装する必要があります。

誰でもこれに対するより良い解決策を知っていますか? ありがとう。

4

3 に答える 3

2

Credentialsフィールドを分解し、Base64エンコーダーを使用して文字列に変換し、JSON文字列を形成し、RVMによって提案された構成マップまたは分散キャッシュを使用してHadoopに渡し、Hadoopで実行されているジョブでCredentialsオブジェクトを再編成することで元に戻すことができますKerberos TGTを使用して、サービスチケットを正常に取得します。したがって、この方法は機能します。ここで非常に注意する必要があるのは、ネットワークを介して渡されるキーの暗号化だけです。

于 2012-07-27T13:16:00.367 に答える
2

まだ行っていない場合は、http://carfield.com.hk:8080/document/distributed/ hadoop-security-design.pdfで設計を参照してください。

もしくは委任トークン改革TGTを利用することは可能ですか?いいえ、委任トークンは Hadoop ネーム ノードによって発行されます。これは Kerberos 認証に基づいていますが、独立しており、そこから Kerberos TGT を派生させることはできません。

元の設計では、Kerberos のみを (追加のトークンを使用せずに) 使用することを検討していました。これにより、計画は簡単になりましたが、次の理由で使用しないことにしました。

パフォーマンス:

  • 何千もの M/R タスクが同時に Kerberos チケットを取得する必要がある場合があります
  • 有効期限が切れる前に Kerberos 資格情報を更新する必要があります スケジュールされたジョブの場合、これが問題になります
  • 委任トークンは Kerberos に依存せず、エッジで使用される非 Kerberos 認証メカニズム (SSL など) と組み合わせることができます。

あなたの場合、プライベート分散キャッシュを使用して、転送可能な TGT を送信できます。これで大丈夫だと思いますが、もう少し検討する必要があります。明らかに、実装が安全であること、チケットの有効期間が最小限であること、可能であれば IP チャネル バインディングが使用されること、およびチケットの使用を承認されたプロセスのみに制限することを確認する必要があります。

于 2012-07-26T01:39:34.500 に答える
1

まず、アカウントで委任を有効にする必要があります。サービス チケットは、転送可能なチケットを要求する必要があります。それがすべて当てはまる場合、Hadoop は委任された資格情報を から取得し、ユーザーGSSContextに代わって新しい資格情報を作成する必要があります。その新しい TGT を使用すると、さらに多くの手順を実行できます。Wireshark を使用して、hadoop のチケットを確認します。

于 2012-07-25T19:31:02.353 に答える