デフォルト構成では、すべてのネットワークアクセスを制限することにより、攻撃者が Hadoop クラスターにアクセスできないようにする必要があります。データにリモートでアクセスしたり、ジョブを送信したりできるユーザーに制限を設けたい場合は、このドキュメントで説明するように、Hadoop クラスターの認証とアクセスを保護する必要があります。
Hadoop がセキュアモードで実行されるように構成されている場合、各 Hadoop サービスと各ユーザーは Kerberos によって認証される必要があります。
すべてのサービスホストのフォワードおよびリバースホストルックアップが、サービスが相互に認証できるように正しく構成されている必要があります。ホストルックアップは、DNS または /etc/hosts
ファイルを使用して構成できます。セキュアモードで Hadoop サービスを構成する前に、Kerberos と DNS の実用的な知識があることをお勧めします。
Hadoop のセキュリティ機能は、認証、サービスレベル認証、Web コンソール認証、および データの機密性で構成されています。
サービスレベル認証が有効になっている場合、エンドユーザーは Hadoop サービスと対話する前に認証する必要があります。最も簡単な方法は、Kerberos kinit
コマンドを使用して、ユーザーが対話的に認証することです。kinit
を使用した対話型ログインが不可能な場合は、Kerberos keytab ファイルを使用したプログラムによる認証を使用できます。
HDFS および YARN デーモンが、hdfs
や yarn
などの異なる Unix ユーザーとして実行されることを確認してください。また、MapReduce JobHistory サーバーが mapred
などの異なるユーザーとして実行されることを確認してください。
それらを Unix グループ(hadoop
など)で共有することをお勧めします。グループ管理については、「ユーザーからグループへのマッピング」も参照してください。
ユーザー:グループ | デーモン |
---|---|
hdfs:hadoop | NameNode、セカンダリ NameNode、JournalNode、DataNode |
yarn:hadoop | ResourceManager、NodeManager |
mapred:hadoop | MapReduce JobHistory サーバー |
各 Hadoop サービスインスタンスは、Kerberos プリンシパルと keytab ファイルの場所で構成する必要があります。
サービスプリンシパルの一般的な形式は、ServiceName/_HOST@REALM.TLD
です。例:dn/_HOST@EXAMPLE.COM
。
Hadoop は、サービスプリンシパルのホスト名コンポーネントを _HOST
ワイルドカードとして指定できるようにすることで、構成ファイルのデプロイを簡素化します。各サービスインスタンスは、実行時に _HOST
を独自の完全修飾ホスト名に置き換えます。これにより、管理者は同じ構成ファイルのセットをすべてのノードにデプロイできます。ただし、keytab ファイルは異なります。
各 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)
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 サーバー 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)
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データ転送プロトコルはHadoop RPCフレームワークを使用しないため、DataNodeはdfs.datanode.address
とdfs.datanode.http.address
で指定された特権ポートを使用して自身を認証する必要があります。この認証は、攻撃者がDataNodeホストでルート権限を取得できないという前提に基づいています。
hdfs datanode
コマンドを root として実行すると、サーバープロセスは最初に特権ポートをバインドし、次に権限を破棄し、HDFS_DATANODE_SECURE_USER
で指定されたユーザーアカウントとして実行されます。この起動プロセスでは、JSVC_HOME
にインストールされている jsvc プログラムを使用します。起動時に (hadoop-env.sh
で) HDFS_DATANODE_SECURE_USER
と JSVC_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.policy
を HTTPS_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 クライアントはどちらにも接続できるためです。
Hadoopサービスとクライアントの間で転送されるデータは、転送中に暗号化できます。core-site.xml
で hadoop.rpc.protection
を privacy
に設定すると、データ暗号化が有効になります。
DataNode のデータ転送プロトコルのデータ暗号化を有効にするには、hdfs-site.xml で dfs.encrypt.data.transfer
を true
に設定する必要があります。
オプションで、特定の暗号化アルゴリズムを選択するために、dfs.encrypt.data.transfer.algorithm
を 3des
または rc4
に設定できます。指定しない場合、システムで構成された JCE のデフォルト (通常は 3DES) が使用されます。
dfs.encrypt.data.transfer.cipher.suites
を AES/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 クラスタでより頻繁に使用されています。
Web コンソールとクライアント間のデータ転送は、SSL (HTTPS) を使用して保護されます。SSL 構成は推奨されますが、Kerberos で Hadoop セキュリティを構成するために必須ではありません。
HDFS デーモンの Web コンソールで SSL を有効にするには、hdfs-site.xml で dfs.http.policy
を HTTPS_ONLY
または HTTP_AND_HTTPS
のいずれかに設定します。KMS および HttpFS はこのパラメーターを尊重しないことに注意してください。HTTPS を介した KMS の有効化と、HTTPS を介した HttpFS の有効化の詳細については、Hadoop KMS および HTTP 上の Hadoop HDFS - サーバー設定を参照してください。
YARN デーモンの Web コンソールで SSL を有効にするには、yarn-site.xml で yarn.http.policy
を HTTPS_ONLY
に設定します。
MapReduce JobHistory サーバーの Web コンソールで SSL を有効にするには、mapred-site.xml で mapreduce.jobhistory.http.policy
を HTTPS_ONLY
に設定します。
次の表に、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 がなりすましたユーザーが属する、コンマ区切りのグループ。* はワイルドカードを意味します。 |
パラメーター | 値 | 注釈 |
---|---|---|
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 フェデレーションを参照してください。 |
パラメーター | 値 | 注釈 |
---|---|---|
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 の値を使用します。 |
パラメーター | 値 | 注釈 |
---|---|---|
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アドレス。 |
パラメーター | 値 | 注釈 |
---|---|---|
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を使用する際に、キービット長を制御するために、オプションで128 、192 、または256 に設定します。 | |
dfs.data.transfer.protection |
authentication : 認証のみ。integrity : 認証に加えて整合性チェック。privacy : 整合性に加えてデータ暗号化。このプロパティは、デフォルトでは指定されていません。このプロパティを設定すると、データ転送プロトコルの認証にSASLが有効になります。これが有効な場合、dfs.datanode.address は非特権ポートを使用する必要があり、dfs.http.policy はHTTPS_ONLY に設定する必要があり、DataNodeプロセスを開始する際にHDFS_DATANODE_SECURE_USER 環境変数は未定義である必要があります。 |
パラメーター | 値 | 注釈 |
---|---|---|
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で使用されます。 |
パラメーター | 値 | 注釈 |
---|---|---|
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高可用性を参照してください。 |
パラメーター | 値 | 注釈 |
---|---|---|
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
は、アプリケーションによってエクスポートされた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プリンシパル名。 |
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.xml
とconf/container-executor.cfg
の両方で、構成プロパティyarn.nodemanager.linux-container-executor.group
に対して指定する必要があります。
たとえば、NodeManagerがユーザーyarn
として実行され、グループusers
とhadoop
の一部であり、そのいずれかがプライマリグループであるとします。また、users
には、yarn
と別のユーザー(アプリケーション送信者)alice
がメンバーとしており、alice
はhadoop
に属していないとします。上記の説明に従うと、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.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はセットアップが難しく、デバッグもさらに困難です。一般的な問題は次のとおりです。
/etc/krb5.conf
)。JVMからのエラーメッセージが本質的に意味をなさないという事実は、このような問題の診断と修正を妨げています。
クライアントと任意のサービスに対して、追加のデバッグ情報を有効にできます。
環境変数HADOOP_JAAS_DEBUG
をtrue
に設定します。
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 コマンドが、限られたプローブセットから問題を特定しなかったことを意味します。特に、リモートサービスに接続しようとしないため、クライアントがいずれかのサービスによって信頼されていることを検証しません。
失敗した場合、終了コードは次のとおりです。
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 からログインします。
_HOST
から現在のホスト名へのマッピングはありません。--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
にある必要があります。