天天看點

Linux 下 配置Apache使用Windows AD內建認證(SSO)第一部分:Kerberos 知識-簡單了解驗證過程第二部分:為Linux下的Apache 向Windows AD中注冊服務

第一部分:Kerberos 知識-簡單了解驗證過程

Kerberos是網絡授權協定,是設計的很複雜的可防止僞造的安全的身份認證機制.最重要的一點就是密碼不會在網絡上傳輸,以防止被竊取.

Kerberos 設計中主要涉及有三個對象,需要服務的Client,提供認證的KDC,和提供服務的Server.

當Client 通路 Server 時,會先向KDC要一張通路Server的票,然後拿着那張票去Server那裡享受服務.

這一點和坐高鐵非常像,高鐵爽不爽我們不管,我們隻關注以下問題:

  1. 坐高鐵是需要買車票的
  2. 出票機關不一定是你要進的那個高鐵站
  3. 高鐵票是和身份證綁定的
  4. 高鐵票是限制日期和車次及座位号的
  5. 高鐵票隻能讓你坐高鐵,你在車站要吃KFC,還是要另外買的.
  6. 會有很多想自己做假票的
  7. 會有人想用假身份證和假錢買真票的

TGT(Ticket Granting Ticket)申領:

  1. Client向KDC發送TGT申請請求,會包含自己的使用者名等Client Info.
  2. KDC會先生成一個Session Key(SK-KC),從資料庫裡找到Client的Master key(CMK),用CMK加密SK-KC,生成第一個包;再拿出自己的Master Key(KMK),用KMK加密SK-KC+ClientInfo,生成第二個包(TGT).把這兩個包發還給Client.

    注意:TGT的内容Client無法讀取内容的, SK-KC是有時效的.

  3. Client 拿到加密包把TGT存好,再用自己的Master Key(CMK)解密到SK-KC存好.

ST(Session Ticket)申領:

  1. Client 建立Authenticator及要通路的Server名稱用SKC加密後連同TGT發給KDC
  2. KDC先用自己的Master Key(KMK)解密TGT,得到SKC+ClientInfo,再用SK-KC去解密另一個包,得到ClientInfo2和Server Name.
  3. 如果ClientInfo比對,生成一個用于Server和Client的Session Key(SK-CS),然後用CMK加密SK-CS生成一個包,SMK(Server Master Key)加密SK-CS和ClientInfo生成另一個包ST(Session Ticket),把兩個包都發給Client.
  4. Client 收到後用自己的Master Key(CMK)解密得到SK-CS.

Client 通路 Server:

  1. Client 建立Authenticator(ClientInfo3 + Timestamp)并用SK-CS對其加密,再把前面得到ST(Session Ticket)一起發給Server
  2. Server 用自己的Master Key(SMK)解密ST,得到SK-CS+ClientInfo3,再用SK-CS解密Authenticator得到ClientInfo+Timestamp.
  3. 如果ClientInfo比對且Timestamp和本地時間偏差在可接受範圍内,認證方通過.

整個流程可以看做:領身份證(TGT)–>憑身份證買票(ST)–> 檢票口驗票 --> 上車

第二部分:為Linux下的Apache 向Windows AD中注冊服務

還記得前面的内容中KDC怎麼生成Session Ticket的嗎?不在KDC裡注冊服務,KDC怎麼知道你的master key,還怎麼為你賣票?

在AD裡建立新使用者

使用Ktpass指令生成Keytab

ktpass:Configures the server principal name for the host or service in Active Directory Domain Services (AD DS) and generates a .keytab file that contains the shared secret key of the service. The .keytab file is based on the Massachusetts Institute of Technology (MIT) implementation of the Kerberos authentication protocol. The Ktpass command-line tool allows non-Windows services that support Kerberos authentication to use the interoperability features provided by the Kerberos Key Distribution Center (KDC) service in Windows Server 2008 R2.

翻譯過來就是用于在AD服務中為服務或主機配置服務主體名稱,并生成包含此服務的共享密鑰的keytab檔案.

此處的shared secret key就是我們前面提到的Server Master Key.

ktpass /princ HTTP/[email protected] /mapuser Sample1 /pass MyPas$w0rd /out server_HTTP.keytab 

           

不要試圖用同一個賬号為多台Server生成keytab.

似乎可以為賬号上增加SPN以支援vhost?找個時間驗證下.

将keytab 檔案複制到Linux主機,并在apache 配置檔案中指定認證方法

AuthType Kerberos
    AuthName "Kerberos Login"
    KrbMethodNegotiate On
    KrbMethodK5Passwd On
    KrbAuthRealms DOMAIN.COM
    Krb5KeyTab /etc/httpd/server_HTTP.keytab
    KrbServiceName HTTP/[email protected]
    require valid-user
           

配置Linux 主機的Kerberos 服務

[libdefaults]
 default_realm = DOMAIN.COM
 dns_lookup_realm = false
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 forwardable = yes

[realms]
 YOUNGOPTICS.COM = {
  kdc = 10.16.0.5:88
  kdc = 10.16.0.6:88
admin_server = 10.16.0.5:749
 default_realm = DOMAIN.COM
 }

[domain_realm]
server.domain.com = DOMAIN.COM
domain.com = DOMAIN.COM
           

繼續閱讀