前言
下面的所有配置,都以centos為基礎操作系統進行
服務端安裝
組件安裝
yum install krb5-libs krb5-server krb5-workstation
配置krb5.conf
默認路徑為/etc/krb5.conf
該配置的主要配置了realm 對應的kdc的host,kadmin所在服務器,以及一些domain到realm的映射關系,以及日志存儲文件等信息,一般分為如下四塊:
-
logging 記錄kerberos庫、kdc、kadmin server對應的日志文件
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
```
-
libdefaults 整個kerberos組件相關的默認配置,如果不顯示執行相關配置項,則默認這些值
[libdefaults] default_realm = TEST.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true
-
realms 。其中配置了該realm中kdc、kadmin server對應的host地址
[realms] TEST.COM = { kdc = host1.mydomain.nl admin_server = host1.mydomain.nl }
-
domain_realm 配置域名或host映射的realm 。 由於kerberos本身是支持多realm的,這個配置可以用來將不同的host或domain映射到不同的realm
[domain_realm] .example.com = TEST.COM example.com = TEST.COM
上述幾塊組合起來就是完整的配置,總體demo如下
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = TEST.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
TEST.COM = {
kdc = host1.mydomain.nl
admin_server = host1.mydomain.nl
}
[domain_realm]
.example.com = TEST.COM
example.com = TEST.COM
其中realm一般按慣例是所屬公司的域名大寫,這里做demo寫的是TEST.COM ,實際配置需要替換成具體的公司域名
配置kdc.conf
默認路徑為/var/kerberos/krb5kdc/kdc.conf
。kdc是整個Kerberos網絡的核心,它存儲了所有principal的賬號數據,並對principal的請求,進行認證,與Principal之間的訪問票據分發。
一個典型的kdc.conf配置如下
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
TEST.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 des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
max_life = 24h 0m 0s
max_renewable_life = 7d 0h 0m 0s
}
kdcdefaults塊配置了kdc服務監聽的端口
realms 配置了該kdc管轄的realm的相關配置,具體為
- acl_file 配置具有管理員權限的訪問控制列表kadm5.acl,具體釋義,見下文
- dict_file 配置principal密碼約束文件,dict_file 文件中一個字符串一行,這些字符串相當於黑名單,配置其中的字符串都不能用作密碼。
- admin_keytab kdc的admin的免交互式認證文件存儲地址
- supported_enctypes kerberos網絡中,各組件通信時所能使用的加密協議
- max_life kdc分發的票據,最大有效期
- max_renewable_life 指定一個合法票據(注意是合法,如果一個票據已經失效,是不能夠被續期的),在多長時間內可被續期。有些分布式組件,處理一個任務可能會耗很長時間,甚至大於一個票據的最大生命周期。max_renewable_life 就是指,一個票據被分發后的一段時間內,該票據可以被續期,從而使其不過期。續期的命令是
kinit -R
, hue就專門有一個續期的服務,定時去調用kinit -R
進行票據續期。一般max_renewable_life 默認值是0,也即不允許續期,所以記得要在kdc中配置該值,否則有些依賴Kerberos的服務會工作不正常,比如hue
配置kadm5.acl
默認路徑/var/kerberos/krb5kdc/kadm5.acl
該文件相當於一個訪問列表,其中配置了哪些Principal擁有管理kdc的數據庫的名單。比如下屬配置
*/admin@TEST.COM *
該配置表示名為TEST.COM的realm 中,為*/admin
的pricipal將擁有所有的權限,第一個星表示用戶名通配符,vincent/admin或者tom/admin都能滿足這個規則,第二個星表示擁有所有的權限
創建kdc數據庫
kdb5_util create -s
該命令會創建一個kdc數據庫,該數據庫實際存放所有principal的賬號。命令敲擊后,會類似如下樣子
Loading random data
Initializing database '/var/kerberos/krb5kdc/principal' for realm 'TEST.COM',
master key name 'K/M@TEST.COM'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:
它會讓用戶屬於一個密碼,該密碼是用來管理kdc數據庫的,訪問該數據的用戶名為K/M@TEST.COM
。kdc每次重啟,都會要求輸密碼,以訪問該數據庫,為了跳過這個人工干預,所以這里加了-s
參數,表示將數據登錄認證進行暫存,這樣下次kdc可以直接啟動
在server端創建一個管理員賬號,方便遠程登錄管理kerberos
在server所在的機器上執行命令kadmin.local -q "addprinc tunde/admin"
,該命令會直接訪問kdc的數據庫,並在其中創建一個tunde/admin
的principal,該principal顯然滿足滿足kadm5.acl訪問控制列表的規范,可以作為kdc的管理員
正式啟動kerberos server
$ service krb5kdc start #啟動kdc
$ service kadmin start #啟動kadmin server,該服務使得我們可以遠程通過kadmin去管理kdc數據庫中的Principal
$ chkconfig krb5kdc on
$ chkconfig kadmin on
服務端進階配置
上述配置,已經完成了一個kerberos 服務的基本配置。下面來說一些進階配置
服務端高可用配置
在兩個機器上,分別啟動kdc。 他們擁有獨立的數據庫,平時連其中一個,當掛掉后,啟動另一個服務器上的kdc。兩個kdc之間的數據庫需要自己寫腳本來復制。這種方式不是真正的高可用,且數據復制較為麻煩。
服務端同LDAP集成配置
https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/kdc_conf.html#dbdefaults
上述配置中,kdc默認的數據庫是在本地文件系統上的一個文件。可以將kerberos同LDAP整合,實現將用戶的賬戶、甚至組織機構信息存儲在ldap中,而不是本地的文件中。一個跟LDAP整合的樣例配置如下:
[kdcdefaults]
kdc_ports = 88
[realms]
ATHENA.MIT.EDU = {
kadmind_port = 749
max_life = 12h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = aes256-cts-hmac-sha1-96
supported_enctypes = aes256-cts-hmac-sha1-96:normal aes128-cts-hmac-sha1-96:normal
database_module = openldap_ldapconf
}
[logging]
kdc = FILE:/usr/local/var/krb5kdc/kdc.log
admin_server = FILE:/usr/local/var/krb5kdc/kadmin.log
[dbdefaults]
ldap_kerberos_container_dn = cn=krbcontainer,dc=mit,dc=edu
[dbmodules]
openldap_ldapconf = {
db_library = kldap
disable_last_success = true
ldap_kdc_dn = "cn=krbadmin,dc=mit,dc=edu"
# this object needs to have read rights on
# the realm container and principal subtrees
ldap_kadmind_dn = "cn=krbadmin,dc=mit,dc=edu"
# this object needs to have read and write rights on
# the realm container and principal subtrees
ldap_service_password_file = /etc/kerberos/service.keyfile
ldap_servers = ldaps://kerberos.mit.edu
ldap_conns_per_server = 5
}
-
其中dbdefaults下的ldap_kerberos_container_dn 屬性,指定的是整個kerberos管理的Principal所在ldap的父entry地址,它相當於一個容器,裝在了所有的Principal賬戶,所以名字上有container字樣體現
-
db_library = kldap 表示我們整合的數據庫類型是LDAP
-
disable_last_success = true 用戶登錄的時候,默認會記錄用戶上次成功登錄的時間。但記錄這個是有性能開銷的。所以可以通過這個選項,禁用掉 對成功登錄信息的記錄。當然禁用掉會影響管理員去排除登錄問題,你都不知道用戶上次成功登錄時什么時候了。對應的文檔地址:https://web.mit.edu/kerberos/krb5-1.14/doc/admin/lockout.html
-
ldap_kdc_dn 該屬性配置 krb5kdc守護進程在ldap中的賬號dn(dn也即我們普通理解的id),該節點需要擁有對ldap_kerberos_container_dn entry的讀寫權限
-
ldap_kadmind_dn 該屬性配置 kadmind進程的賬號dn,該節點需要擁有對ldap_kerberos_container_dn entry的讀寫權限
-
ldap_service_password_file kerberos本身的守護進程krb5kdc和kadmind在對ldap中的principal信息進行管理時,首先這些守護進程自己需要有權限登錄到ldap。而使用交互方式輸入密碼顯然不現實。所以需要將krb5kdc和kadmind對應的ldap密碼信息放到一個文件里。該屬性就是來配置這個密碼認證文件的。kerberos提供了工具kdb5_ldap_util 來將對應的ldap賬號,做成文件
kdb5_ldap_util stashsrvpw -f /home/andrew/conf_keyfile cn=service-kdc,o=org
這里
-f
指定將要用於存儲密碼的文件,后面緊跟的是對應的ldap dn。該命令會進入交互界面,讓我們輸入對應賬號的密碼,認證成功后,將在指定文件生成對應的認證記錄。該工具的參考資料為:https://web.mit.edu/kerberos/www/krb5-latest/doc/admin/admin_commands/kdb5_ldap_util.html -
ldap_servers 配置LDAP的連接地址
-
ldap_conns_per_server 配置kerberos同LDAP服務器之間保有的連接數
客戶端安裝
組件安裝
yum install krb5-workstation krb5-libs
與server不同的是,少了krb5-server組件的安裝
krb5.conf配置
一般情況,client的該配置,同服務端一樣,所以拷過來即可
日常運維
kadmin和kadmin.local的區別
kadmin 是通過訪問kadmin server進程,來實現對Kdc中的principal進行管理
而kadmin.local是在kdc所在的服務器上,直接訪問kdc的數據庫,它不依賴kadmin server,只要kdc數據庫創建后,即可進行操作。
除此之外,兩者功能類似
kadmin
兩種操作形態
直接使用kadmin時,kadmin相當一個命令行操作系統,一旦進入后,就可以在里面交互式的執行很多Principal管理命令。命令后面加了中文注釋
[root]$ kadmin -p tunde/admin
Authenticating as principal tunde/admin with password.
Password for tunde/admin@TEST.COM:
#list principals -- see which users can get a kerberos ticket
kadmin: list_principals #列出現在kdc中擁有的principal列表
#add a new principal
kadmin: addprinc user1 #添加一個principal
WARNING: no policy specified for user1@TEST.COM; defaulting to no policy
Enter password for principal "user1@TEST.COM":
Re-enter password for principal "user1@TEST.COM":
Principal "user1@TEST.COM" created.
#delete principal
kadmin: delprinc user1 #刪除一個principal
Are you sure you want to delete the principal "user1@TEST.COM"? (yes/no): yes
Principal "user1@TEST.COM" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
#let's add the user1 principal back
kadmin: addprinc user1 #再次添加user1這個principal
WARNING: no policy specified for user1@TEST.COM; defaulting to no policy
Enter password for principal "user1@TEST.COM":
Re-enter password for principal "user1@TEST.COM":
Principal "user1@TEST.COM" created.
kadmin: exit #突出整個kadmin的交互session
值得注意的是,上述addprinc user1
,會以交互的方式讓用戶輸入這個principal的密碼。如果添加的Principal本身不給用戶交互使用,而是直接以keytab文件方式做為認證文件。那么也可以在新建principal的時候加上-randkey
參數,表示給新建的用戶隨機生成一個密碼。這樣通過kadmin.local 生成keytab文件時,比如addprinc -randkey user1
再分發給到目的地就好。keytab的創建方式見下文。
當然,如果只是想直接直接執行一個命令,而不想進入上述的交互界面,也可以直接加參數-q
去執行后即退出,比如
kadmin -p tunde/admin -q "list_principals"
直接使用kadmin的錯誤
直接使用kadmin命令時,默認登錄的principal是當前linux登錄用戶的加realm組合而來的。比如當前登錄用戶是ops。那么kadmin會試登錄用戶為ops/admin@TEST.COM
。很可能KDC數據庫中,根本就沒有這個Principal,所以會報如下錯誤
Authenticating as principal ops/admin@TEST.COM with password.
解決辦法是對kadmin加-p
參數,顯示指定實際存在的admin principal來進行登錄, 如kadmin -p tunde/admin
登錄認證kinit
在安有kerberos 客戶端或服務器的機器上,直接使用kinit user1
命令,即可以交互的形式輸入密碼,去kdc認證登錄。
已認證票據查詢klist
登錄成功后,可以使用klist -e
看下票據的有效期等信息
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: user1@TEST.COM
Valid starting Expires Service principal
02/03/14 02:32:42 02/04/14 02:32:42 krbtgt/TEST.COM@TEST.COM
renew until 02/03/14 02:32:42, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
登出票據銷毀kdestroy
就在登錄的那台機器上使用kdestroy
命令,銷毀認證的票據。然后使用klist
去看是否銷毀成功,銷毀成功后顯示
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
票據續期
使用kinit -R
可以實現對已登錄認證的票據進行續期,防止失效。hue有一個專門的 Ticket Renewal 實例來做這個事情
生成keytab文件
前面說過,通過kinit方式認證一個principal是需要用輸入密碼的方式進行交互。而如果兩個互訪的Principal本身就是兩個機器,顯然沒辦法以交互的方式進行認證。keytab文件就可以解決這個問題,它存儲了多個principal及其對應的密碼信息。
keytab文件的創建方式為,在kadmin命令行中使用ktadd
命令,命令的完整形式為ktadd -k keytab_file_path principal
。demo如下
kadmin: ktadd -k /tmp/foo-new-keytab host/foo.mit.edu
Entry for principal host/foo.mit.edu@ATHENA.MIT.EDU with kvno 3,
encryption type aes256-cts-hmac-sha1-96 added to keytab
FILE:/tmp/foo-new-keytab
kadmin:
從keytab中移除對應的principal使用的命令為ktremove
,具體使用方式不再贅述
一些注意事項
max_life and max_renewable_life
前面說了max_life是設置票據的生存時長
max_renewable_life是設置票據可以被續期的時長,也即在指定的時間段內,票據可以被續期。當然續期后的票據長度還是max_life。
這兩個屬性跟principal是綁定的,所以如果配置這兩個屬性之前,已經創建了許多principal,那修改這兩個屬性重啟kdc后,這兩個屬性依然不會生效。有兩種方式來解決。
第一種,刪除數據庫后重做,數據庫對應的文件,一般在/var/kerberos/krb5kdc
目錄下
第二種,直接修改對應Principal的屬性值,比如
$ kadmin: modprinc -maxlife 1days -maxrenewlife 7days +allow_renewable krbtgt/TEST.COM
$ kadmin: modprinc -maxlife 1days -maxrenewlife 7days +allow_renewable
參考資料
https://godatadriven.com/blog/kerberos-basics-and-installing-a-kdc/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/configuring_a_kerberos_5_client