私は 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 つの関数を実装する必要があります。
誰でもこれに対するより良い解決策を知っていますか? ありがとう。