安裝配置 Kerberos
Kerberos 簡介
Kerberos
是一款用於非安全環境下的身份認證協議,它通過對稱密鑰加密方式向網絡服務證明用戶身份。
術語
- AS(Authentication Server)= 認證服務器
- KDC(Key Distribution Center)= 密鑰分發中心
- TGT(Ticket Granting Ticket)= 票據授權票據,票據的票據
- TGS(Ticket Granting Server)= 票據授權服務器
- SS(Service Server)= 特定服務提供端
運行環境
三臺 CentOS 7.5 虛擬機
- server1 192.168.78.101 ( Master KDC Server )
- server2 192.168.78.102 ( Client )
- server3 192.168.78.103 ( Client )
Java 版本
- JDK 1.8.0_181
安裝配置
安裝配置 Kerberos Server
- 確保時鐘同步和 DNS 解析
留意時鐘同步問題,如果 server 與 client 之間時間相差過大(默認是 5 分鐘),會導致 client 無法完成認證工作。這可以防止攻擊者使用過期的 ticket 僞裝成合法用戶實施攻擊。
開啓時鐘同步:
[root@server1 ~]# timedatectl set-timezone Asia/Shanghai # 設置時區
[root@server1 ~]# timedatectl set-ntp yes # 開啓時鐘同步
[root@server1 ~]# timedatectl # 查看時鐘同步
- 安裝 Kerberos Server
[root@server1 ~]# yum install krb5-server krb5-libs krb5-auth-dialog
出於安全考慮,最好將 KDC Server 安裝在專門的機器上,並且這臺機器不再運行其他服務。另外,由於 KDC Server 是個單點,當壓力較大時也要務必保證這臺機器的帶寬和性能。(目前用於 DEV 環境,故沒那麼多講究)
- 配置 realm name 和 domain-to-realm 映射
編輯 /etc/krb5.conf
,主要是將 EXAMPLE.COM 替換爲自定義的 Realm Name,如我們此處將其定義爲 DATACENTER.COM,並將 example.com 替換爲對應的服務器域名,比如我們此處設置爲 server1 。按照約定,Realm Name 均爲大寫,主機名和域名均爲小寫。
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
default_realm = DATACENTER.COM
default_ccache_name = KEYRING:persistent:%{uid}
# udp_preference_limit = 1
[realms]
DATACENTER.COM = {
kdc = server1
admin_server = server1
}
[domain_realm]
.datacenter.com = DATACENTER.COM
datacenter.com = DATACENTER.COM
編輯 /var/kerberos/krb5kdc/kdc.conf
,將 EXAMPLE.COM 替換爲自定義的 *DATACENTER.COM。此處我們禁用了 AED-256
加密,如果啓用的話,需要下載 JCE
(如對應 Java 1.8 版本)文件,並替換 $JAVA_HOME/jre/lib/security/policy/limited
目錄下的 JAR 包。
[root@server1 ~]# vi
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
DATACENTER.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
# 移除 aes256-cts:normal
supported_enctypes = 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
}
- 使用
kdb5_util
創建數據庫
[root@server1 ~]# /usr/sbin/kdb5_util create -s
create
創建存儲 Kerberos
realm 的數據庫,-s
參數創建一個 存儲主服務器 key 的stash
文件,如果後面沒有指定文件,則 Kerberos
會提示輸入密碼。
- 編輯 Kerberos ACL
編輯 /var/kerberos/krb5kdc/kadm5.acl
,該文件用於 kadmind
確定哪個 principal
具有訪問 Kerberos 數據庫的權限,以及具有何種訪問級別。可設置爲如下:
*/[email protected] *
大多數用戶在 Kerberos 數據庫中都表示爲單個的 principal
(不帶 instance,如 [email protected]);但像 root/[email protected] 這樣,擁有第二個 principal
且爲 admin 的 instance 的用戶將能對 Kerberos 數據庫行使所有管理權操作。
- 在 KDC 終端創建第一個
principal
Principal
代表 Kerberos 系統中的唯一 ID,作爲接收 Kerberos ticket
並以此訪問對應服務的主體[^principal]。Principal
由 /
分隔的幾部分組成,也可作爲普通主體不包含 /
分隔符。另外,我們也可以在後面加上 @Realm
,如果沒有指定 Realm
,將使用 krb5.conf
中定義的默認 Realm
。
- Primary: 如果 Principal 代表一個用戶,則 primary 可爲用戶名;如果代表服務,則可爲服務名;如果代表 host,則可以直接使用字符串 “host”
- Instance: 可以進一步描述用戶,作爲該用戶 / 服務的一個實例,如 root/[email protected],再如 kafka/[email protected]
- Realm: 可以爲一切 ASCII 碼,但通常爲域名,約定大寫。如 datacenter.com 可寫爲 DATACENTER.COM
[root@server1 ~]# /usr/sbin/kadmin.local -q "addprinc root/admin"
- 開啓 Kerberos 服務
[root@server1 ~]# systemctl start krb5kdc # 開啓服務
[root@server1 ~]# systemctl start kadmin
[root@server1 ~]# systemctl enable krb5kdc # 開機啓動
[root@server1 ~]# systemctl enable kadmin
- 命令行方式添加
pincipal
kadmin.local: ank -randkey [email protected]
kadmin.local
和 kamdin
是操作 KDC 的命令行接口,可以用來查看、添加和刪除 principal
等。 kadmin.local
只能用於 KDC 本地,無需輸入密碼; kamdin
可用於客戶端,需輸入密碼。
- 驗證
使用 kinit
獲取 ticket
並存入證明緩存文件中,然後使用 klist
查看,或使用 kdestroy
銷燬緩存和證明。
[root@server1 ~]# kinit root/[email protected]
[root@server1 ~]# klist
安裝配置 Kerberos Client
配置 Kerberos Client 僅需要安裝 client 包,併爲每臺 Client 提供 krb5.conf
配置文件。
- 確保時鐘同步和域名解析
- 在每臺 Client 安裝
krb5-libs
和krb5-workstation
[root@server2 ~]# yum install krb5-libs krb5-workstation
[root@server3 ~]# yum install krb5-libs krb5-workstation
- 爲每臺 client 提供
/etc/krb5.conf
文件與 KDC Server 保持一直就可以了,如果服務期間啓用了 SSH 登陸,可以使用 scp
命令傳輸;不然也可以手動拷貝或其他方式。
[root@server1 ~]# scp /etc/krb5.conf root@server2:/etc/krb5.conf
[root@server1 ~]# scp /etc/krb5.conf root@server3:/etc/krb5.conf
- 爲每臺 Client 創建自己的
principal
(可選)
如果使用了 Kerberos 提供的 sshd
, kshd
和 klogind
等命令,在使用前需要首先爲每臺 Client 創建自己的 principal
。其中 instance
是主機 hostname
, -randkey
表示生成隨機 key。
kadmin: ank -randkey host/[email protected] # 創建 host/server1 principal,server2/server3 同理
kadmin: xst -k /etc/security/keytabs/host.keytab host/[email protected] # 添加 host/server1 principal 至 host.keytab,server2/server3 同理
- 驗證每臺 Client 的
principal
可用 (可選)
[root@server2 ~]# klist -kt /etc/security/keytabs/host.keytab
[root@server2 ~]# kinit -kt /etc/security/keytabs/host.keytab root/[email protected]
[root@server2 ~]# kadmin -p root/admin -q "getprincs" # 如果是 admin,且非隨機密碼,可使用密碼驗證