Hadoopセキュリティ >

目次

セキュリティ仕様の概要

  • セキュリティ設計は、Hadoop Security Designeに詳しい。
  • HadoopWithSecurity により、クラスタのリソース(ストレージおよび計算)管理が堅牢となり、分散OSの構築が可能となります。

ノード間通信のセキュリティ

RPC

  1. クラスタの主要ノード(NameNodeDataNodeJobTrackerTaskTracker)間、およびクラスタ外のクライアントと主要ノード間のセキュアな通信確立には、まず SASL/GSSAPI(Kerberos) が使用されます。
  2. この通信確立後、後述の有効なToken(HDFS Delegation Token、Job Token)がシェアされて以降は、よりコストが少ない SASL/DIGEST-MD5 でセキュアなノード(プロセス)間通信が行われます。

Token

  • Hadoop with Security では、ジョブを発行したユーザの権限の範囲で分散処理が実行されることが担保されます。そのためにはユーザの認証および認可情報をクラスタの隅々(全ノードの全プロセス)までセキュアに伝播させる必要があり、その伝播を担うのが以下の Token です。
  • 分散ファイルシステム(HDFS)へのアクセス権限(委譲*1)を証明する資格証が HDFS Delegation Token であり、同一ジョブへの帰属を証明する資格証が Job Token です。他に、HDFS上の特定データブロックへのアクセス権限を証明する資格証である Block Access Token があります。Token の詳細は以下の通りです。
No.Token用途発行元検証秘密鍵保持更新者指定認証子生成
アルゴリズム
備考
1HDFS Delegation Tokenクライアント(JobTrackerやTaskプロセスを含む)とNameNodeとのセキュアなHDFS関連通信(RPC via SASL/DIGEST-MD5)確立のためNameNodeNameNodeNameNode*2HMAC-SHA1
2Block Access Tokenクライアント(同上)からのセキュアなHDFSブロックアクセスのためNameNodeDataNodeNameNode, DataNode, SecondaryNameNode, Balancer-HMAC-SHA1
3Job Token1. ジョブ実行のためセキュアな通信(RPC via SASL/DIGEST-MD5)確立のため
(主にTaskプロセス,TaskTracker間通信)
JobTracker-JobTracker--
2. シャッフルフェイズのセキュアな通信(HTTP with HMAC-SHA1)確立のため。

HTTP

  1. HTTP通信における認証と機密性確保については、TLS/Kerberos(Kerberized SSL、KSSL)(主にHDFSメタデータの同期、以後JDKのバグにより高強度暗号タイプに対応できないため非推奨)と SPNEGO/Kerberos(HDFSメタデータの同期にも採用、他にHttpFSWebHDFSとWeb Console等)が使用されます。
  2. 将来的には、SPNEGO/Kerberos に一本化の方針のようです。

認証

  1. ユーザの認証は、(正確にはKerberosのレルムの運用によりますが)概ねグローバルスコープで行われます。
  2. グループ解決には、UNIXグループが利用されますが、クラスタ全体をカバーするにはバックエンドにLDAPなどを用意する必要があるでしょう。

プロセスオーナとプリンシパル

  1. カスタマイズ可能ですが、インストールガイドや Virtual Machine Appliance の設定を参考に一貫性をもって展開すると推奨設定は以下のようです。
  2. プリンシパルは、ユーザ部が host/ のものが HTTP via TLS/Kerberos*3 で、HTTP/ のものが HTTP via SPNEGO/Kerberos でそれぞれ使用される以外は、通常のノード間通信である RPC via SASL/GSSAPI(Kerberos) で使用されます。
  3. プリンシパル名は、core-site.xml の hadoop.security.auth_to_local プロパティの設定により、OSユーザ名に変換されます。プリンシパルのユーザ(サービス)部に、nn、dn、jt、ttを用いる場合には(デフォルト変換時には)プロセスオーナと食い違いますのでこの設定プロパティで適切に調整する必要があります。
  4. username やKerberosプリンシパルのインスタンス、レルムなどは適宜、読み替えてください。
No.プロセスプロセスオーナKerberosプリンシパル備考
1NameNodehdfs:hadoop(hdfs|nn)/hostname@GRID.EXAMPLE.COM
host/hostname@GRID.EXAMPLE.COMHTTP via TLS/Kerberos用プリンシパル(SPNEGO/Kerberos追加後は非推奨、CDH4では削除済)
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(WebHDFS、Web Console)
2SecondaryNameNodehdfs:hadoop(hdfs|nn)/hostname@GRID.EXAMPLE.COM
host/hostname@GRID.EXAMPLE.COM同上
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(WebHDFS、Web Console)
3Balancer
4DataNoderoot -> hdfs:hadoop(hdfs|dn)/hostname@GRID.EXAMPLE.COMブロックアクセスのためのポートを特権ポート(1004)で提供するため、はじめにrootで起動されます。
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(WebHDFS、Web Console)
5ResourceManager?
(Hadoop 2.0)
yarn:{hadoop,yarn}(yarn|rm)/hostname@GRID.EXAMPLE.COM
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(Web Console)
6NodeManager?
(Hadoop 2.0)
yarn:{hadoop,yarn}(yarn|nm)/hostname@GRID.EXAMPLE.COM
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(Web Console)
7JobTrackermapred:{hadoop,mapred}(mapred|jt)/hostname@GRID.EXAMPLE.COM
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(Web Console)
8TaskTrackermapred:{hadoop,mapred*4}(mapred|tt)/hostname@GRID.EXAMPLE.COM
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル(WebHDFS、Web Console)
9Task (Map/Reduce)ジョブ発行ユーザ-Taskプロセスは、上記のTokenにより各ノードにアクセスします。
10Oozie (Servletコンテナ)コンテナユーザoozie@GRID.EXAMPLE.COMProxyUser用プリンシパル
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル
AuthenticationFilter?のカスタマイズが必要
11HDFSProxyHttpFS(旧Hoop)
(Servletコンテナ)
コンテナユーザ(hdfsproxy|httpfs|hoop)@GRID.EXAMPLE.COMProxyUser用プリンシパル
HTTP/hostname@GRID.EXAMPLE.COMHTTP via SPNEGO/Kerberos用プリンシパル
KerberosAuthorizationFilter?のサポートは、Ver. 0.21以降
11クライアントユーザ:{Oozie,Proxy}グループusername@GRID.EXAMPLE.COMOozie、HDFS Proxyを利用する場合には、それぞれの利用グループに属する必要があります。

ProxyUser (Secure Impersonation)

認可

  1. 権限認可は、(多くがクラスタの設定に依存しますので)基本的にクラスタスコープで行われます。
  2. HDFSのアクセスコントロールは、NameNode(パーミッション)が担います。
  3. ジョブ関連のアクセスコントロールは、各設定ファイルにより定義されます。

監査情報

  1. HDFSアクセス、ジョブ実行それぞれに、認証ログ(誰を認証したか)と監査ログ(誰が何をしたか)が記録されます。
  2. Oozieも同様のログを出力します。

機密性

  1. Hadoop with Security では、通信および保存されたデータの機密性は担保されていません。それは、現在のところデータの暗号化が分散処理のパフォーマンスと強いトレードオフの関係にあるからです。

Web UIのアクセス制御

  1. Ver. 0.19.0 からすでに hadoop-site.xml(0.20.0以降は core-site.xml)の hadoop.http.filter.initializers プロパティで認証のためのフィルタをプラグインできることが可能となっています。

セットアップの手順

Yahoo!Hadoop-0.20.S-VirtualMachineAppliance(vm-20100629) で検証

サンプルジョブ実行

  1. まず何もせずにジョブを実行してみると、TGT(Ticket Granting Ticket)が見つからず失敗します。
    $ bin/hadoop jar hadoop-examples-0.20.104.1.1006042001.jar pi 10 1000000
    Number of Maps  = 10
    Samples per Map = 1000000
    10/07/19 19:48:40 WARN ipc.Client: Exception encountered while connecting to the server : 
    javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided
     (Mechanism level: Failed to find any Kerberos tgt)]
    java.lang.RuntimeException: java.io.IOException: Call to localhost/127.0.0.1:8020 failed on local exception: 
    java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid 
    credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
           at org.apache.hadoop.mapred.JobConf.getWorkingDirectory(JobConf.java:548)
    ...
  2. kinit コマンドで、TGT をキャッシュします。
    $ kinit
    Password for hadoop-user@LOCALDOMAIN:
    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1000
    Default principal: hadoop-user@LOCALDOMAIN
    
    Valid starting     Expires            Service principal
    07/19/10 19:49:56  07/20/10 05:49:56  krbtgt/LOCALDOMAIN@LOCALDOMAIN
           renew until 07/20/10 19:49:44
    
    
    Kerberos 4 ticket cache: /tmp/tkt1000
    klist: You have no tickets cached
  3. 再びジョブを実行すると、今度は成功します。
    $ bin/hadoop jar hadoop-examples-0.20.104.1.1006042001.jar pi 10 1000000
    Number of Maps  = 10
    Samples per Map = 1000000
    Wrote input for Map #0
    Wrote input for Map #1
    Wrote input for Map #2
    ...
    Starting Job
    10/07/19 19:50:32 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 2 for hadoop-user
    10/07/19 19:50:32 INFO security.TokenCache: Got dt for hdfs://localhost/user/hadoop-user/.staging
    /job_201007191918_0002;uri=127.0.0.1:8020;t.service=127.0.0.1:8020
    ...
    Job Finished in 80.23 seconds
    Estimated value of Pi is 3.14158440000000000000
  4. チケットを破棄します。
    $ kdestroy
    $ klist
    klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_1000)
    
    
    Kerberos 4 ticket cache: /tmp/tkt1000
    klist: You have no tickets cached

新しいユーザの追加とジョブ実行

  1. Kerberosプリンシパルの追加
    # adduser alice
    ...
    # kadmin.local
    Authenticating as principal root/admin@LOCALDOMAIN with password.
    kadmin.local:  add_principal alice
    WARNING: no policy specified for alice@LOCALDOMAIN; defaulting to no policy
    Enter password for principal "alice@LOCALDOMAIN":
    Re-enter password for principal "alice@LOCALDOMAIN":
    Principal "alice@LOCALDOMAIN" created.
    kadmin.local:  quit
  2. TGT のキャッシュとジョブの実行
    $ kinit
    Password for alice@LOCALDOMAIN:
    $ klist
    Ticket cache: FILE:/tmp/krb5cc_1005
    Default principal: alice@LOCALDOMAIN
    
    Valid starting     Expires            Service principal
    08/01/10 20:10:26  08/02/10 06:10:26  krbtgt/LOCALDOMAIN@LOCALDOMAIN
            renew until 08/02/10 20:10:20
    
    
    Kerberos 4 ticket cache: /tmp/tkt1005
    klist: You have no tickets cached
    $ bin/hadoop jar hadoop-examples-0.20.104.1.1006042001.jar pi 10 1000000
    ...

認証ログ、監査ログ

HDFS

hdfs_log.png

Map/Reduce

mapred_log.png

サンプルログ

クラスタ起動時

  • クラスタの起動からHDFSのセーフモードがOffになるまで(約10分)

Map/Reduceジョブ実行時

リソース


*1 ジョブを実行するには、分散ファイルシステムへのアクセスは不可欠ですので、ジョブを実行するJobTrackerTaskTracker、各Taskプロセスに、HDFSへのアクセス権限が委譲されるわけです。
*2 通常、ジョブ遂行のため、JobTrackerが設定されます。
*3 RFC2712参照。
*4 セキュアなTaskプロセス起動のため、mapredグループに属する必要があります。Taskプロセスを制御する bin/task-controller のオーナが root:mapred に、パーミッションが 6050(これはリリースドキュメントの説明で、VMも同じ設定。ただし、Installing and Runningは、6550となっています)に設定されるためです。

添付ファイル: filehadoop_mapred2mins.zip 359件 [詳細] filehadoop_first10mins.zip 375件 [詳細] filemapred_log.png 315件 [詳細] filehdfs_log.png 326件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-04-13 (土) 14:35:09 (2069d)