セキュアモードでの Hadoop

はじめに

デフォルト構成では、すべてのネットワークアクセスを制限することにより、攻撃者が Hadoop クラスターにアクセスできないようにする必要があります。データにリモートでアクセスしたり、ジョブを送信したりできるユーザーに制限を設けたい場合は、このドキュメントで説明するように、Hadoop クラスターの認証とアクセスを保護する必要があります。

Hadoop がセキュアモードで実行されるように構成されている場合、各 Hadoop サービスと各ユーザーは Kerberos によって認証される必要があります。

すべてのサービスホストのフォワードおよびリバースホストルックアップが、サービスが相互に認証できるように正しく構成されている必要があります。ホストルックアップは、DNS または /etc/hosts ファイルを使用して構成できます。セキュアモードで Hadoop サービスを構成する前に、Kerberos と DNS の実用的な知識があることをお勧めします。

Hadoop のセキュリティ機能は、認証サービスレベル認証Web コンソール認証、および データの機密性で構成されています。

認証

エンドユーザーアカウント

サービスレベル認証が有効になっている場合、エンドユーザーは Hadoop サービスと対話する前に認証する必要があります。最も簡単な方法は、Kerberos kinit コマンドを使用して、ユーザーが対話的に認証することです。kinit を使用した対話型ログインが不可能な場合は、Kerberos keytab ファイルを使用したプログラムによる認証を使用できます。

Hadoop デーモンのユーザーアカウント

HDFS および YARN デーモンが、hdfsyarn などの異なる Unix ユーザーとして実行されることを確認してください。また、MapReduce JobHistory サーバーが mapred などの異なるユーザーとして実行されることを確認してください。

それらを Unix グループ(hadoop など)で共有することをお勧めします。グループ管理については、「ユーザーからグループへのマッピング」も参照してください。

ユーザー:グループ デーモン
hdfs:hadoop NameNode、セカンダリ NameNode、JournalNode、DataNode
yarn:hadoop ResourceManager、NodeManager
mapred:hadoop MapReduce JobHistory サーバー

Hadoop デーモンの Kerberos プリンシパル

各 Hadoop サービスインスタンスは、Kerberos プリンシパルと keytab ファイルの場所で構成する必要があります。

サービスプリンシパルの一般的な形式は、ServiceName/_HOST@REALM.TLD です。例:dn/_HOST@EXAMPLE.COM

Hadoop は、サービスプリンシパルのホスト名コンポーネントを _HOST ワイルドカードとして指定できるようにすることで、構成ファイルのデプロイを簡素化します。各サービスインスタンスは、実行時に _HOST を独自の完全修飾ホスト名に置き換えます。これにより、管理者は同じ構成ファイルのセットをすべてのノードにデプロイできます。ただし、keytab ファイルは異なります。

HDFS

各 NameNode ホストの NameNode keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/nn.service.keytab
Keytab name: FILE:/etc/security/keytab/nn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

そのホストのセカンダリ NameNode keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/sn.service.keytab
Keytab name: FILE:/etc/security/keytab/sn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

各ホストの DataNode keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/dn.service.keytab
Keytab name: FILE:/etc/security/keytab/dn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

YARN

ResourceManager ホストの ResourceManager keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/rm.service.keytab
Keytab name: FILE:/etc/security/keytab/rm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

各ホストの NodeManager keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/nm.service.keytab
Keytab name: FILE:/etc/security/keytab/nm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

MapReduce JobHistory サーバー

そのホストの MapReduce JobHistory サーバー keytab ファイルは、次のようになります。

$ klist -e -k -t /etc/security/keytab/jhs.service.keytab
Keytab name: FILE:/etc/security/keytab/jhs.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

Kerberos プリンシパルから OS ユーザーアカウントへのマッピング

Hadoop は、hadoop.security.auth_to_local で指定されたルールを使用して、Kerberos プリンシパルを OS ユーザー (システム) アカウントにマップします。Hadoop がこれらのルールを評価する方法は、hadoop.security.auth_to_local.mechanism の設定によって決まります。

デフォルトの hadoop モードでは、Kerberos プリンシパルは、プリンシパルをシンプルな形式(つまり、' @' または '/' のないユーザーアカウント名)に変換するルールと一致する必要があります。そうでない場合、プリンシパルは承認されず、エラーが記録されます。MIT モードの場合、ルールは Kerberos 構成ファイル (krb5.conf)auth_to_local と同じように機能し、hadoop モードの制限は適用されません。MIT モードを使用する場合は、デフォルトレルムの一部として /etc/krb5.conf で指定されているのと同じ auth_to_local ルールを使用し、それらを同期させることが推奨されます。hadoop モードと MIT モードの両方で、指定されたレルムに関係なく、(DEFAULT を除いて) ルールが *すべて* のプリンシパルに適用されます。また、auth_to_local ルールを ACL として使用するのではなく、適切な (OS) メカニズムを使用する必要があります。

auth_to_local の可能な値は次のとおりです。

  • RULE:exp ローカル名は exp から作成されます。exp の形式は [n:string](regexp)s/pattern/replacement/g です。整数 n は、ターゲットプリンシパルが持つべきコンポーネントの数を示します。これが一致する場合、文字列は文字列から作成され、プリンシパルのレルムが $0 に、プリンシパルの n 番目のコンポーネントが $n に代入されます (たとえば、プリンシパルが johndoe/admin の場合、[2:$2$1foo]adminjohndoefoo という文字列になります)。この文字列が regexp と一致する場合、s//[g] 置換コマンドが文字列に対して実行されます。オプションの g を指定すると、文字列内の最初のマッチのみを置換するのではなく、文字列全体で置換がグローバルに行われます。MIT の拡張として、Hadoop auth_to_local マッピングは、返される名前を小文字にする /L フラグをサポートしています。

  • DEFAULT レルムが default_realm (通常は /etc/krb5.conf で定義) と一致する場合に限り、プリンシパル名の最初のコンポーネントをシステムユーザー名として選択します。例:デフォルトルールは、デフォルトレルムが MYREALM.TLD の場合、プリンシパル host/full.qualified.domain.name@MYREALM.TLD をシステムユーザー host にマップします。

ルールが指定されていない場合、Hadoop はデフォルトで DEFAULT を使用します。これは、ほとんどのクラスターには*適切ではない*可能性があります。

Hadoop は複数のデフォルトレルムをサポートしていないことに注意してください (Heimdal のように)。また、Hadoop は、ローカルシステムアカウントが存在するかどうかをマッピングで検証しません。

ルールの例

一般的なクラスターでは、HDFS および YARN サービスはそれぞれシステム hdfs および yarn ユーザーとして起動されます。hadoop.security.auth_to_local は次のように構成できます。

<property>
  <name>hadoop.security.auth_to_local</name>
  <value>
    RULE:[2:$1/$2@$0]([ndj]n/.*@REALM.\TLD)s/.*/hdfs/
    RULE:[2:$1/$2@$0]([rn]m/.*@REALM\.TLD)s/.*/yarn/
    RULE:[2:$1/$2@$0](jhs/.*@REALM\.TLD)s/.*/mapred/
    DEFAULT
  </value>
</property>

これは、レルム REALM.TLD の任意の host 上の任意のプリンシパル nn, dn, jn をローカルシステムアカウント hdfs にマップします。次に、REALM.TLD の任意の host 上の任意のプリンシパル rm, nm をローカルシステムアカウント yarn にマップします。3番目に、レルム REALM.TLD の任意の host 上のプリンシパル jhs をローカルシステムアカウント mapred にマップします。最後に、デフォルトレルムの任意のホスト上の任意のプリンシパルは、そのプリンシパルのユーザーコンポーネントにマップされます。

カスタムルールは、hadoop kerbname コマンドを使用してテストできます。このコマンドでは、プリンシパルを指定し、Hadoopの現在の auth_to_local ルールセットを適用できます。

ユーザーからグループへのマッピング

システムユーザーからシステムグループへのマッピングメカニズムは、hadoop.security.group.mapping を介して構成できます。詳細については、Hadoop グループマッピングを参照してください。

実際には、セキュアモードの Hadoop で LDAP を使用して Kerberos を使用して SSO 環境を管理する必要があります。

プロキシユーザー

Apache Oozie など、エンドユーザーに代わって Hadoop のサービスにアクセスする一部の製品は、エンドユーザーになりすますことができる必要があります。詳細については、プロキシユーザーのドキュメントを参照してください。

セキュア DataNode

DataNodeデータ転送プロトコルはHadoop RPCフレームワークを使用しないため、DataNodeはdfs.datanode.addressdfs.datanode.http.addressで指定された特権ポートを使用して自身を認証する必要があります。この認証は、攻撃者がDataNodeホストでルート権限を取得できないという前提に基づいています。

hdfs datanode コマンドを root として実行すると、サーバープロセスは最初に特権ポートをバインドし、次に権限を破棄し、HDFS_DATANODE_SECURE_USER で指定されたユーザーアカウントとして実行されます。この起動プロセスでは、JSVC_HOME にインストールされている jsvc プログラムを使用します。起動時に (hadoop-env.sh で) HDFS_DATANODE_SECURE_USERJSVC_HOME を環境変数として指定する必要があります。

バージョン 2.6.0 以降では、SASL を使用してデータ転送プロトコルを認証できます。この構成では、セキュリティ保護されたクラスタが jsvc を使用して root として DataNode を起動し、特権ポートにバインドする必要はなくなりました。データ転送プロトコルで SASL を有効にするには、hdfs-site.xml で dfs.data.transfer.protection を設定します。SASL 対応の DataNode は、次の 2 つの方法でセキュアモードで起動できます。1. dfs.datanode.address に非特権ポートを設定します。2. dfs.http.policyHTTPS_ONLY に設定するか、dfs.datanode.http.address を特権ポートに設定し、起動時に (hadoop-env.sh で) HDFS_DATANODE_SECURE_USER および JSVC_HOME 環境変数が環境変数として正しく指定されていることを確認します。

root 認証を使用していた既存のクラスタを移行して代わりに SASL を使用するには、まず、2.6.0 以降のバージョンがすべてのクラスタノードと、クラスタに接続する必要のある外部アプリケーションに展開されていることを確認してください。データ転送プロトコルの認証に SASL を使用する DataNode に接続できるのは、HDFS クライアントのバージョン 2.6.0 以降のみであるため、移行する前にすべての呼び出し元が正しいバージョンを持っていることが不可欠です。2.6.0 以降のバージョンがすべてに展開されたら、外部アプリケーションの設定を更新して SASL を有効にします。HDFS クライアントで SASL が有効になっている場合、root 認証または SASL 認証のいずれかで実行されている DataNode に正常に接続できます。すべてのクライアントの設定を変更することで、DataNode でのその後の構成変更がアプリケーションを中断しないことが保証されます。最後に、各 DataNode は、構成を変更して再起動することで移行できます。この移行期間中は、root 認証で実行されている DataNode と SASL 認証で実行されている DataNode が混在していてもかまいません。SASL が有効になっている HDFS クライアントはどちらにも接続できるためです。

データの機密性

RPC でのデータ暗号化

Hadoopサービスとクライアントの間で転送されるデータは、転送中に暗号化できます。core-site.xmlhadoop.rpc.protectionprivacy に設定すると、データ暗号化が有効になります。

ブロックデータ転送でのデータ暗号化。

DataNode のデータ転送プロトコルのデータ暗号化を有効にするには、hdfs-site.xml で dfs.encrypt.data.transfertrue に設定する必要があります。

オプションで、特定の暗号化アルゴリズムを選択するために、dfs.encrypt.data.transfer.algorithm3des または rc4 に設定できます。指定しない場合、システムで構成された JCE のデフォルト (通常は 3DES) が使用されます。

dfs.encrypt.data.transfer.cipher.suitesAES/CTR/NoPadding に設定すると、AES 暗号化が有効になります。デフォルトでは、これは指定されていないため、AES は使用されません。AES が使用される場合でも、dfs.encrypt.data.transfer.algorithm で指定されたアルゴリズムが最初の鍵交換中に使用されます。AES キービット長は、dfs.encrypt.data.transfer.cipher.key.bitlength を 128、192、または 256 に設定することで構成できます。デフォルトは 128 です。

AES は、最大の暗号強度と最高のパフォーマンスを提供します。現時点では、3DES および RC4 が Hadoop クラスタでより頻繁に使用されています。

HTTPでのデータ暗号化

Web コンソールとクライアント間のデータ転送は、SSL (HTTPS) を使用して保護されます。SSL 構成は推奨されますが、Kerberos で Hadoop セキュリティを構成するために必須ではありません。

HDFS デーモンの Web コンソールで SSL を有効にするには、hdfs-site.xml で dfs.http.policyHTTPS_ONLY または HTTP_AND_HTTPS のいずれかに設定します。KMS および HttpFS はこのパラメーターを尊重しないことに注意してください。HTTPS を介した KMS の有効化と、HTTPS を介した HttpFS の有効化の詳細については、Hadoop KMS および HTTP 上の Hadoop HDFS - サーバー設定を参照してください。

YARN デーモンの Web コンソールで SSL を有効にするには、yarn-site.xml で yarn.http.policyHTTPS_ONLY に設定します。

MapReduce JobHistory サーバーの Web コンソールで SSL を有効にするには、mapred-site.xml で mapreduce.jobhistory.http.policyHTTPS_ONLY に設定します。

構成

HDFS とローカルファイルシステムパスの両方の権限

次の表に、HDFS およびローカルファイルシステム (すべてのノード上) 上のさまざまなパスと推奨される権限を示します。

ファイルシステム パス ユーザー:グループ 権限
ローカル dfs.namenode.name.dir hdfs:hadoop drwx------
ローカル dfs.datanode.data.dir hdfs:hadoop drwx------
ローカル $HADOOP_LOG_DIR hdfs:hadoop drwxrwxr-x
ローカル $YARN_LOG_DIR yarn:hadoop drwxrwxr-x
ローカル yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
ローカル yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x
ローカル container-executor root:hadoop --Sr-s--*
ローカル conf/container-executor.cfg root:hadoop r-------*
hdfs / hdfs:hadoop drwxr-xr-x
hdfs /tmp hdfs:hadoop drwxrwxrwxt
hdfs /user hdfs:hadoop drwxr-xr-x
hdfs yarn.nodemanager.remote-app-log-dir yarn:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.intermediate-done-dir mapred:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.done-dir mapred:hadoop drwxr-x---

共通構成

Hadoop で RPC 認証を有効にするには、hadoop.security.authentication プロパティの値を "kerberos" に設定し、以下に示すセキュリティ関連の設定を適切に設定します。

次のプロパティは、クラスタ内のすべてのノードの core-site.xml にある必要があります。

パラメーター 注釈
hadoop.security.authentication kerberos simple: 認証なし。(デフォルト)  kerberos: Kerberos による認証を有効にします。
hadoop.security.authorization true RPC サービスレベル認証を有効にします。
hadoop.rpc.protection authentication authentication : 認証のみ (デフォルト); integrity : 認証に加えて整合性チェック。 privacy : 整合性に加えてデータ暗号化
hadoop.security.auth_to_local RULE:exp1 RULE:exp2  DEFAULT 値は、改行文字を含む文字列です。exp の形式については、Kerberos のドキュメントを参照してください。
hadoop.proxyuser.superuser.hosts superuser のなりすましが許可される、コンマ区切りのホスト。* はワイルドカードを意味します。
hadoop.proxyuser.superuser.groups superuser がなりすましたユーザーが属する、コンマ区切りのグループ。* はワイルドカードを意味します。

NameNode

パラメーター 注釈
dfs.block.access.token.enable true 安全な操作のために HDFS ブロックアクセストークンを有効にします。
dfs.namenode.kerberos.principal nn/_HOST@REALM.TLD NameNode の Kerberos プリンシパル名。
dfs.namenode.keytab.file /etc/security/keytab/nn.service.keytab NameNode の Kerberos keytab ファイル。
dfs.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD NameNode が Web UI SPNEGO 認証に使用するサーバープリンシパル。SPNEGO サーバープリンシパルは、慣例により接頭辞 HTTP/ で始まります。値が '*' の場合、Web サーバーは、keytab ファイル dfs.web.authentication.kerberos.keytab で指定されたすべてのプリンシパルでログインを試みます。ほとんどのデプロイメントでは、これを ${dfs.web.authentication.kerberos.principal} に設定できます。つまり、dfs.web.authentication.kerberos.principal の値を使用します。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/spnego.service.keytab NameNode の SPNEGO keytab ファイル。HA クラスタでは、この設定は Journal Node と共有されます。

次の設定を使用すると、NameNode Web UI への SSL アクセスを構成できます (オプション)。

パラメーター 注釈
dfs.http.policy HTTP_ONLY または HTTPS_ONLY または HTTP_AND_HTTPS HTTPS_ONLY は http アクセスをオフにします。DataNode を root として実行し、特権ポートを使用する代わりに、SASL を使用してデータ転送プロトコルを認証する場合は、HTTP サーバーの認証を保証するために、このプロパティを HTTPS_ONLY に設定する必要があります。(dfs.data.transfer.protection を参照してください。)
dfs.namenode.https-address 0.0.0.0:9871 このパラメーターは、非 HA モードおよびフェデレーションなしで使用されます。詳細については、HDFS 高可用性および HDFS フェデレーションを参照してください。

セカンダリ NameNode

パラメーター 注釈
dfs.namenode.secondary.http-address 0.0.0.0:9868 セカンダリ NameNode の HTTP Web UI アドレス。
dfs.namenode.secondary.https-address 0.0.0.0:9869 セカンダリ NameNode の HTTPS Web UI アドレス。
dfs.secondary.namenode.keytab.file /etc/security/keytab/sn.service.keytab セカンダリ NameNode の Kerberos keytab ファイル。
dfs.secondary.namenode.kerberos.principal sn/_HOST@REALM.TLD セカンダリ NameNode の Kerberos プリンシパル名。
dfs.secondary.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD セカンダリ NameNode が Web UI SPNEGO 認証に使用するサーバープリンシパル。SPNEGO サーバープリンシパルは、慣例により接頭辞 HTTP/ で始まります。値が '*' の場合、Web サーバーは、keytab ファイル dfs.web.authentication.kerberos.keytab で指定されたすべてのプリンシパルでログインを試みます。ほとんどのデプロイメントでは、これを ${dfs.web.authentication.kerberos.principal} に設定できます。つまり、dfs.web.authentication.kerberos.principal の値を使用します。

JournalNode

パラメーター 注釈
dfs.journalnode.kerberos.principal jn/_HOST@REALM.TLD JournalNode の Kerberos プリンシパル名。
dfs.journalnode.keytab.file /etc/security/keytab/jn.service.keytab JournalNode の Kerberos keytab ファイル。
dfs.journalnode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD Kerberosセキュリティが有効な場合、JournalNodeがWeb UI SPNEGO認証に使用するサーバプリンシパル。SPNEGOサーバプリンシパルは、慣例によりHTTP/のプレフィックスで始まります。値が'*'の場合、Webサーバはキータブファイルdfs.web.authentication.kerberos.keytabで指定されたすべてのプリンシパルでログインを試みます。ほとんどのデプロイメントでは、これを${dfs.web.authentication.kerberos.principal}、つまりdfs.web.authentication.kerberos.principalの値を使用するように設定できます。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/spnego.service.keytab JournalNodeのSPNEGOキータブファイル。HAクラスタでは、この設定はNameNodeと共有されます。
dfs.journalnode.https-address 0.0.0.0:8481 JournalNodeのHTTPS Web UIアドレス。

DataNode

パラメーター 注釈
dfs.datanode.data.dir.perm 700
dfs.datanode.address 0.0.0.0:1004 セキュアなDataNodeは、サーバが安全に起動されたことを保証するために、特権ポートを使用する必要があります。つまり、サーバはjsvc経由で起動する必要があります。または、データ転送プロトコルの認証にSASLを使用する場合は、非特権ポートに設定する必要があります(dfs.data.transfer.protectionを参照)。
dfs.datanode.http.address 0.0.0.0:1006 セキュアなDataNodeは、サーバが安全に起動されたことを保証するために、特権ポートを使用する必要があります。つまり、サーバはjsvc経由で起動する必要があります。
dfs.datanode.https.address 0.0.0.0:9865 Data NodeのHTTPS Web UIアドレス。
dfs.datanode.kerberos.principal dn/_HOST@REALM.TLD DataNodeのKerberosプリンシパル名。
dfs.datanode.keytab.file /etc/security/keytab/dn.service.keytab DataNodeのKerberosキータブファイル。
dfs.encrypt.data.transfer false データ暗号化を使用する場合はtrueに設定します。
dfs.encrypt.data.transfer.algorithm データ暗号化を使用する際に、暗号化アルゴリズムを制御するために、オプションで3desまたはrc4に設定します。
dfs.encrypt.data.transfer.cipher.suites データ暗号化を使用する際に、AES暗号化を有効にするために、オプションでAES/CTR/NoPaddingに設定します。
dfs.encrypt.data.transfer.cipher.key.bitlength データ暗号化でAESを使用する際に、キービット長を制御するために、オプションで128192、または256に設定します。
dfs.data.transfer.protection authentication: 認証のみ。integrity: 認証に加えて整合性チェック。privacy: 整合性に加えてデータ暗号化。このプロパティは、デフォルトでは指定されていません。このプロパティを設定すると、データ転送プロトコルの認証にSASLが有効になります。これが有効な場合、dfs.datanode.addressは非特権ポートを使用する必要があり、dfs.http.policyHTTPS_ONLYに設定する必要があり、DataNodeプロセスを開始する際にHDFS_DATANODE_SECURE_USER環境変数は未定義である必要があります。

WebHDFS

パラメーター 注釈
dfs.web.authentication.kerberos.principal http/_HOST@REALM.TLD WebHDFSのKerberosプリンシパル名。HAクラスタでは、この設定は通常、JournalNode HTTPサーバへのSPNEGOによるアクセスを保護するためにJournalNodeで使用されます。
dfs.web.authentication.kerberos.keytab /etc/security/keytab/http.service.keytab WebHDFSのKerberosキータブファイル。HAクラスタでは、この設定は通常、JournalNode HTTPサーバへのSPNEGOによるアクセスを保護するためにJournalNodeで使用されます。

ResourceManager

パラメーター 注釈
yarn.resourcemanager.principal rm/_HOST@REALM.TLD ResourceManagerのKerberosプリンシパル名。
yarn.resourcemanager.keytab /etc/security/keytab/rm.service.keytab ResourceManagerのKerberosキータブファイル。
yarn.resourcemanager.webapp.https.address ${yarn.resourcemanager.hostname}:8090 非HAのRM WebアプリケーションのHTTPSアドレス。HAクラスタでは、各ResourceManagerに対してyarn.resourcemanager.webapp.https.address.rm-idを使用します。詳細については、ResourceManager高可用性を参照してください。

NodeManager

パラメーター 注釈
yarn.nodemanager.principal nm/_HOST@REALM.TLD NodeManagerのKerberosプリンシパル名。
yarn.nodemanager.keytab /etc/security/keytab/nm.service.keytab NodeManagerのKerberosキータブファイル。
yarn.nodemanager.container-executor.class org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor LinuxContainerExecutorを使用します。
yarn.nodemanager.linux-container-executor.group hadoop NodeManagerのUnixグループ。
yarn.nodemanager.linux-container-executor.path /path/to/bin/container-executor Linuxコンテナエグゼキュータの実行可能ファイルへのパス。
yarn.nodemanager.webapp.https.address 0.0.0.0:8044 NM WebアプリケーションのHTTPSアドレス。

WebAppProxyの設定

WebAppProxyは、アプリケーションによってエクスポートされたWebアプリケーションとエンドユーザー間のプロキシを提供します。セキュリティが有効な場合、潜在的に安全でないWebアプリケーションにアクセスする前にユーザーに警告します。プロキシを使用した認証と認可は、他の特権付きWebアプリケーションと同様に処理されます。

パラメーター 注釈
yarn.web-proxy.address AM Webアプリケーションへのプロキシ用のWebAppProxyホスト:ポート。 これがyarn.resourcemanager.webapp.addressと同じか、定義されていない場合はhost:port。それ以外の場合は、スタンドアロンのプロキシサーバを起動する必要があります。
yarn.web-proxy.keytab /etc/security/keytab/web-app.service.keytab WebAppProxyのKerberosキータブファイル。
yarn.web-proxy.principal wap/_HOST@REALM.TLD WebAppProxyのKerberosプリンシパル名。

LinuxContainerExecutor

YARNフレームワークで使用されるContainerExecutor。これは、起動および制御されるコンテナを定義します。

以下はHadoop YARNで利用可能です。

ContainerExecutor 説明
DefaultContainerExecutor YARNがコンテナ実行の管理に使用するデフォルトのエグゼキュータ。コンテナプロセスにはNodeManagerと同じUnixユーザーがいます。
LinuxContainerExecutor GNU/Linuxでのみサポートされているこのエグゼキュータは、完全なセキュリティが有効な場合はアプリケーションを送信したYARNユーザーとして、完全なセキュリティが有効でない場合は専用ユーザー(デフォルトはnobody)としてコンテナを実行します。完全なセキュリティが有効な場合、このエグゼキュータは、コンテナが起動されるクラスタノードですべてのユーザーアカウントが作成されている必要があります。これは、Hadoopディストリビューションに含まれているsetuid実行可能ファイルを使用します。NodeManagerはこの実行可能ファイルを使用してコンテナを起動および強制終了します。setuid実行可能ファイルは、アプリケーションを送信したユーザーに切り替わり、コンテナを起動または強制終了します。最大限のセキュリティのために、このエグゼキュータは、共有オブジェクト、jar、中間ファイル、ログファイルなど、コンテナが使用するローカルファイルおよびディレクトリの制限付き権限とユーザー/グループの所有権を設定します。特に、このため、アプリケーション所有者とNodeManagerを除き、分散キャッシュの一部としてローカライズされたものを含め、他のユーザーはローカルファイル/ディレクトリにアクセスできないことに注意してください。

LinuxContainerExecutor実行可能ファイルをビルドするには、以下を実行します。

 $ mvn package -Dcontainer-executor.conf.dir=/etc/hadoop/

-Dcontainer-executor.conf.dirに渡されるパスは、setuid実行可能ファイルの構成ファイルを配置する必要があるクラスタノード上のパスである必要があります。実行可能ファイルは、$HADOOP_YARN_HOME/binにインストールする必要があります。

実行可能ファイルには、特定の権限が必要です。6050または--Sr-s---権限は、root(スーパーユーザー)が所有し、NodeManager Unixユーザーがグループメンバーである特別なグループ(例:hadoop)がグループ所有者であり、通常のアプリケーションユーザーはメンバーではありません。アプリケーションユーザーがこの特別なグループに属している場合、セキュリティが侵害されます。この特別なグループ名は、conf/yarn-site.xmlconf/container-executor.cfgの両方で、構成プロパティyarn.nodemanager.linux-container-executor.groupに対して指定する必要があります。

たとえば、NodeManagerがユーザーyarnとして実行され、グループusershadoopの一部であり、そのいずれかがプライマリグループであるとします。また、usersには、yarnと別のユーザー(アプリケーション送信者)aliceがメンバーとしており、alicehadoopに属していないとします。上記の説明に従うと、setuid/setgid実行可能ファイルは、ユーザー所有者としてyarn、グループ所有者としてhadoopで6050または--Sr-s---に設定する必要があります。hadoopにはyarnがメンバーであり(aliceもメンバーであるusersではなく)、yarnもメンバーではありません。

LinuxTaskControllerでは、yarn.nodemanager.local-dirsおよびyarn.nodemanager.log-dirsで指定されたディレクトリを含むパスと、そのディレクトリに至るまでのパスは、上記のディレクトリの権限の表で説明したように、755権限に設定する必要があります。

  • conf/container-executor.cfg

実行可能ファイルには、上記で説明したmvnターゲットに渡された構成ディレクトリにcontainer-executor.cfgという構成ファイルが存在する必要があります。

構成ファイルは、NodeManagerを実行しているユーザー(上記の例ではユーザーyarn)が所有し、グループ所有者は誰でもよく、権限は0400またはr--------である必要があります。

実行可能ファイルでは、conf/container-executor.cfgファイルに次の構成項目が存在する必要があります。項目は、1行に1つずつ、単純なkey=valueペアとして記述する必要があります。

パラメーター 注釈
yarn.nodemanager.linux-container-executor.group hadoop NodeManagerのUnixグループ。container-executorバイナリのグループ所有者は、このグループである必要があります。NodeManagerが構成されている値と同じである必要があります。この構成は、container-executorバイナリの安全なアクセスを検証するために必要です。
banned.users hdfs,yarn,mapred,bin 禁止ユーザー。
allowed.system.users foo,bar 許可されたシステムユーザー。
min.user.id 1000 他のスーパーユーザーを禁止します。

まとめると、以下は、LinuxContainerExecutorに関連するさまざまなパスに必要なローカルファイルシステムの権限です。

ファイルシステム パス ユーザー:グループ 権限
ローカル container-executor root:hadoop --Sr-s--*
ローカル conf/container-executor.cfg root:hadoop r-------*
ローカル yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
ローカル yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x

MapReduce JobHistory サーバー

パラメーター 注釈
mapreduce.jobhistory.address MapReduce JobHistory Server host:port デフォルトポートは10020です。
mapreduce.jobhistory.keytab /etc/security/keytab/jhs.service.keytab MapReduce JobHistory ServerのKerberosキータブファイル。
mapreduce.jobhistory.principal jhs/_HOST@REALM.TLD MapReduce JobHistory ServerのKerberosプリンシパル名。

マルチホーミング

各ホストがDNSに複数のホスト名を持つ(たとえば、パブリックおよびプライベートネットワークインターフェイスに対応する異なるホスト名)マルチホーミング設定では、Kerberos認証を機能させるために追加の構成が必要になる場合があります。マルチホーミングネットワークのHDFSサポートを参照してください。

トラブルシューティング

Kerberosはセットアップが難しく、デバッグもさらに困難です。一般的な問題は次のとおりです。

  1. ネットワークおよびDNS構成。
  2. ホストでのKerberos構成(/etc/krb5.conf)。
  3. キータブの作成と保守。
  4. 環境設定:JVM、ユーザーログイン、システムクロックなど。

JVMからのエラーメッセージが本質的に意味をなさないという事実は、このような問題の診断と修正を妨げています。

クライアントと任意のサービスに対して、追加のデバッグ情報を有効にできます。

環境変数HADOOP_JAAS_DEBUGtrueに設定します。

export HADOOP_JAAS_DEBUG=true

log4j.propertiesファイルを編集して、HadoopのセキュリティパッケージをDEBUGレベルでログに記録します。

log4j.logger.org.apache.hadoop.security=DEBUG

いくつかのシステムプロパティを設定して、JVMレベルのデバッグを有効にします。

export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug"

KDiagを使用したトラブルシューティング

Hadoopには、セットアップの検証を支援するツールがあります:KDiag

JVM の構成と環境に関する一連のプローブを含み、いくつかのシステムファイル (/etc/krb5.conf, /etc/ntp.conf) をダンプし、いくつかのシステム状態を出力し、その後、現在のユーザーとして、または指定された keytab 内の特定のプリンシパルとして Kerberos にログインしようとします。

コマンドの出力は、ローカル診断に使用したり、クラスターをサポートする担当者に転送したりできます。

KDiag コマンドには独自のエントリーポイントがあります。これは、bin/hadoop コマンドに kdiag を渡すことで呼び出されます。したがって、コマンドを呼び出すために使用されたコマンドの Kerberos クライアントの状態が表示されます。

hadoop kdiag

コマンドは、診断実行が成功した場合、ステータスコード 0 を返します。これは、Kerberos が機能していることを意味するものではなく、単に KDiag コマンドが、限られたプローブセットから問題を特定しなかったことを意味します。特に、リモートサービスに接続しようとしないため、クライアントがいずれかのサービスによって信頼されていることを検証しません。

失敗した場合、終了コードは次のとおりです。

  • -1: 不明な理由でコマンドが失敗しました
  • 41: 承認されていません (== HTTP の 401)。KDiag は、Kerberos が機能しない原因となる状態を検出しました。出力を調べて問題を特定してください。

使用法

KDiag: Diagnose Kerberos Problems
  [-D key=value] : Define a configuration option.
  [--jaas] : Require a JAAS file to be defined in java.security.auth.login.config.
  [--keylen <keylen>] : Require a minimum size for encryption keys supported by the JVM. Default value : 256.
  [--keytab <keytab> --principal <principal>] : Login from a keytab as a specific principal.
  [--nofail] : Do not fail on the first problem.
  [--nologin] : Do not attempt to log in.
  [--out <file>] : Write output to a file.
  [--resource <resource>] : Load an XML configuration resource.
  [--secure] : Require the hadoop configuration to be secure.
  [--verifyshortname <principal>]: Verify the short name of the specific principal does not contain '@' or '/'

--jaas: java.security.auth.login.config で JAAS ファイルを定義する必要があります。

--jaas が設定されている場合、Java システムプロパティ java.security.auth.login.config は JAAS ファイルに設定されている必要があります。このファイルは存在し、ゼロバイトではない単純なファイルで、現在のユーザーが読み取り可能である必要があります。より詳細な検証は実行されません。

JAAS ファイルは Hadoop 自体には必要ありませんが、一部のサービス (Zookeeper など) では安全な操作のために必要です。

--keylen <length>: JVM でサポートされている暗号化キーの最小サイズを要求します。

JVM がこの長さをサポートしていない場合、コマンドは失敗します。

デフォルト値は、AES256 暗号化スキームに必要な 256 です。Java Cryptography Extensions がインストールされていない JVM は、このようなキー長さをサポートしていません。Kerberos は、より短いキー長の暗号化スキームを使用するように構成しない限り、機能しません。

--keytab <keytab> --principal <principal>: keytab からログインします。

特定のプリンシパルとして keytab からログインします。

  1. ファイルには、名前付きホストを含む、特定のプリンシパルが含まれている必要があります。つまり、_HOST から現在のホスト名へのマッピングはありません。
  2. KDiag はログアウトし、再度ログインを試みます。これにより、過去に存在した JVM の互換性の問題がキャッチされます (Hadoop の Kerberos サポートでは、JVM 固有のクラスの使用/イントロスペクションが必要です)。

--nofail : 最初の問題で失敗しません。

KDiag は、最初の問題で停止するのではなく、すべての Kerberos 問題を診断するために最善の試行をします。

これはやや制限されています。チェックは問題が発生する順序 (たとえば、キー長が最初にチェックされる) で行われるため、初期の失敗がさらに多くの問題をトリガーする可能性があります。ただし、より詳細なレポートが生成されます。

--nologin: ログインを試みません。

ログインを試みるのをスキップします。これは --keytab オプションよりも優先され、現在の kinited ユーザーとして Kerberos にログインしようとするのも無効にします。

これは、アプリケーション内で KDiag コマンドが呼び出されている場合に便利です。Hadoop の静的なセキュリティ状態を設定するのではなく、いくつかの基本的な Kerberos 前提条件を確認するだけです。

--out outfile: 出力をファイルに書き込みます。

hadoop kdiag --out out.txt

診断情報の多くは、JRE (stderr へ) および Log4j (stdout へ) から取得されます。すべての出力を取得するには、これらの両方の出力ストリームを同じファイルにリダイレクトし、--out オプションを省略するのが最善です。

hadoop kdiag --keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM > out.txt 2>&1

それでも、複数のスレッドにわたって出力される 2 つのストリームの出力は、少し混乱する可能性があります。練習すれば簡単になります。バックグラウンドスレッドをメインスレッドから区別するために Log4j 出力のスレッド名を見ることは、hadoop レベルでは役立ちますが、JVM レベルのロギングには役立ちません。

--resource <resource> : ロードする XML 構成リソース。

XML 構成ファイルをロードするために、このオプションを使用できます。デフォルトでは、core-default および core-site XML リソースのみがロードされます。追加の構成ファイルに Kerberos 関連の構成がある場合、これは役立ちます。

hadoop kdiag --resource hbase-default.xml --resource hbase-site.xml

操作中の追加のロギングについては、「トラブルシューティング」にリストされている値にロギングおよび HADOOP_JAAS_DEBUG 環境変数を設定します。JVM オプションは KDiag で自動的に設定されます。

--secure: コマンドがセキュアなクラスターで実行されていない場合は失敗します。

つまり、クラスターの認証メカニズムが明示的または暗黙的に「シンプル」に設定されている場合。

<property>
  <name>hadoop.security.authentication</name>
  <value>simple</value>
</property>

言うまでもなく、このように構成されたアプリケーションは、セキュアな Hadoop クラスターと通信することはできません。

--verifyshortname <principal>: プリンシパルの短縮名を検証します。

これにより、プリンシパルの短縮名に "@" 文字も "/" 文字も含まれていないことが検証されます。

hadoop kdiag \
  --nofail \
  --resource hdfs-site.xml --resource yarn-site.xml \
  --keylen 1024 \
  --keytab zk.service.keytab --principal zookeeper/devix.example.org@REALM

これは、早期に失敗することなくすべての診断を実行し、HDFS および YARN XML リソースをロードし、最小キー長を 1024 バイトとし、プリンシパル zookeeper/devix.example.org@REALM としてログインを試みます。キーは keytab zk.service.keytab にある必要があります。

参考文献

  1. O’Malley O 他 Hadoop セキュリティ設計
  2. O’Malley O, Hadoop セキュリティアーキテクチャ
  3. Java 7 での Kerberos のトラブルシューティング
  4. Java 8 での Kerberos のトラブルシューティング
  5. Java 7 Kerberos の要件
  6. Java 8 Kerberos の要件
  7. Loughran S., Hadoop と Kerberos: ゲートを超えた狂気