8.6. Kerberos

Contributed by Mark Murray (based on contribution by ).

Kerberos 是一個網路附加系統/協定,可以允許用戶通過一個安全伺服器的服務來驗證 自己。象遠端登陸,遠端拷貝,系統間的相互檔拷貝和另外高風險任務的服務將被變 得相當安全和可控制。

下面的文章將用來指導如何為 FreeBSD 設置 Kerberos。也可以參考相關的手冊 瞭解更詳細的說明。

在 FreeBSD 中,Kerberos 不是來自最初的 4.4BSD-Lite,而是 eBones,來自於 USA/Canada 以外的地區,那些受到美國加密代碼出口限制的國家就可以使用它。

8.6.1. 創建最初的資料庫

這只可以由 Kerberos 伺服器來做。首先確定沒有舊的 Kerberos 資料庫。必須改變 /etc/kerberosIV 的目錄,然後只檢查下面出現的檔:

    # cd /etc/kerberosIV
    # ls
    README		krb.conf        krb.realms

如果任何檔(如 principal.*master_key)存在,那使用 kdb_destroy 命令就 可以破壞舊的 Kerberos 資料庫,或者如果 Kerberos 不在運行,只要刪除另外的檔。

現在必須編輯 krb.confkrb.realms 檔來定義 Kerberos 規則。在這個例子 中,規則將是 GRONDAR.ZA,伺服器是 grunt.grondar.za。可以編輯或創建 krb.conf 文件:

    # cat krb.conf
    GRONDAR.ZA
    GRONDAR.ZA grunt.grondar.za admin server
    CS.BERKELEY.EDU okeeffe.berkeley.edu
    ATHENA.MIT.EDU kerberos.mit.edu
    ATHENA.MIT.EDU kerberos-1.mit.edu
    ATHENA.MIT.EDU kerberos-2.mit.edu
    ATHENA.MIT.EDU kerberos-3.mit.edu
    LCS.MIT.EDU kerberos.lcs.mit.edu
    TELECOM.MIT.EDU bitsy.mit.edu
    ARC.NASA.GOV trident.arc.nasa.gov

在這個例子中,另外規則沒有出現。在這兒作為一個機器如何應用多種規則的例子。 可能希望不要簡單地包括。

第一行命名了這個系統工作的規則。其他行包含了規則/主機的記錄。每行的第一項就 是一個規則,第二個是充當一個 key distribution center 的規則中的一台主機。接在一個 主機名後面的管理伺服器的命令意味著主機也要提供一個管理資料庫伺服器。更多資訊,可 以參考 Kerberos 的聯機手冊。

現在,必須添加 grunt.grondar.za 到 GRONDAR.ZA,然後添加一個記錄把所有主機 放在 .grondar.za 域中。krb.realms 檔將被升級:

    # cat krb.realms
    grunt.grondar.za GRONDAR.ZA
    .grondar.za GRONDAR.ZA
    .berkeley.edu CS.BERKELEY.EDU
    .MIT.EDU ATHENA.MIT.EDU
    .mit.edu ATHENA.MIT.EDU

在這兒作為一個例子來指出一台機器如何可以知道多個領域。也可以簡單地刪除。

第一行把指定的系統放在已命名的域中。行顯示了如何把一個特殊子域的系統默認 設為一個命名的域。

現在已經準備創建資料庫。這將需要運行 Kerberos 伺服器。執行命令 kdb_init:

    # kdb_init
    Realm name [default  ATHENA.MIT.EDU ]: GRONDAR.ZA
    You will be prompted for the database Master Password.
    It is important that you NOT FORGET this password.
    		
    Enter Kerberos master key: 

現在必須保存密匙,以便本地機器的伺服器能夠得到加速。使用 kstash 命令:

    # kstash
    	      
    Enter Kerberos master key:
    
    Current Kerberos master key version is 1.
    
    Master key entered. BEWARE!

這保存加密過的主密碼在 /etc/kerberosIV/master_key

8.6.2. 完全運行

有兩個主要的東西需要被添加到要用 Kerberos 確保安全的每個系統的資料庫中。 名稱是 kpasswdrcmd。這些程式允許另外系統改變 Kerberos 的密碼,然後象 rcp, rloginrsh 一樣運行命令。

現在,添加這些記錄:

    # kdb_edit
    Opening database...
    
    Enter Kerberos master key:
    
    Current Kerberos master key version is 1.
    
    Master key entered.  BEWARE!
    Previous or default values are in [brackets] ,
    enter return to leave the same, or new value.
    
    Principal name: passwd
    Instance: grunt
    
    <Not found>, Create [y] ? y
    
    Principal: passwd, Instance: grunt, kdc_key_ver: 1
    New Password:                    <---- enter RANDOM here
    Verifying password
    
    New Password: <---- enter RANDOM here
    
    Random password [y] ? y
    
    Principal's new key version = 1
    Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
    Max ticket lifetime (*5 minutes) [ 255 ] ?
    Attributes [ 0 ] ?
    Edit O.K.
    Principal name: rcmd
    Instance: grunt
    
    <Not found>, Create [y] ?
    
    Principal: rcmd, Instance: grunt, kdc_key_ver: 1
    New Password:		<---- enter RANDOM here
    Verifying password
    
    New Password:           <---- enter RANDOM here
    
    Random password [y] ?
    
    Principal's new key version = 1
    Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
    Max ticket lifetime (*5 minutes) [ 255 ] ?
    Attributes [ 0 ] ?
    Edit O.K.
    Principal name:         <---- null entry here will cause an exit

8.6.3. 創建新的伺服器檔

現在必須分析在每台機器上定義的服務的所有情況。使用 ext_srvtab 命令。 這將創建一個檔,必須通過安全方式被拷貝或移動到每個 Kerberos 用戶端的 /etc/kerberosIV 目錄。這個檔必須在每個伺服器和客戶機上出現,這對 Kerberos 的操 作是很重要的。

    # ext_srvtab grunt
    Enter Kerberos master key:
    		
    Current Kerberos master key version is 1.
    
    Master key entered. BEWARE!
    Generating 'grunt-new-srvtab'....

現在,這個命令只產生一個暫存檔案,必須被重命名為 srvtab,以便所有的服務可 以得到加速。使用 mv 命令移到最初的系統上:

    # mv grunt-new-srvtab srvtab

如果檔是針對客戶系統的,那網路可能就會不安全,拷貝 client-new-srvtab 到可抽 取式設備上,然後通過安全的物理方式進行傳輸。確信在客戶機的 /etc/kerberosIV 目錄中 把它重命名為srvtab,確定它是mode 600:

    # mv grumble-new-srvtab srvtab
    # chmod 600 srvtab

8.6.4. 定位資料庫

現在添加一些用戶記錄到資料庫。首先,讓用戶 jane 創建一個記錄。使用 kdb_edit 命令來完成:

    # kdb_edit
    Opening database...
    
    Enter Kerberos master key:
    
    Current Kerberos master key version is 1.
    
    Master key entered.  BEWARE!
    Previous or default values are in [brackets] ,
    enter return to leave the same, or new value.
    
    Principal name: jane
    Instance:
    
    <Not found>, Create [y] ? y
    
    Principal: jane, Instance: , kdc_key_ver: 1
    New Password:                <---- enter a secure password here
    Verifying password
    
    New Password:                <---- re-enter the password here
    Principal's new key version = 1
    Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
    Max ticket lifetime (*5 minutes) [ 255 ] ?
    Attributes [ 0 ] ?
    Edit O.K.
    Principal name:		   <---- null entry here will cause an exit

8.6.5. 測試所有的

首先必須啟動 Kerberos 守護程式。注意如果沒有正確地編輯 /etc/rc.conf 檔,那這將在重啟系統的時候自動發生。這只有在 Kerberos 伺服器上是必須的。 Kerberos 客戶機將從 /etc/kerberosIV 目錄自動獲得所需要的。

    # kerberos &
    Kerberos server starting
    Sleep forever on error
    Log file is /var/log/kerberos.log
    Current Kerberos master key version is 1.
    
    Master key entered. BEWARE!
    
    Current Kerberos master key version is 1
    Local realm: GRONDAR.ZA
    # kadmind -n &
    KADM Server KADM0.0A initializing
    Please do not use 'kill -9' to kill this job, use a
    regular kill instead
    
    Current Kerberos master key version is 1.
    
    Master key entered.  BEWARE!

現在,可以使用命令 kinit 得到一個 id 為 jane 的"入場券":

    % kinit jane
    MIT Project Athena (grunt.grondar.za)
    Kerberos Initialization for "jane"
    Password: 

如果真的有,使用 klist 設法列出記號:

    % klist
    Ticket file:    /tmp/tkt245
    Principal:      jane@GRONDAR.ZA
    
      Issued           Expires          Principal
    Apr 30 11:23:22  Apr 30 19:23:22  krbtgt.GRONDAR.ZA@GRONDAR.ZA

現在,如果 kpasswd 程式可以得到資料庫的驗證,可以使用 passwd 來檢查正在修改的 密碼:

    % passwd
    realm GRONDAR.ZA
    Old password for jane:
    New Password for jane:
    Verifying password
    New Password for jane:
    Password changed.

8.6.6. 添加 su 特權

Kerberos 允許給每個需要 root 許可權的用戶分離 supassword。現在 可以添加一個被用來驗證 su 到 root 的 id。使用 kdb_edit,可以在 Kerberos 資料庫中 創建一個記錄 jane.root:

    # kdb_edit
    Opening database...
    
    Enter Kerberos master key:
    
    Current Kerberos master key version is 1.
    
    Master key entered.  BEWARE!
    Previous or default values are in [brackets] ,
    enter return to leave the same, or new value.
    
    Principal name: jane
    Instance: root
    
    <Not found>, Create [y] ? y
    
    Principal: jane, Instance: root, kdc_key_ver: 1
    New Password:                    <---- enter a SECURE password here
    Verifying password
    
    New Password:    	 	 <---- re-enter the password here
    
    Principal's new key version = 1
    Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ?
    Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short!
    Attributes [ 0 ] ?
    Edit O.K.
    Principal name:		         <---- null entry here will cause an exit

現在設法獲得一些記號來確定在做什麼:

    # kinit jane.root
    MIT Project Athena (grunt.grondar.za)
    Kerberos Initialization for "jane.root"
    Password:

現在,必須添加用戶到 root 的 .klogin 文件:

    # cat /root/.klogin
    jane.root@GRONDAR.ZA

現在設法執行 su:

    % su
    Password:

看看有些什麼符號:

    # klist
    Ticket file:	/tmp/tkt_root_245
    Principal:      jane.root@GRONDAR.ZA
    
      Issued           Expires          Principal
    May  2 20:43:12  May  3 04:43:12  krbtgt.GRONDAR.ZA@GRONDAR.ZA

8.6.7. 使用額外命令

在一個早期的例子中,創建了一個叫做 jane 的用戶作為一個 root。這奡N以這個 用戶為例,這是 Kerberos 默認的;如果必須的記錄在 .klogin 檔中,那形式 .root 的.將允許 su 到root:

    # cat /root/.klogin
    jane.root@GRONDAR.ZA

同樣的,如果一個用戶已在自己的 home 目錄行中:

    % cat ~/.klogin
    jane@GRONDAR.ZA
    jack@GRONDAR.ZA

這允許在 GRONDAR.ZA 中的已通過 jane 或 jack 驗證的任何人通過 rlogin, rshrcp 訪問並登陸到 jane 的在這個系統上的帳戶或檔。

例如,jane 現在登陸進另一個系統,使用 Kerberos:

    % kinit
    MIT Project Athena (grunt.grondar.za)
    Password:
    %prompt.user; rlogin grunt
    Last login: Mon May  1 21:14:47 from grumble
    Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
            The Regents of the University of California.   All rights reserved.
    
    FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995

或者 jack 登陸進在同一機器上的 jane 的帳戶。

    % kinit
    % rlogin grunt -l jane
    MIT Project Athena (grunt.grondar.za)
    Password:
    Last login: Mon May  1 21:16:55 from grumble
    Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
            The Regents of the University of California.   All rights reserved.
    FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995