このドキュメントでは、Hadoopのサービスレベル認証を構成および管理する方法について説明します。
Hadoopがインストールされ、正しく構成およびセットアップされていることを確認してください。詳細については、以下を参照してください。
サービスレベル認証は、特定のHadoopサービスに接続するクライアントが、必要な事前構成された権限を持ち、特定のサービスにアクセスする権限があることを保証する初期の認証メカニズムです。たとえば、MapReduceクラスターでは、このメカニズムを使用して、構成されたユーザー/グループのリストがジョブを送信できるようにすることができます。
$HADOOP_CONF_DIR/hadoop-policy.xml
構成ファイルは、さまざまなHadoopサービスのアクセス制御リストを定義するために使用されます。
サービスレベル認証は、ファイル権限チェック、ジョブキューへのアクセス制御などの他のアクセス制御チェックよりも前に行われます。
このセクションでは、構成ファイル$HADOOP_CONF_DIR/hadoop-policy.xml
を介してサービスレベル認証を構成する方法について説明します。
デフォルトでは、Hadoopのサービスレベル認証は無効になっています。有効にするには、$HADOOP_CONF_DIR/core-site.xml
で構成プロパティ hadoop.security.authorization を true に設定します。
このセクションでは、さまざまなHadoopサービスとその構成ノブをリストします。
プロパティ | サービス |
---|---|
security.client.protocol.acl | ClientProtocolのACL。DistributedFileSystemを介してユーザーコードによって使用されます。 |
security.client.datanode.protocol.acl | ClientDatanodeProtocolのACL。ブロックリカバリ用のクライアントからデータノードへのプロトコルです。 |
security.datanode.protocol.acl | DatanodeProtocolのACL。データノードがネームノードと通信するために使用されます。 |
security.inter.datanode.protocol.acl | InterDatanodeProtocolのACL。世代タイムスタンプを更新するためのデータノード間のプロトコルです。 |
security.namenode.protocol.acl | NamenodeProtocolのACL。セカンダリネームノードがネームノードと通信するために使用するプロトコルです。 |
security.job.client.protocol.acl | JobSubmissionProtocolのACL。ジョブクライアントがジョブの送信、ジョブステータスの照会などでリソースマネージャーと通信するために使用します。 |
security.job.task.protocol.acl | TaskUmbilicalProtocolのACL。マップタスクとリデュースタスクが親ノードマネージャーと通信するために使用します。 |
security.refresh.policy.protocol.acl | RefreshAuthorizationPolicyProtocolのACL。dfsadminコマンドとrmadminコマンドが有効なセキュリティポリシーを更新するために使用します。 |
security.ha.service.protocol.acl | HAAdminがネームノードのアクティブ状態とスタンバイ状態を管理するために使用するHAServiceプロトコルのACL。 |
$HADOOP_CONF_DIR/hadoop-policy.xml
は、各Hadoopサービスのアクセス制御リストを定義します。すべてのアクセス制御リストは、シンプルな形式を持っています。
ユーザーとグループのリストはどちらも、名前のコンマ区切りリストです。2つのリストはスペースで区切られています。
例:user1,user2 group1,group2
。
グループのリストのみを指定する場合は、行の先頭に空白を追加します。同様に、コンマ区切りのユーザーリストの後にスペースまたは何も続かない場合は、指定されたユーザーのセットのみを意味します。
*
の特別な値は、すべてのユーザーがサービスにアクセスできることを意味します。
サービスにアクセス制御リストが定義されていない場合、security.service.authorization.default.acl
の値が適用されます。security.service.authorization.default.acl
が定義されていない場合は、*
が適用されます。
場合によっては、サービスのブロックされたアクセス制御リストを指定する必要があります。これは、サービスへのアクセスが許可されていないユーザーとグループのリストを指定します。ブロックされたアクセス制御リストの形式は、アクセス制御リストの形式と同じです。ブロックされたアクセス制御リストは、$HADOOP_CONF_DIR/hadoop-policy.xml
を介して指定できます。プロパティ名は、「.blocked」をサフィックスとして付けることで導出されます。
例:security.client.protocol.acl
のブロックされたアクセス制御リストのプロパティ名は、security.client.protocol.acl.blocked
になります。
サービスの場合、アクセス制御リストとブロックされた制御リストの両方を指定できます。ユーザーがアクセス制御リストに含まれており、ブロックされたアクセス制御リストに含まれていない場合、そのユーザーはサービスへのアクセスを許可されます。
サービスにブロックされたアクセス制御リストが定義されていない場合、security.service.authorization.default.acl.blocked
の値が適用されます。security.service.authorization.default.acl.blocked
が定義されていない場合は、空のブロックされたアクセス制御リストが適用されます。
サービスへのアクセスは、サービスにアクセスしているクライアントのIPアドレスに基づいて制御できます。IPアドレス、ホスト名、IP範囲のリストを指定することにより、一連のマシンからのサービスへのアクセスを制限できます。各サービスのプロパティ名は、対応するACLのプロパティ名から派生します。ACLのプロパティ名がsecurity.client.protocol.aclの場合、ホストリストのプロパティ名はsecurity.client.protocol.hostsになります。
サービスにホストリストが定義されていない場合、security.service.authorization.default.hosts
の値が適用されます。security.service.authorization.default.hosts
が定義されていない場合は、*
が適用されます。
ブロックされたホストのリストを指定できます。ホストリストに含まれているが、ブロックされたホストリストに含まれていないマシンのみがサービスへのアクセスを許可されます。プロパティ名は、「.blocked」をサフィックスとして付けることで導出されます。
例:security.client.protocol.hosts
のブロックされたホストリストのプロパティ名は、security.client.protocol.hosts.blocked
になります。
サービスにブロックされたホストリストが定義されていない場合、security.service.authorization.default.hosts.blocked
の値が適用されます。security.service.authorization.default.hosts.blocked
が定義されていない場合は、空のブロックされたホストリストが適用されます。
NameNodeとResourceManagerのサービスレベル認可設定は、Hadoopマスターデーモンの再起動なしに変更できます。クラスター管理者は、マスターノードの$HADOOP_CONF_DIR/hadoop-policy.xml
を変更し、それぞれdfsadmin
コマンドとrmadmin
コマンドの-refreshServiceAcl
スイッチを使用して、NameNodeとResourceManagerにそれぞれの設定をリロードするように指示できます。
NameNodeのサービスレベル認可設定をリフレッシュします。
$ bin/hdfs dfsadmin -refreshServiceAcl
ResourceManagerのサービスレベル認可設定をリフレッシュします。
$ bin/yarn rmadmin -refreshServiceAcl
もちろん、$HADOOP_CONF_DIR/hadoop-policy.xml
内のsecurity.refresh.policy.protocol.acl
プロパティを使用して、サービスレベル認可設定のリフレッシュ能力へのアクセスを特定のユーザー/グループに制限することができます。
ユーザーalice
、bob
、およびmapreduce
グループのユーザーのみがMapReduceクラスターにジョブを送信できるようにします。
<property> <name>security.job.client.protocol.acl</name> <value>alice,bob mapreduce</value> </property>
グループdatanodesに属するユーザーとして実行されているDataNodeのみがNameNodeと通信できるようにします。
<property> <name>security.datanode.protocol.acl</name> <value>datanodes</value> </property>
任意のユーザーがDFSClientとしてHDFSクラスターと通信できるようにします。
<property> <name>security.client.protocol.acl</name> <value>*</value> </property>