【大數據安全】Kerberos集群安裝配置
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]
:列舉使用的 realmkdc
:代表要 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
來加密的。這就需要集群中的所有節點上安裝 JavaCryptography 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集群安裝配置