Kerberos是一種計算機網絡認證協議,它容許某實體在非安全網絡環境下通訊,向另外一個實體以一種安全的方式證實本身的身份。它也指由麻省理工實現此協議,併發布的一套免費軟件。它的設計主要針對客戶-服務器模型,並提供了一系列交互認證——用戶和服務器都能驗證對方的身份。Kerberos協議能夠保護網絡實體免受竊聽和重複攻擊。html
Kerberos協議基於對稱密碼學,並須要一個值得信賴的第三方。Kerberos協議的擴展能夠爲認證的某些階段提供公鑰密碼學支持。node
機器部署: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服務器和客戶之間的時間同步數據庫
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 /]#
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
來加密的。這就須要集羣中的全部節點上安裝 JavaCryptography 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
經常使用命令:
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" # 刪除認證用戶
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
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)
Kerberos principal用於在kerberos加密系統中標記一個惟一的身份。
kerberos爲kerberos principal分配tickets使其能夠訪問由kerberos加密的hadoop服務。
對於hadoop,principals的格式爲username/fully.qualified.domain.name@YOUR-REALM.COM.
keytab是包含principals和加密principal key的文件。 keytab文件對於每一個host是惟一的,由於key中包含hostname。keytab文件用於不須要人工交互和保存純文本密碼,實現到kerberos上驗證一個主機上的principal。 由於服務器上能夠訪問keytab文件便可以以principal的身份經過kerberos的認證,因此,keytab文件應該被妥善保存,應該只有少數的用戶能夠訪問。