Hadoop環境でのKerberos利用準備
------------
### 3、Hadoop設定ファイルの編集
(3)、yarn-site.xml
HadoopクラスタにKerberosを導入する際には以下のステップが必要です。
1. サービスごとに専用のシステムユーザを設定する必要があります。
2. 各サービス起動時に適切なユーザで実行する必要があります。
3. 全ノードに以下のユーザとグループを作成する必要があります。
ユーザ構成:
ユーザ名 : グループ名 デーモン
hdfs : hadoop NameNode, Secondary NameNode, JournalNode, DataNode
yarn : hadoop ResourceManager, NodeManager
mapred : hadoop MapReduce JobHistory Server
作成手順:
# hadoopグループの作成
groupadd hadoop
# 各ユーザの作成とパスワード設定
useradd hdfs -g hadoop
echo hdfs | passwd --stdin hdfs
useradd yarn -g hadoop
echo yarn | passwd --stdin yarn
useradd mapred -g hadoop
echo mapred | passwd --stdin mapred
Hadoopサービス用のKerberosプリンシパルの作成
---------------------------------
プリンシパル名の形式は「サービス名/ホスト名@REALM」です。例:dn/hadoop01@HADOOP.COM
### 1、必要なプリンシパルの一覧
環境:ホスト名はhadoop01
サービス名 ホスト名 プリンシパル
NameNode hadoop01 nn/hadoop01
DataNode hadoop01 dn/hadoop01
SecondaryNameNode hadoop01 sn/hadoop01
ResourceManager hadoop01 rm/hadoop01
NodeManager hadoop01 nm/hadoop01
JobHistory Server hadoop01 jhs/hadoop01
Web UI hadoop01 HTTP/hadoop01
### 2、プリンシパル作成手順
1)ディレクトリの準備
各サービス用のプリンシパルはkeytabファイルを通じて認証を行うため、安全な場所にkeytabファイルを格納するディレクトリを作成します。
mkdir /etc/security/keytab/
chown -R root:hadoop /etc/security/keytab/
chmod 770 /etc/security/keytab/
2)管理者認証
プリンシパル作成コマンドを実行する前に、Kerberos管理者アカウントで認証を行う必要があります。以下のコマンドを実行し、パスワードを入力してください。
kinit root/admin
3)プリンシパル作成の実行
形式:
プリンシパル名の形式は「サービス名/ホスト名@REALM」です。
例:dn/hadoop01@HADOOP.COM
kadmin: addprinc -randkey xx/hadoop01
kadmin: xst -k /etc/security/keytab/nn.keytab xx/hadoop01
\# 説明:
\# (1) addprinc test/test:新しいプリンシパルを作成
\# addprinc:プリンシパル追加
\# -randkey:ランダムなパスワードを使用(Hadoopではkeytabによる認証のみで使用されるため)
\# test/test:新規作成されるプリンシパル
\# (2) xst -k /etc/security/keytab/test.keytab test/test:プリンシパルのキーをkeytabファイルに書き込み
\# xst:キーをkeytabファイルに書き込む
\# -k /etc/security/keytab/test.keytab:keytabファイルのパスと名前
\# test/test:対象のプリンシパル
\# (3) 簡易作成コマンド:
\# kadmin -proot/admin -wpassword -q"addprinc -randkey test/test"
\# kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/test.keytab test/test"
\# 説明:
\# -p:プリンシパル
\# -w:パスワード
\# -q:コマンド実行
\# (4) その他の操作コマンドについては公式ドキュメントを参照してください:Kerberos Admin Commands
実行:
以下のコマンドをhadoop01ノード上で実行します:
# NameNode(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey nn/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/nn.service.keytab nn/hadoop01"
# DataNode(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey dn/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/dn.service.keytab dn/hadoop01"
# Secondary NameNode(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey sn/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/sn.service.keytab sn/hadoop01"
# ResourceManager(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey rm/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/rm.service.keytab rm/hadoop01"
# NodeManager(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey nm/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/nm.service.keytab nm/hadoop01"
# JobHistory Server(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey jhs/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/hadoop01"
# Web UI(hadoop01)
kadmin -proot/admin -wpassword -q"addprinc -randkey HTTP/hadoop01"
kadmin -proot/admin -wpassword -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/hadoop01"
4)全ノードのkeytabファイル権限変更
chown -R root:hadoop /etc/security/keytab/
chmod 660 /etc/security/keytab/*
以下の設定を変更し、変更後のファイルをすべてのノードに配布してください。
(1)、core-site.xml に以下を追加:
<!-- Hadoopクラスタの認可管理を有効化 -->
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<!-- HadoopクラスタのKerberos認証を有効化 -->
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<!-- RPC通信の認証モード設定 -->
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
<!-- KerberosプリンシパルからLinuxユーザへのマッピング方式 -->
<property>
<name>hadoop.security.auth_to_local.mechanism</name>
<value>MIT</value>
</property>
<!-- KerberosプリンシパルからLinuxユーザへのマッピングルール -->
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1/$2@$0]([ndj]n\/.*@HADOOP\.COM)s/.*/hdfs/
RULE:[2:$1/$2@$0]([rn]m\/.*@HADOOP\.COM)s/.*/yarn/
RULE:[2:$1/$2@$0](jhs\/.*@HADOOP\.COM)s/.*/mapred/
DEFAULT
</value>
</property>
(2)、hdfs-site.xml
<!-- DataNodeのアクセス認証をKerberosに設定 -->
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<!-- NameNodeのKerberosプリンシパル(_HOSTは自動的にホスト名に置換されます) -->
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>nn/_HOST@HADOOP.COM</value>
</property>
<!-- NameNodeのKerberosキーファイルパス -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/security/keytab/nn.service.keytab</value>
</property>
<!-- Secondary NameNodeのKerberosプリンシパル -->
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>sn/_HOST@HADOOP.COM</value>
</property>
<!-- Secondary NameNodeのKerberosキーファイルパス -->
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/security/keytab/sn.service.keytab</value>
</property>
<!-- NameNode WebインターフェースのKerberosプリンシパル -->
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<!-- WebHDFS REST APIのKerberosプリンシパル -->
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<!-- Secondary NameNode Web UIのKerberosプリンシパル -->
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@HADOOP.COM</value>
</property>
<!-- Hadoop Web UIのKerberosキーファイルパス -->
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/spnego.service.keytab</value>
</property>
<!-- DataNodeのKerberosプリンシパル -->
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>dn/_HOST@HADOOP.COM</value>
</property>
<!-- DataNodeのKerberosキーファイルパス -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/security/keytab/dn.service.keytab</value>
</property>
<!-- DataNodeのデータ転送保護モードを認証のみに設定 -->
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
<!-- HTTPSプロトコルの使用 -->
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
<description>すべてのWebページがHTTPSを使用します。SSLサーバおよびクライアントの設定ファイルで詳細を確認してください。</description>
</property>
以下を追加:
<!-- ResourceManagerのKerberosプリンシパル -->
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/_HOST@HADOOP.COM</value>
</property>
<!-- ResourceManagerのKerberosキーファイル -->
<property>
<name>yarn.resourcemanager.keytab</name>
<value>/etc/security/keytab/rm.service.keytab</value>
</property>
<!-- NodeManagerのKerberosプリンシパル -->
<property>
<name>yarn.nodemanager.principal</name>
<value>nm/_HOST@HADOOP.COM</value>
</property>
<!-- NodeManagerのKerberosキーファイル -->
<property>
<name>yarn.nodemanager.keytab</name>
<value>/etc/security/keytab/nm.service.keytab</value>
</property>
(4)、mapred-site.xml
vi etc/hadoop/mapred-site.xml
以下を追加:
<!-- 履歴サーバのKerberosプリンシパル -->
<property>
<name>mapreduce.jobhistory.keytab</name>
<value>/etc/security/keytab/jhs.service.keytab</value>
</property>
<!-- 履歴サーバのKerberosキーファイル -->
<property>
<name>mapreduce.jobhistory.principal</name>
<value>jhs/_HOST@HADOOP.COM</value>
</property>
### HDFSのHTTPS通信の設定
1、鍵ペアの生成
KeytoolはJavaの証明書管理ツールであり、公開鍵・秘密鍵を管理できます。
-keystore:鍵庫のパスと名前を指定
-genkey:鍵ペアを生成
-alias:生成した鍵ペアに別名を付ける
-keyalg:鍵アルゴリズム(RSA/DSA)を指定
(1)keystoreのパスワードと情報を含む鍵庫の作成
[root@hadoop01 ~]# keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA
(2)keystoreファイルの権限変更
[root@hadoop01 ~]# chown -R root:hadoop /etc/security/keytab/keystore
[root@hadoop01 ~]# chmod 660 /etc/security/keytab/keystore
(3)クラスタ内の各ノードに証明書をコピー
scpを使用して配布
(4)ssl-server.xml.exampleの編集
mv ssl-server.xml.example ssl-server.xml
設定項目の更新:
<!-- SSL鍵庫パス -->
<property>
<name>ssl.server.keystore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL鍵庫パスワード -->
<property>
<name>ssl.server.keystore.password</name>
<value>password</value>
</property>
<!-- SSL信頼鍵庫パス -->
<property>
<name>ssl.server.truststore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<!-- SSL鍵庫のキーのパスワード -->
<property>
<name>ssl.server.keystore.keypassword</name>
<value>password</value>
</property>
<!-- SSL信頼鍵庫のパスワード -->
<property>
<name>ssl.server.truststore.password</name>
<value>password</value>
</property>
Linux-Container-executor
------------------------
KerberosはcgroupベースのLinux-container-executorコンテナを使用してYARNタスクを実行する必要があります。このコンテナはソースコードからビルドする必要があります。ビルドできない場合はネットワーク上から探すか、ビルド手順は省略します。
### 1)全ノードのcontainer-executor権限変更:
所有者をroot、グループをhadoop(yarnユーザの所属グループ)に設定し、権限を6050にします。デフォルトのパスは$HADOOP_HOME/binです。
chown root:hadoop $HADOOP_HOME/bin/container-executor
chmod 6050 $HADOOP_HOME/bin/container-executor
### 2)全ノードのcontainer-executor.cfgの権限変更:
### 3)$HADOOP_HOME/etc/hadoop/container-executor.cfgの編集
ファイルおよびその親ディレクトリの所有者をroot、グループをhadoop(yarnユーザの所属グループ)に設定し、権限を400にします。デフォルトのパスは$HADOOP_HOME/etc/hadoopです。
chmod 777 $HADOOP_HOME/etc/hadoop/container-executor.cfg
chown root:hadoop $HADOOP_HOME/etc/hadoop/container-executor.cfg
# NMのUnixユーザグループ。yarn-site.xmlと一致させる必要あり
yarn.nodemanager.linux-container-executor.group=hadoop
# 使用禁止ユーザ(複数は','で区切る)
banned.users=hdfs,yarn,mapred
# 使用可能な最小uid(スーパーユーザの除外)
min.user.id=1
# 使用可能ユーザ(複数は','で区切る、設定しない場合は全ユーザ許可)
allowed.system.users=
#
feature.tc.enabled=false
### 4)$HADOOP_HOME/etc/hadoop/yarn-site.xmlの編集
<!-- NodeManagerがLinuxContainerExecutorを使用するように設定 -->
<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<!-- NodeManagerの起動ユーザグループ -->
<property>
<name>yarn.nodemanager.linux-container-executor.group</name>
<value>hadoop</value>
</property>
<!-- LinuxContainerExecutorスクリプトのパス -->
<property>
<name>yarn.nodemanager.linux-container-executor.path</name>
<value>/data/software/hadoop-3.3.2/bin/container-executor</value>
</property>
5月17日 20:54 投稿