大數據平臺部署------CDH啓用TLS加密傳輸

1.  TLS介紹

1.1.   背景

部署了Kerberos之後,CM會提示有安全隱患,至少需要一級TLS加密。

1.2.  相關知識

傳輸層安全性(TLS)在ClouderaManager服務器和代理之間的通信中提供加密和身份驗證。 加密可防止通信偵聽,並且身份驗證有助於防止惡意服務器或代理在羣集中引起問題。Cloudera Manager支持三種級別的TLS安全性,三種必須逐級配置。

級別1(好) - 此級別僅配置瀏覽器和ClouderaManager之間以及代理和ClouderaManager服務器之間的加密通信。請參閱僅爲Cloudera Manager配置TLS加密,然後按照級別1:爲Cloudera Manager代理配置TLS加密,以獲取說明。 1級加密可以防止對代理和Cloudera Manager之間的通信進行窺探。

級別2(更好) - 此級別包括代理和服務器之間的加密通信,以及代理對Cloudera Manager服務器證書的強大驗證。請參閱第2級:由代理配置ClouderaManager服務器的TLS驗證。級別2通過驗證由Cloudera Manager服務器提供的證書的信任,爲代理提供額外的安全級別。

級別3(最佳) - 代理和服務器之間的加密通信。3級TLS包括代理和服務器之間的加密通信,由代理對Cloudera Manager服務器證書進行強大的驗證,並使用自簽名或CA簽名的證書將代理驗證到Cloudera Manager服務器。請參閱第3級:將代理的TLS驗證配置到Cloudera Manager服務器。級別3解決了不受信任的網絡場景,您需要防止羣集服務器被主機上運行的不受信任的代理人欺騙。 Cloudera建議您在啓用Kerberos身份驗證之前,爲不受信任的網絡環境配置3級TLS加密。這提供了Cloudera Manager服務器和集羣中經過驗證的代理之間的keytab的安全通信

Cloudera強烈建議您在開始配置Cloudera Manager服務器和代理使用TLS之前,設置完整功能的CDH羣集和Cloudera Manager。Cloudera Manager將繼續接收端口7180上的HTTP請求(默認值),但一旦啓用TLS,它將立即將客戶端重定向到端口7183以進行HTTPS連接。

一旦配置了3級TLS,如果要添加運行代理的新主機,則必須手動部署適用於您的平臺的ClouderaManager代理和守護程序軟件包,爲主機發出新的證書,配置/ etc /   cloudera-scm-agent / config.ini使用SSL / TLS,然後使主機聯機。相反,您可以禁用TLS添加主機,配置TLS的新主機,然後重新啓用適當的配置。任何一種方法都是有效的,根據您的需要。

對於運行代理的所有主機,Cloudera建議您首先使用Java創建密鑰庫,然後使用openSSL導出密鑰和證書以供代理或色相使用。

2.  Level-0:基礎TLS/SSL配置(在CM server主機上進行)

2.1.  獲取並部署服務器證書

創建目錄安全證書目錄

sudo mkdir -p /opt/cloudera/security/pki

把該目錄權限交給cloudera-scm

chown -R cloudera-scm:cloudera-scm /opt/cloudera/security/pki

umask 022

cd /opt/cloudera/security/pki

 

2.2.  創建javatruststore

sudo cp $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/jssecacerts

 

2.3.  生成服務器密鑰和CSR

在CM server上用keytool產生一個服務器的密鑰和密鑰庫

keytool -genkeypair -alias $(hostname -f)-server -keyalg RSA -keystore /opt/cloudera/security/pki/$(hostname -f)-server.jks -keysize 2048 -dname "CN=$(hostname -f),OU=Dept,O=Example.com,L=City,ST=State,C=CN" -storepass 123456 -keypass 123456

 

生成CSR

/opt/jdk1.7.0_80/bin/keytool -certreq -alias $(hostname -f)-server -keystore /opt/cloudera/security/pki/$(hostname -f)-server.jks -file /opt/cloudera/security/pki/$(hostname -f)-server.csr -storepass 123456 -keypass 123456

問題:在執行此語句的時候,提示

keytool error:gnu.javax.crypto.keyring.MalformedKeyringException: incorrect magic

原因:系統中存在不同版本的keytool

解決方案:在keytool前加上本機jdk的絕對路徑,此處加上/opt/jdk_1.7.0_80/bin/

2.4.  提交CSR給CA,獲得數字簽名證書,這裏採用openssl生成

2.4.1.      給自己簽發根證書(根證書個人信息要和即將簽署的證書信息相同)

#生成私鑰[帶密碼]

openssl genrsa [-des3] -out ca.key 2048

#生成證書請求文件

openssl req -new -key ca.key -out ca.csr

/#用自己的私鑰給自己簽發根證書

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crtrm

 

2.4.2.      給用戶簽發證書,可以是其他機器也可以是本機

#生成私鑰

$openssl genrsa -des3 -out client.key 1024  

#生成證書請求文件 ,在部署tls時,這兩部已經完成,直接用第三步命令開始

$openssl req -new -key client.key -out client.csr 

#跟蹤最後一次頒發的證書的序列號

echo "01" > /etc/pki/CA/serial

#跟蹤已經頒發的證書。我們把它命名爲index.txt

touch /etc/pki/CA/index.txt

#簽署證書

$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

 

2.4.3.      生成pem

#生成pem格式的證書,用於導入導出,通過合併證書文件crt和私鑰key完成

cat client.crt client.key> client.pem

 

 

2.5.  導入證書到keystore(此命令不能運行,需要代入接收到證書)

cp cert-file-recd /opt/cloudera/security/pki/$(hostname -f)-server.cert.pem

sudo keytool -importcert -alias $(hostname -f)-server \

-file /opt/cloudera/security/pki/$(hostname -f)-server.cert.pem \

-keystore /opt/cloudera/security/pki/$(hostname -f)-server.jks

 

2.6.  爲CMservices配置TLS/SSL信任檔案

進CM首頁,點集羣-->ClouderaManagement Service-->配置-->範圍-->服務範圍,分別填上$JAVA_HOME/jre/lib/security/jssecacerts和默認密碼 changeit,然後保存



2.7.  重啓CM

 

 

2.8.  其他方案

若第五部不採用可信的第三方證書機構頒發的證書,可採用openssl生成證書,最後不得已用自簽名證書,自簽名證書的生成方案如下:

創建目錄

mkdir -p /opt/cloudera/security/x509/ /opt/cloudera/security/jks/

轉讓目錄並給予權限

$ sudo chown -R cloudera-scm:cloudera-scm /opt/cloudera/security/jks

$ sudo umask 0700

$ cd /opt/cloudera/security/jks

生成一個服務器的密鑰和密鑰庫

keytool -genkeypair -alias cmhost -keyalg RSA -keysize 2048 -dname "cn=cm01.example.com, ou=Department,o=Company, l=City, st=State, c=US" -keypass 123456 -keystore example.jks -storepass 123456

創建java truststore

cp $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/jssecacerts

從keystore導入證書

keytool -export -alias cmhost -keystore example.jks -rfc -file selfsigned.cer

複製自簽名證書

cp selfsigned.cer /opt/cloudera/security/x509/cmhost.pem

把公鑰導入trusestore(每臺機器都要進行)

keytool -import -alias cmhost -file /opt/cloudera/security/jks/selfsigned.cer -keystore $JAVA_HOME/jre/lib/security/jssecacerts -storepass changeit

重命名keystore

mv /opt/cloudera/security/jks/example.jks /opt/cloudera/security/jks/cmhost-keystore.jks

問題1:提示證書不匹配,認證不通過等問題

解決辦法: 重新生成cer證書並導入truststore,之後必需要重啓CM service

 

問題2:提示主機名不匹配,必須要是node2

解決辦法:重新生成密鑰和密鑰庫,其中域名修改爲node2

keytool -genkeypair -alias cmhost -keyalg RSA -keysize 2048 -dname "cn=node2, ou=JJDepartment,o=JJ, l=Beijing, st=Haidian, c=ZN" -keypass 123456 -keystore example.jks -storepass 123456

 

然後進入CM首頁,點擊管理,搜索keystore,填上jks文件的路徑和keystore的密碼,再搜索tls,進入修改對AdminConsole使用tls加密



3.  Level-1:爲集羣啓用加密

3.1.  前置條件(level-0部署完畢)

3.2.  給CMagent啓動TLS

CM首頁-->管理-->設置-->安全,搜索tls,勾上爲代理使用TLS加密(此處代理的英文原文是agent,機翻成代理,實爲客戶端)

 

3.3.  修改CMagent的配置(每臺)

vim /etc/cloudera-scm-agent/config.ini

#找到[Security],將use_tls設置爲1

3.4.  重啓CMserver 和CM agent

/etc/init.d/cloudera-scm-server restart

/etc/init.d/cloudera-scm-agent restart   #每臺agent都要運行

 

3.5.  檢查運行狀況:

在重啓CM server 和CM Agent之後,打開CM首頁,選擇主機,所有主機,查看上一次檢測信號,應全爲良好,同時配置問題中,沒有“要求至少TLS1級”的常規警告。

可能遇到的問題是上一次檢測信號均爲不良,此時查看agent日誌,提示錯誤的主機名,原因是證書中的主機名是node2,但是vim /etc/cloudera-scm-agent/config.ini中主機名是192.168.159.11,將該ip修改爲node2既可解決

後續可能還有始終偏差問題,可能原因是添加了agent和server的加密之後,server與agent通信延時更高,突破了閾值,可以提高這個閾值或者抑制這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章