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通信延時更高,突破了閾值,可以提高這個閾值或者抑制這個問題。