kerberos安裝配置


前言

下面的所有配置,都以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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM