根據以前的組件安排以下:html
172.16.57.74 bd-ops-test-74 kdc zookeeper-client 172.16.57.75 bd-ops-test-75 zookeeper 172.16.57.76 bd-ops-test-76 zookeeper 172.16.57.77 bd-ops-test-77 zookeeper
在 74 節點,即 KDC server 節點上執行下面命令:java
kadmin.local -q "addprinc -randkey zookeeper/bd-ops-test-75@BIGDATA.COM " kadmin.local -q "addprinc -randkey zookeeper/bd-ops-test-76@BIGDATA.COM " kadmin.local -q "addprinc -randkey zookeeper/bd-ops-test-77@BIGDATA.COM " kadmin.local -q "xst -k zookeeper.keytab zookeeper/bd-ops-test-75@BIGDATA.COM " kadmin.local -q "xst -k zookeeper.keytab zookeeper/bd-ops-test-76@BIGDATA.COM " kadmin.local -q "xst -k zookeeper.keytab zookeeper/bd-ops-test-77@BIGDATA.COM "
拷貝 zookeeper.keytab 文件到其餘節點的 /etc/zookeeper/conf 目錄:node
# scp zookeeper.keytab bd-ops-test-xx:/etc/zookeeper/conf
並設置權限,分別在 7五、7六、77 上執行:web
# cd /etc/zookeeper/conf/;chown zookeeper:hadoop zookeeper.keytab ;chmod 400 *.keytab
因爲 keytab 至關於有了永久憑證,不須要提供密碼(若是修改 kdc 中的 principal 的密碼,則該 keytab 就會失效),因此其餘用戶若是對該文件有讀權限,就能夠冒充 keytab 中指定的用戶身份訪問 hadoop,因此 keytab 文件須要確保只對 owner 有讀權限(0400)apache
在 75 節點上修改 /etc/zookeeper/conf/zoo.cfg 文件,添加下面內容:api
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000
將修改的上面文件同步到其餘節點:7六、77:安全
# scp /etc/zookeeper/conf/zoo.cfg bd-ops-test-xx:/etc/zookeeper/conf/zoo.cfg
在 75 的zookeeper配置文件目錄建立 jaas.conf 文件,內容以下:bash
Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/zookeeper/conf/zookeeper.keytab" storeKey=true useTicketCache=true principal="zookeeper/bd-ops-test-75@BIGDATA.COM"; };
一樣,在 76 和 77 節點也建立該文件,注意每一個節點的 principal 有所不一樣。服務器
而後,在 /etc/zookeeper/conf/ 目錄建立 java.env,內容以下:dom
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf" export JAVA_HOME=/opt/programs/jdk1.7.0_67/ #這一行是爲了指定jdk路徑
並將該文件同步到其餘節點:
# scp /etc/zookeeper/conf/java.env bd-ops-test-xx:/etc/zookeeper/conf/java.env
依次重啓,並觀察日誌:
# /etc/init.d/zookeeper-server restart
觀察到以下信息,代表配置成功。
INFO [main:Login@293] - successfully logged in.
74節點做爲zookeeper-client進行測試
# cd /var/kerberos/krb5kdc/ kadmin.local -q "addprinc -randkey zkcli@BIGDATA.COM " kadmin.local -q "xst -k zkcli.keytab zkcli@BIGDATA.COM "
將keytab文件拷貝到zookeeper配置目錄
# cp zkcli.keytab /etc/zookeeper/conf/
並設置權限,執行:
# cd /etc/zookeeper/conf/;chown zookeeper:hadoop zkcli.keytab ;chmod 400 *.keytab
因爲 keytab 至關於有了永久憑證,不須要提供密碼(若是修改 kdc 中的 principal 的密碼,則該 keytab 就會失效),因此其餘用戶若是對該文件有讀權限,就能夠冒充 keytab 中指定的用戶身份訪問 hadoop,因此 keytab 文件須要確保只對 owner 有讀權限(0400)
在 74 的配置文件目錄 /etc/zookeeper/conf/ 建立 jaas.conf 文件,內容以下:
Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/zookeeper/conf/zkcli.keytab" storeKey=true useTicketCache=true principal="zkcli@BIGDATA.COM"; };
而後,在 /etc/zookeeper/conf/ 目錄建立或者修改 java.env,內容以下:
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf"
啓動客戶端:
# zookeeper-client -server bd-ops-test-75:2181
觀看日誌消息:
[zk: bd-ops-test-75:2181(CONNECTING) 0] 2016-09-04 21:05:39,089 [myid:] - INFO [main-SendThread(bd-ops-test-75:2181):Login@293] - successfully logged in.
建立一個 znode 節點:
[zk: bd-ops-test-75:2181(CONNECTED) 0] create /znode11 sasl:zkcli@BIGDATA.COM:cdwra Created /znode11
驗證該節點是否建立以及其 ACL:
[zk: bd-ops-test-75:2181(CONNECTED) 2] getAcl /znode11 'world,'anyone : cdrwa
在 Kerberos 安全機制裏,一個 principal 就是 realm 裏的一個對象,一個 principal 老是和一個密鑰(secret key)成對出現的。
這個 principal 的對應物能夠是 service,能夠是 host,也能夠是 user,對於 Kerberos 來講,都沒有區別。
Kdc(Key distribute center) 知道全部 principal 的 secret key,但每一個 principal 對應的對象只知道本身的那個 secret key 。這也是「共享密鑰「的由來。
對於 hadoop,principals 的格式爲 username/fully.qualified.domain.name@YOUR-REALM.COM
。
經過 yum 源安裝的 cdh 集羣中,NameNode 和 DataNode 是經過 hdfs 啓動的,故爲集羣中每一個服務器節點添加兩個principals:hdfs、HTTP。
在 KCD server 上(這裏是 74)建立 hdfs principal:
kadmin.local -q "addprinc -randkey hdfs/bd-ops-test-74@BIGDATA.COM" kadmin.local -q "addprinc -randkey hdfs/bd-ops-test-75@BIGDATA.COM" kadmin.local -q "addprinc -randkey hdfs/bd-ops-test-76@BIGDATA.COM" kadmin.local -q "addprinc -randkey hdfs/bd-ops-test-77@BIGDATA.COM"
-randkey
標誌沒有爲新 principal 設置密碼,而是指示 kadmin 生成一個隨機密鑰。之因此在這裏使用這個標誌,是由於此 principal 不須要用戶交互。它是計算機的一個服務器賬戶。
建立 HTTP principal:
kadmin.local -q "addprinc -randkey HTTP/bd-ops-test-74@BIGDATA.COM" kadmin.local -q "addprinc -randkey HTTP/bd-ops-test-75@BIGDATA.COM" kadmin.local -q "addprinc -randkey HTTP/bd-ops-test-76@BIGDATA.COM" kadmin.local -q "addprinc -randkey HTTP/bd-ops-test-77@BIGDATA.COM"
建立完成後,查看:
# kadmin.local -q "listprincs"
keytab 是包含 principals 和加密 principal key 的文件。keytab 文件對於每一個 host 是惟一的,由於 key 中包含 hostname。keytab 文件用於不須要人工交互和保存純文本密碼,實現到 kerberos 上驗證一個主機上的 principal。由於服務器上能夠訪問 keytab 文件便可以以 principal 的身份經過 kerberos 的認證,因此,keytab 文件應該被妥善保存,應該只有少數的用戶能夠訪問。
在 cdh1 節點,即 KDC server 節點上執行下面命令,建立包含 hdfs principal 和 host principal 的 hdfs keytab:
# cd /var/kerberos/krb5kdc/ kadmin.local -q "xst -k hdfs-unmerged.keytab hdfs/bd-ops-test-74@BIGDATA.COM" kadmin.local -q "xst -k hdfs-unmerged.keytab hdfs/bd-ops-test-75@BIGDATA.COM" kadmin.local -q "xst -k hdfs-unmerged.keytab hdfs/bd-ops-test-76@BIGDATA.COM" kadmin.local -q "xst -k hdfs-unmerged.keytab hdfs/bd-ops-test-77@BIGDATA.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/bd-ops-test-74@BIGDATA.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/bd-ops-test-75@BIGDATA.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/bd-ops-test-76@BIGDATA.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/bd-ops-test-77@BIGDATA.COM"
這樣,就會在 /var/kerberos/krb5kdc/
目錄下生成 hdfs-unmerged.keytab
和 HTTP.keytab
兩個文件,接下來使用 ktutil
合併者兩個文件爲 hdfs.keytab
。
# cd /var/kerberos/krb5kdc/ # ktutil ktutil: rkt hdfs-unmerged.keytab ktutil: rkt HTTP.keytab ktutil: wkt hdfs.keytab ktutil: exit
使用 klist 顯示 hdfs.keytab 文件列表:
#klist -ket hdfs.keytab Keytab name: FILE:hdfs.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 2 08/31/16 15:49:15 hdfs/bd-ops-test-74@BIGDATA.COM (aes256-cts-hmac-sha1-96) 2 08/31/16 15:49:15 hdfs/bd-ops-test-74@BIGDATA.COM (aes128-cts-hmac-sha1-96) .......
驗證是否正確合併了key,使用合併後的keytab,分別使用hdfs和host principals來獲取證書。
# kinit -k -t hdfs.keytab hdfs/bd-ops-test-74@BIGDATA.COM # kinit -k -t hdfs.keytab HTTP/bs-ops-test-74@BIGDATA.COM
若是出現錯誤:kinit: Key table entry not found while getting initial credentials
, 則上面的合併有問題,從新執行前面的操做。
拷貝 hdfs.keytab 文件到其餘節點的 /etc/hadoop/conf 目錄
# cd /var/kerberos/krb5kdc/ # scp hdfs.keytab bd-ops-test-xx:/etc/hadoop/conf
並設置權限,並在各節點上執行:
chown hdfs:hadoop /etc/hadoop/conf/hdfs.keytab ;chmod 400 /etc/hadoop/conf/hdfs.keytab
因爲 keytab 至關於有了永久憑證,不須要提供密碼(若是修改kdc中的principal的密碼,則該keytab就會失效),因此其餘用戶若是對該文件有讀權限,就 能夠冒充 keytab 中指定的用戶身份訪問 hadoop,因此 keytab 文件須要確保只對 owner 有讀權限(0400)
在集羣中全部節點的 core-site.xml 文件中添加下面的配置:
<property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property>
在集羣中全部節點的 hdfs-site.xml 文件中添加下面的配置:
<property> <name>dfs.block.access.token.enable</name> <value>true</value> </property> <property> <name>dfs.datanode.data.dir.perm</name> <value>700</value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/hadoop/conf/hdfs.keytab</value> </property> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/_HOST@BIGDATA.COM</value> </property> <property> <name>dfs.namenode.kerberos.https.principal</name> <value>HTTP/_HOST@BIGDATA.COM</value> </property> <property> <name>dfs.datanode.address</name> <value>0.0.0.0:1004</value> </property> <property> <name>dfs.datanode.http.address</name> <value>0.0.0.0:1006</value> </property> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/hadoop/conf/hdfs.keytab</value> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hdfs/_HOST@BIGDATA.COM</value> </property> <property> <name>dfs.datanode.kerberos.https.principal</name> <value>HTTP/_HOST@BIGDATA.COM</value> </property>
因爲 HDFS 配置了 QJM HA,則另須要添加:
<property> <name>dfs.journalnode.keytab.file</name> <value>/etc/hadoop/conf/hdfs.keytab</value> </property> <property> <name>dfs.journalnode.kerberos.principal</name> <value>hdfs/_HOST@BIGDATA.COM</value> </property> <property> <name>dfs.journalnode.kerberos.internal.spnego.principal</name> <value>HTTP/_HOST@BIGDATA.COM</value> </property>
若是配置了 WebHDFS,則添加:
<property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/_HOST@BIGDATA.COM</value> </property> <property> <name>dfs.web.authentication.kerberos.keytab</name> <value>/etc/hadoop/conf/hdfs.keytab</value> </property>
配置中有幾點要注意的:
dfs.datanode.address
表示 data transceiver RPC server 所綁定的 hostname 或 IP 地址,若是開啓 security,端口號必須小於 1024
(privileged port),不然的話啓動 datanode 時候會報 Cannot start secure cluster without privileged resources
錯誤_HOST
標記,系統會自動替換它爲全稱域名dfs.data.dir
指定)作 permission check,方式用戶的代碼不是調用hdfs api而是直接本地讀block data,這樣就繞過了kerberos和文件權限驗證,管理員能夠經過設置 dfs.datanode.data.dir.perm
來修改 datanode 文件權限,這裏咱們設置爲700請參考 Verify User Accounts and Groups in CDH 5 Due to Security 或者 Hadoop in Secure Mode。
啓動以前先啓動JournalNode
# service hadoop-hdfs-journalnode start
觀察日誌,啓動成功:
# cat /var/log/hadoop-hdfs/hadoop-hdfs-journalnode-bd-ops-test-75.log 2016-09-04 22:24:52,714 INFO org.apache.hadoop.security.UserGroupInformation: Login successful for user hdfs/bd-ops-test-75@BIGDATA.COM using keytab file /etc/hadoop/conf/hdfs.keytab
獲取 7四、75的 ticket:
# kinit -k -t /etc/hadoop/conf/hdfs.keytab hdfs/bd-ops-test-xx@BIGDATA.COM
而後啓動服務,觀察日誌:
# /etc/init.d/hadoop-hdfs-namenode start
成功啓動後日志顯示以下信息:
2016-09-04 22:56:43,413 INFO org.apache.hadoop.security.UserGroupInformation: Login successful for user hdfs/bd-ops-test-75@BIGDATA.COM using keytab file /etc/hadoop/conf/hdfs.keytab
DataNode 須要經過 JSVC 啓動。首先檢查是否安裝了 JSVC 命令,而後配置環境變量。
在各節點查看是否安裝了 JSVC:
# ls /usr/lib/bigtop-utils/ bigtop-detect-classpath bigtop-detect-javahome bigtop-detect-javalibs jsvc
而後編輯 /etc/default/hadoop-hdfs-datanode
,取消對下面的註釋並添加一行設置 JSVC_HOME
,修改以下:
export HADOOP_SECURE_DN_USER=hdfs export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs export HADOOP_SECURE_DN_LOG_DIR=/var/log/hadoop-hdfs export JSVC_HOME=/usr/lib/bigtop-utils
在各節點獲取 ticket 而後啓動服務:
kinit -k -t /etc/hadoop/conf/hdfs.keytab hdfs/bd-ops-test-xx@BIGDATA.COM; service hadoop-hdfs-datanode start
觀察日誌,出現下面日誌表示 DataNode 啓動成功:
2016-09-04 23:09:26,163 INFO org.apache.hadoop.security.UserGroupInformation: Login successful for user hdfs/bd-ops-test-77@BIGDATA.COM using keytab file /etc/hadoop/conf/hdfs.keytab