1. 程式人生 > >【大數據安全】Kerberos集群安裝配置

【大數據安全】Kerberos集群安裝配置

cbc html 計算機 file 當前 獲取 tgs 集群安裝 ati

1. 概述

Kerberos是一種計算機網絡認證協議,它允許某實體在非安全網絡環境下通信,向另一個實體以一種安全的方式證明自己的身份。它也指由麻省理工實現此協議,並發布的一套免費軟件。它的設計主要針對客戶-服務器模型,並提供了一系列交互認證——用戶和服務器都能驗證對方的身份。Kerberos協議可以保護網絡實體免受竊聽和重復攻擊。

Kerberos協議基於對稱密碼學,並需要一個值得信賴的第三方。Kerberos協議的擴展可以為認證的某些階段提供公鑰密碼學支持。

2. 環境說明:

  • CDH版本:5.11.2
  • Linux版本:Centos 7
  • Docker版本:Docker version 18.06.0-ce
  • JDK版本:1.8
  • 操作用戶:root

機器部署:

# IP 主機名 Server Client
1 192.168.101.232 cdh-server-1 N/A N/A
2 192.168.101.233 cdh-node-1 Kerberos server Kerberos client
3 192.168.101.234 cdh-node-2 N/A Kerberos client
4 192.168.101.235 cdh-node-3 N/A Kerberos client

各節點之間可以通過ssh免密碼登錄
Kerberos服務器和客戶之間的時間同步

3. Kerberos 安裝

cdh-node-1作為Kerberos主節點安裝服務:

yum install krb5-libs krb5-server krb5-workstation

通過命令查看安裝列表rpm -qa|grep krb5:

[root@cdh-node-1 /]# rpm -qa  | grep krb5
krb5-workstation-1.15.1-19.el7.x86_64
krb5-devel-1.15.1-19.el7.x86_64
krb5-server-1.15.1-19.el7.x86_64
krb5-libs-1.15.1-19.el7.x86_64
[root@cdh-node-1 /]#

4. 配置

kdc服務器包含三個配置文件:

# 集群上所有節點都有這個文件而且內容同步
/etc/krb5.conf
# 主服務器上的kdc配置
/var/kerberos/krb5kdc/kdc.conf
# 能夠不直接訪問 KDC 控制臺而從 Kerberos 數據庫添加和刪除主體,需要添加配置
/var/kerberos/krb5kdc/kadm5.acl

1. 首先配置/etc/krb5.conf文件:

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
 
[libdefaults]
 default_realm = EXAMPLE.COM  #此處需要進行配置,把默認的EXAMPLE.COM修改為自己要定義的值
 dns_lookup_kdc = false
 dns_lookup_realm = false
 ticket_lifetime = 86400
 renew_lifetime = 604800
 forwardable = true
 default_tgs_enctypes = rc4-hmac
 default_tkt_enctypes = rc4-hmac
 permitted_enctypes = rc4-hmac
 udp_preference_limit = 1
 kdc_timeout = 3000

[realms]
 EXAMPLE.COM = {
 kdc = cdh-node-1   #此處配置的為主機名
 admin_server = cdh-node-1  #同上
 }

配置項說明:
更多參數設置請參考:官方文檔。

以下是幾個核心參數的說明:

  • [logging]:日誌輸出設置 (可選)
  • [libdefaults]:連接的默認配置
    • default_realm:Kerberos應用程序的默認領域,所有的principal都將帶有這個領域標誌
    • ticket_lifetime: 表明憑證生效的時限,一般為24小時
    • renew_lifetime: 表明憑證最長可以被延期的時限,一般為一個禮拜。當憑證過期之後,對安全認證的服務的後續訪問則會失敗
    • clockskew:時鐘偏差是不完全符合主機系統時鐘的票據時戳的容差,超過此容差將不接受此票據。通常,將時鐘扭斜設置為 300 秒(5 分鐘)。這意味著從服務器的角度看,票證的時間戳與它的偏差可以是在前後 5 分鐘內
    • udp_preference_limit= 1:禁止使用 udp 可以防止一個 Hadoop 中的錯誤
    • default_ccache_name:credential緩存名,默認值為
  • [realms]:列舉使用的 realm
    • kdc:代表要 kdc 的位置。格式是 機器:端口
    • admin_server:代表 admin 的位置。格式是 機器:端口
    • default_domain:代表默認的域名
  • [domain_realm]:域名到realm的關系 (可選)

2.配置/var/kerberos/krb5kdc/kdc.conf文件

此處為EXAMPLE.COM與/etc/krb5.conf中的配置保持一致。

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EXAMPLE.COM = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }

配置項說明:

- `kdcdefaults`:kdc相關配置,這裏只設置了端口信息
- `realms`:realms的配置
    - `EXAMPLE.COM`:設定的realms領域
    - `master_key_type`:和 supported_enctypes 默認使用 aes256-cts。JAVA 使用 aes256-cts 驗證方式需要安裝 JCE包(推薦不使用)
    - `acl_file`:標註了 admin 的用戶權限,文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
    - `supported_enctypes`:支持的校驗方式
    - `admin_keytab`:KDC 進行校驗的 keytab

關於AES-256加密
對於使用 Centos5.6 及以上的系統,默認使用 AES-256來加密的。這就需要集群中的所有節點上安裝 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File
下載的文件是一個 zip 包,解開後,將裏面的兩個文件放到下面的目錄中:$JAVA_HOME/jre/lib/security

3. 創建/var/kerberos/krb5kdc/kadm5.acl
內容為:*/[email protected] *
代表名稱匹配/admin@EXAMPLE COM 都認為是admin,權限是 * 代表全部權限。
在KDC上我們需要編輯acl文件來設置權限,該acl文件的默認路徑是 /var/kerberos/krb5kdc/kadm5.acl(也可以在文件kdc.conf中修改)。

Kerberos的kadmind daemon會使用該文件來管理對Kerberos database的訪問權限。對於那些可能會對pincipal產生影響的操作,acl文件也能控制哪些principal能操作哪些其他pricipals。

4. 創建Kerberos數據庫
此步可能用時較長,創建完成會在/var/kerberos/krb5kdc/下面生成一系列文件。並且會提示輸入數據庫管理員的密碼。

db5_util create -r EXAMPLE.COM –s # 此處為EXAMPLE.COM與/etc/krb5.conf中的配置保持一致。

其中,[-s]表示生成stash file,並在其中存儲master server key(krb5kdc);還可以用[-r]來指定一個realm name —— 當krb5.conf中定義了多個realm時才是必要的。

如果需要重建數據庫,將/var/kerberos/krb5kdc目錄下的principal相關的文件刪除即可.

當Kerberos database創建好後,可以看到目錄 /var/kerberos/krb5kdc 下生成了幾個文件:

kadm5.acl
kdc.conf
principal
principal.kadm5
principal.kadm5.lock
principal.ok

5. 添加database administrator
為Kerberos database添加administrative principals (即能夠管理database的principals) —— 至少要添加1個principal來使得Kerberos的管理進程kadmind能夠在網絡上與程序kadmin進行通訊。

創建管理員並輸入密碼admin。kadmin.local可以直接運行在KDC上,而無需通過Kerberos認證。

為用戶設置密碼:

[root@cdh-node-1 /]# kadmin.local -q "addprinc admin/admin"
Authenticating as principal root/[email protected] with password.
WARNING: no policy specified for admin/[email protected]; defaulting to no policy
Enter password for principal "admin/[email protected]":
Re-enter password for principal "admin/[email protected]":  
Principal "admin/[email protected]" created.

6. 設置kerberos服務為開機啟動,關閉防火墻

chkconfig krb5kdc on
chkconfig kadmin on
chkconfig iptables off

7. 啟動krb5kdc和kadmind進程

/usr/sbin/kadmind
/usr/sbin/krb5kdc

service krb5kdc start
service kadmin start
service krb5kdc status

現在KDC已經在工作了。這兩個daemons將會在後臺運行,可以查看它們的日誌文件(/var/log/krb5kdc.log 和 /var/log/kadmind.log)。

8. 檢查Kerberos正常運行

kinit admin/admin

9. 集群中的其他主機安裝Kerberos Client

yum install krb5-workstation krb5-libs krb5-auth-dialog

配置這些主機上的/etc/krb5.conf,這個文件的內容與KDC中的文件保持一致即可。

10. 在cm節點安裝ldap客戶端

yum install openldap-clients

5. Kerberos使用

常用命令:

kinit admin/[email protected] # 初始化證書
klist # 查看當前證書
kadmin.local -q "list_principals"   # 列出Kerberos中的所有認證用戶
kadmin.local -q "addprinc user1"  # 添加認證用戶,需要輸入密碼
kinit user1  # 使用該用戶登錄,獲取身份認證,需要輸入密碼
klist  # 查看當前用戶的認證信息ticket
kinit –R  # 更新ticket
kdestroy  # 銷毀當前的ticket
kadmin.local -q "delprinc user1"  # 刪除認證用戶

5.1 管理員使用

1. 登錄
登錄到管理員賬戶,如果在本機上,可以通過kadmin.local直接登錄:

[root@cdh-node-1 /]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:

其它機器的,先使用kinit進行驗證:

[root@cdh-server-1 /]# kinit admin/admin
Password for admin/[email protected]:
[root@cdh-server-1 /]# kadmin
Authenticating as principal admin/[email protected] with password.
Password for admin/[email protected]:
kadmin:

2. 增刪改查賬戶
在管理員的狀態下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。

[root@cdh-node-1 /]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  delprinc test
Are you sure you want to delete the principal "[email protected]"? (yes/no): yes
Principal "[email protected]" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
kadmin.local:  listprincs
HTTP/[email protected]
HTTP/[email protected]
HTTP/[email protected]
...

3. 生成keytab:使用xst命令或者ktadd命令

[root@cdh-node-1 /]# kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1

5.2 用戶使用

1. 查看當前認證用戶

[root@cdh-node-2 /]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting       Expires              Service principal
08/08/2018 17:49:41  08/09/2018 17:49:41  krbtgt/[email protected]

2. 認證用戶

[root@cdh-node-2 /]# kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1

3. 刪除當前的認證的緩存

[root@cdh-node-2 /]# kdestroy
[root@cdh-node-2 /]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)

6. 一些概念

1. Principal

Kerberos principal用於在kerberos加密系統中標記一個唯一的身份。
kerberos為kerberos principal分配tickets使其可以訪問由kerberos加密的hadoop服務。
對於hadoop,principals的格式為username/[email protected].

2. Keytab

keytab是包含principals和加密principal key的文件。
keytab文件對於每個host是唯一的,因為key中包含hostname。keytab文件用於不需要人工交互和保存純文本密碼,實現到kerberos上驗證一個主機上的principal。
因為服務器上可以訪問keytab文件即可以以principal的身份通過kerberos的認證,所以,keytab文件應該被妥善保存,應該只有少數的用戶可以訪問。

【大數據安全】Kerberos集群安裝配置