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

1. 概述

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

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

2. 環境說明:

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

機器部署:web

# 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  #同上
 }

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

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

  • [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
內容爲:*/admin@EXAMPLE.COM *
表明名稱匹配/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/admin@EXAMPLE.COM with password.
WARNING: no policy specified for admin/admin@EXAMPLE.COM; defaulting to no policy
Enter password for principal "admin/admin@EXAMPLE.COM":
Re-enter password for principal "admin/admin@EXAMPLE.COM":  
Principal "admin/admin@EXAMPLE.COM" 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/admin@EXAMPLE.COM # 初始化證書
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/admin@EXAMPLE.COM with password.
kadmin.local:

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

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

2. 增刪改查帳戶
在管理員的狀態下使用addprinc,delprinc,modprinc,listprincs命令。使用?能夠列出全部的命令。

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

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: hdfs@EXAMPLE.COM

Valid starting       Expires              Service principal
08/08/2018 17:49:41  08/09/2018 17:49:41  krbtgt/EXAMPLE.COM@EXAMPLE.COM

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/fully.qualified.domain.name@YOUR-REALM.COM.

2. Keytab

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

相關文章
相關標籤/搜索