天天看點

Kerberos的啟動和關閉

Kerberos概念

1.Kerberos使用者

Kerberos的本質是維護一套自己的使用者;或者說是核心使用者映射,比如你的系統使用者裡面有hdfs,那麼我将會在KDC中建立一套基于機器(假設我們有三台安裝了CDH的機器分别為slave1,slave2,slave3)的核心使用者,于是需要建立如下使用者(對于Hadoop裡面的使用者,這個建立是由cloudera manager在開啟Kerberos的時候自動來做的,否則需要手動在KDC中建立)

hdfs/[email protected]

  hdfs/[email protected]

  hdfs/[email protected]

  當時使用用

  kinit hdfs/[email protected]來設定目前主體的時候(同時也是基于此使用者向KDC擷取TGT),目前使用者也就具備了非Kerberos環境下的hdfs的相應的權限,可以通過hadoop fs -command 來操作hdfs。

比如開啟了Kerberos之後,你在看cloudera manager啟動HDFS的時候,就會發現其實它是用hdfs/machine-name@domain-name來啟動程式;這個時候可能出現上面描述的異常,隻要重新再生成一下主體的keytab檔案即可。

 2.Kerberos緩存

至于部分Cache Type支援collection,否則真是能夠緩存目前主體資訊;支援collection的有:DIR and API,KEYRING,KCM。預設的貌似是FILE,即keytab檔案;是以預設情況下是不支援collection;到了kerberos5之後,會在配置檔案中增加了顯式聲明:

default_ccache_name = KEYRING:persistent:%{uid}

這樣采用的就是KEYRING的緩存模式了,之前測試的情況,如果把這行給注釋掉,則無法cache多條主體,但是如果把這行打開則支援了多條主體;檢視的指令是

 klist -l

  可以看到緩存的collection。klist以及klist -A都是現實目前主體的詳細資訊。但是隻有Cache類型為DIR and API,KEYRING,KCM的時候,才可以在Cache中儲存多個使用者資訊;否則隻能看到目前使用者的資訊

3. 關于Keytab  

  Keytab裡面存放着使用者和密碼資訊,可以通過kadmin→ktadd username來進行添加;kadmin必須要管理者權限(管理者會自動擷取該使用者的密碼hash,在本地client的keytab檔案中做添加);如果沒有管理者權限,但是知道使用者名和密碼,可以通過ktutil的shell,通過一下指令來進行添加。

  或者直接在指令行添加:

  然後使用以下方式就可以實作無密碼登入(keytab登入)。

 kinit username -k -t keytabfile.keytab

啟動Kerberos

  首先建立cloudera的的管理使用者cloudera-scm/[email protected];之後注意在/var/lib/kerberos/krb5kdc/kadm5.acl裡面添加cloudera-scm/[email protected] *(可以使用通配形式),例如:

 */[email protected]

但是我的測試如果是大通配,可能會有問題,比如:*@BD.COM *;啟動叢集将會失敗。後來添加了“cloudera-scm/[email protected] *”才啟動成功。

關閉Kerberos

1. hdfs:

1) hadoop.security.authentication 設定為simple

2) hadoop.security.authorization 取消勾選

3) dfs.datanode.address 設定為 50010;否則會爆socket連結異常

4) dfs.datanode.http.address 設定為 50075;同上

2. hbase:

1) hbase.security.authentication 設定為simple

2) hbase.security.authorization 取消勾選

3) 進入到zooker-client中設定/hbase的權限為“world:anyone:cdrwa”

setAcl /hbase world:anyone:cdrwa

3. zookeeper

enableSecurity 取消勾選

4. HUE

删除執行個體中Kerberos Ticket Renewer(沒懂,實際中也沒有發現該項有用)

關于配置

/etc/krb5.con中的配置

[realms]

FAYSON.COM = {

kdc = ip-172-31-6-148.fayson.com

admin_server = ip-172-31-6-148.fayson.com

}

注意kdc以及admin_server對應的值伺服器的機器名稱,不要照搬寫上去哦;

否則将會在使用kinit的時候報錯:

kinit: Cannot contact any KDC for realm 'FAYSON.COM' while getting initial credentials

關于JCE

1. 是否安裝了JCE

$JAVA_HOME/bin/jrunscript -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("RC5") >= 256);'

如果傳回true則說明OK;

其中,openJDK預設就是有安裝JCE的;

列印(調試)Kerberos

在hadoop-env.sh或者直接在指令行中敲入:

 export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dsun.security.krb5.debug=true ${HADOOP_OPTS}” 

此時Kerberos就是出于debug狀态;在使用hadoop指令的時候(比如hadoop fs -ls /)之後将會看到更加詳細的資訊;開啟了Kerberos之後,如果執行hadoop指令發生異常,可以通過此開關來檢視異常資訊;

例如,如果是JCE的異常,錯誤資訊中指明keyTpye=18,則說明是JCE問題,因為這個異常一般情況下是你的JCE的本地政策支援了ACE256;但是其實應該不支援;可能是本地的政策被覆寫;或者配置不正确;下載下傳符合版本的JCE進行覆寫即可。

再比如,

如果資訊隻有:

Native config name: /etc/krb5.conf

Loaded from native config

>>>KinitOptions cache name is /tmp/krb5cc_993

而沒有指明目前的主體資訊則說明目前的主體為空,可能是之前執行了kdestroy指令

Kerberos異常資訊處理

1. SASL異常

執行:hadoop fs -ls /爆出異常:

18/01/15 21:32:00 WARN security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "slave1/10.1.108.65"; destination host is: "slave1":8020;

解決:這個異常可能原因是使用者不對,比如在沒有kerberos的環境下使用hdfs使用者,那麼你就需要在KDC中建立一個[email protected]使用者,注意hdfs這個使用者必須是在各個Kerberos終端都已經建立的Linux系統使用者

2. 密碼錯誤

+ kinit -c /opt/cm-5.12.1/run/cloudera-scm-agent/process/1780-hdfs-NAMENODE/krb5cc_993 -kt /opt/cm-5.12.1/run/cloudera-scm-agent/process/1780-hdfs-NAMENODE/hdfs.keytab hdfs/[email protected] kinit: Password incorrect while getting initial credentials

解決:總是這個爆異常資訊;開始嘗試了在root使用者下kinit也不好用;後來發現碰到此類問題需要在cloudera manager頁面的Administration→security(就是啟動Kerberos的頁面)→進入到Kerberos Credentials的tab頁面;勾選有問題的主體(這裡是hdfs/[email protected]),點選Regenerate Selected按鈕即完美解決。

另外,還有種情況:

org.apache.hadoop.security.KerberosAuthException: Login failure for user: hdfs/[email protected] from keytab hdfs.keytab javax.security.auth.login.LoginException: Checksum failed

解決:使用者hdfs/[email protected]是cloudera建立,并維護密碼的;但是後來我修改了密碼;需要同步一下新的密碼,在Administration→Security→Kerberos Credentials,勾選hdfs/[email protected],點選Regenerate Selected按鈕,即可實作重新生成該使用者的keytab資訊(因為已經為cloudera制定了具有管理者權限的賬号,是以可以擷取任何kerberos使用者的賬号以及hash-密碼資訊)。

3. ktadd檔案異常

ktadd -k [email protected]

Unsupported key table format version number while adding key to keytab

解決:這是因為ktadd -k filepath username中的filepath指定的keytab檔案是一個非法檔案;我是使用touch指令建立的,是以沒有好用。

4. 權限不夠

在kadmin的shell中敲入cpw username的時候爆出異常:

Operation requires ``change-password'' privilege while changing [email protected]'s key

解決:這是因為目前使用者權限不夠;切換為一個擁有“*”或者修改密碼權限的使用者。