Giao thức Kerberos

**Kerberos** là một giao thức mật mã dùng để xác thực trong các mạng máy tính hoạt động trên những đường truyền không an toàn. Giao thức Kerberos có khả năng chống lại việc nghe lén hay gửi lại các gói tin cũ và đảm bảo tính toàn vẹn của dữ liệu. Mục tiêu khi thiết kế giao thức này là nhằm vào mô hình máy chủ-máy khách (*client-server*) và đảm bảo nhận thực cho cả hai chiều.

Giao thức được xây dựng dựa trên mật mã hóa khóa đối xứng và cần đến một bên thứ ba mà cả hai phía tham gia giao dịch tin tưởng.

## Lịch sử phát triển
Học viện kỹ thuật Massachusetts (MIT) phát triển Kerberos để bảo vệ các dịch vụ mạng cung cấp bởi dự án Athena. Tên của giao thức được đặt theo tên của con chó ba đầu Cerberus canh gác cổng địa ngục trong thần thoại Hy Lạp. Giao thức đã được phát triển dưới nhiều phiên bản, trong đó các phiên bản từ 1 đến 3 chỉ dùng trong nội bộ MIT.

Các tác giả chính của phiên bản 4, Steve Miller và Clifford Neuman, đã xuất bản giao thức ra công chúng vào cuối thập niên 1980, mặc dù mục đích chính của họ là chỉ phục vụ cho dự án Athena.

Phiên bản 5, do John Kohl và Clifford Neuman thiết kế, xuất hiện trong tài liệu RFC 1510 vào năm 1993 (được thay thế bởi RFC 4120 vào năm 2005) với mục đích sửa các lỗi của phiên bản 4.

MIT đã cung cấp các phiên bản thực hiện Kerberos miễn phí dưới giấy phép tương tự như dùng cho các sản phẩm BSD.

Chính phủ Hoa Kỳ đã cấm xuất khẩu Kerberos vì nó có sử dụng thuật toán DES 56 bit. Tuy nhiên, trước khi chính sách xuất khẩu của Hoa Kỳ thay đổi (2000), đã có phiên bản KTH-KRB  viết tại Thụy Điển thực hiện Kerberos 4 được phân phối rộng rãi bên ngoài Hoa Kỳ. Phiên bản này được dựa trên một phiên bản khác có tên là eBones. eBones lại dựa trên một phiên bản được xuất khẩu của MIT thực hiện Kerberos 4 (patch-level 9) gọi là Bones (loại bỏ các hàm mật mã và các lệnh gọi chúng). Eric Young, một lập trình viên người Australia, đã phục hồi lại các lệnh gọi hàm và sử dụng các hàm mật mã trong thư viện của anh ta. Một phiên bản khác thực hiện Kerberos 5, Heimdal , cũng được thực hiện bởi nhóm đã xuất bản KTH-KRB.

Các hệ điều hành Windows 2000, Windows XP và Windows Server 2003 sử dụng một phiên bản thực hiện Kerberos làm phương pháp mặc định để nhận thực. Những bổ sung của Microsoft vào bộ giao thức Kerberos được đề cập trong tài liệu RFC 3244 ("Microsoft Windows 2000 Kerberos Change Password and Set Password Protocols"). Hệ điều hành Mac OS X cũng sử dụng Kerberos trong các phiên bản máy khách và máy chủ của mình.

Năm 2005, nhóm làm việc IETF về Kerberos cập nhật các đặc điểm kỹ thuật tại địa chỉ http://www.ietf.org/html.charters/krb-wg-charter.html. Các cập nhật gần đây bao gồm:
* RFC 3961: "Các quy định về mật mã hóa và kiểm tra tổng";
* RFC 3962: "Mật mã hóa AES cho Kerberos 5";
* RFC 4120: Phiên bản mới về tiêu chuẩn Kerberos V5: "The Kerberos Network Authentication Service (V5)". Phiên bản này thay thế RFC 1510, làm rõ các vấn đề của giao thức và cách sử dụng;
* RFC 4121: Phiên bản mới của tiêu chuẩn GSS-API: "Cơ cấu GSS-API của Kerberos Version 5: Version 2."

## Nguyên tắc hoạt động
Kerberos được thiết kế dựa trên giao thức Needham-Schroeder. Kerberos sử dụng một bên thứ ba tham gia vào quá trình nhận thực gọi là "trung tâm phân phối khóa" (tiếng Anh: *key distribution center* - KDC). KDC bao gồm hai chức năng: "máy chủ xác thực" (*authentication server* - AS) và "máy chủ cung cấp vé" (*ticket granting server* - TGS). "Vé" trong hệ thống Kerberos chính là các chứng thực chứng minh tính hợp lệ của người sử dụng.

Mỗi người sử dụng (cả máy chủ và máy khách) trong hệ thống chia sẻ một khóa chung với máy chủ Kerberos. Việc sở hữu thông tin về khóa chính là bằng chứng để chứng minh tính hợp lệ của một người sử dụng. Trong mỗi giao dịch giữa hai người sử dụng trong hệ thống, máy chủ Kerberos sẽ tạo ra một khóa phiên dùng cho phiên giao dịch đó.

## Ứng dụng của Kerberos
Các phần mềm sau có thể dùng Kerberos để nhận thực:
* OpenSSH (với Kerberos v5 hoặc cao hơn)
* NFS (kể từ NFSv3)
* PAM (với mô đun pam_krb5)
* SOCKS (kể từ SOCKS5)
* Apache (với mô đun mod_auth_kerb)
* Dovecot IMAP4 và POP3
* Một cách gián tiếp, tất cả phần mềm sử dụng SASL để nhận thực, chẳng hạn như OpenLDAP
* Bộ Kerberos còn đi kèm với các bộ phần mềm máy chủ và máy khách của rsh, FTP và Telnet
* Hệ thống X Window

## Mô tả giao thức
Theo hệ thống ký hiệu giao thức mật mã, Kerberos được mô tả như sau (trong đó *Alice* (*A*) sử dụng *máy chủ* (*S*) để nhận thực với *Bob* (*B*)):

* A \rightarrow S: A,B
* S \rightarrow A: \{T_S, L, K_{AB}, B, \{T_S, L, K_{AB}, A\}_{K_{BS}}\}_{K_{AS}}
* A \rightarrow B: \{T_S, L, K_{AB}, A\}_{K_{BS}}, \{A, T_A\}_{K_{AB}}
* B \rightarrow A: \{T_A + 1\}_{K_{AB}}

An ninh của giao thức phụ thuộc rất nhiều vào các trường T (đánh dấu thời điểm) và L (thời hạn) của các gói tin. Đây chính là các chỉ thị về tính chất mới của các gói tin và chống lại các tấn công gửi lại các gói tin cũ (xem thêm: Lô gic BAN).

Trong các bản tin ở trên, máy chủ S bao gồm cả dịch vụ nhận thực và cung cấp vé. Trong gói tin \{T_S, L, K_{AB}, B, \{T_S, L, K_{AB}, A\}_{K_{BS}}\}_{K_{AS}}, K_{AB} chính là khóa phiên giữa A và B; \{T_S, L, K_{AB}, A\}_{K_{BS}} là vé gửi từ máy khách tới máy chủ; \{A, T_A\}_{K_{AB}} là phần để nhận thực A với B; và \{T_A + 1\}_{K_{AB}} để khẳng định lại nhân dạng của B và thông qua đó chấp nhận A. Điều này cần thiết để hai bên nhận dạng lẫn nhau.

## Hoạt động
Sau đây là mô tả một phiên giao dịch (giản lược) của Kerberos. Trong đó: AS = Máy chủ chứng thực (*authentication server*), TGS = Máy chủ cấp vé (*ticket granting server*), SS = Máy chủ dịch vụ (*service server*).

Một cách vắn tắt: người sử dụng chứng thực mình với máy chủ chứng thực AS, sau đó chứng minh với máy chủ cấp vé TGS rằng mình đã được chứng thực để nhận vé, cuối cùng chứng minh với máy chủ dịch vụ SS rằng mình đã được chấp thuận để sử dụng dịch vụ.

# Người sử dụng nhập tên (ID) và mật khẩu tại máy tính của mình (máy khách).
# Phần mềm máy khách thực hiện hàm băm một chiều trên mật khẩu nhận được. Kết quả sẽ được dùng làm khóa bí mật của người sử dụng.
# Phần mềm máy khách gửi một gói tin (không mã hóa) tới máy chủ dịch vụ AS để yêu cầu dịch vụ. Nội dung của gói tin đại ý: "người dùng XYZ muốn sử dụng dịch vụ". Cần chú ý là cả khóa bí mật lẫn mật khẩu đều không được gửi tới AS.
# AS kiểm tra định danh của người yêu cầu có nằm trong cơ sở dữ liệu của mình không. Nếu có thì AS gửi 2 gói tin sau tới người sử dụng:
#* Gói tin A: "Khóa phiên TGS/máy khách" được mã hóa với khóa bí mật của người sử dụng.
#* Gói tin B: "Vé chấp thuận" (bao gồm chỉ danh người sử dụng (ID), địa chỉ mạng của người sử dụng, thời hạn của vé và "Khóa phiên TGS/máy khách") được mã hóa với khóa bí mật của TGS.
# Khi nhận được 2 gói tin trên, phần mềm máy khách giải mã gói tin A để có khóa phiên với TGS. (Người sử dụng không thể giải mã được gói tin B vì nó được mã hóa với khóa bí mật của TGS). Tại thời điểm này, người dùng có thể nhận thực mình với TGS.
# Khi yêu cầu dịch vụ, người sử dụng gửi 2 gói tin sau tới TGS:
#* Gói tin C: Bao gồm "Vé chấp thuận" từ gói tin B và chỉ danh (ID) của yêu cầu dịch vụ.
#* Gói tin D: Phần nhận thực (bao gồm chỉ danh người sử dụng và thời điểm yêu cầu), mã hóa với "Khóa phiên TGS/máy khách".
# Khi nhận được 2 gói tin C và D, TGS giải mã D rồi gửi 2 gói tin sau tới người sử dụng:
#* Gói tin E: "Vé" (bao gồm chỉ danh người sử dụng, địa chỉ mạng người sử dụng, thời hạn sử dụng và "Khóa phiên máy chủ/máy khách") mã hóa với khóa bí mật của máy chủ cung cấp dịch vụ.
#* Gói tin F: "Khóa phiên máy chủ/máy khách" mã hóa với "Khóa phiên TGS/máy khách".
# Khi nhận được 2 gói tin E và F, người sử dụng đã có đủ thông tin để nhận thực với máy chủ cung cấp dịch vụ SS. Máy khách gửi tới SS 2 gói tin:
#* Gói tin E thu được từ bước trước (trong đó có "Khóa phiên máy chủ/máy khách" mã hóa với khóa bí mật của SS).
#* Gói tin G: phần nhận thực mới, bao gồm chỉ danh người sử dụng, thời điểm yêu cầu và được mã hóa với "Khóa phiên máy chủ/máy khách".
# SS giải mã "Vé" bằng khóa bí mật của mình và gửi gói tin sau tới người sử dụng để xác nhận định danh của mình và khẳng định sự đồng ý cung cấp dịch vụ:
#* Gói tin H: Thời điểm trong gói tin yêu cầu dịch vụ cộng thêm 1, mã hóa với "Khóa phiên máy chủ/máy khách".
# Máy khách giải mã gói tin xác nhận và kiểm tra thời gian có được cập nhật chính xác. Nếu đúng thì người sử dụng có thể tin tưởng vào máy chủ SS và bắt đầu gửi yêu cầu sử dụng dịch vụ.
# Máy chủ cung cấp dịch vụ cho người sử dụng.

## Nhược điểm
* Tồn tại một điểm yếu: Nếu máy chủ trung tâm ngừng hoạt động thì mọi hoạt động sẽ ngừng lại. Điểm yếu này có thể được hạn chế bằng cách sử dụng nhiều máy chủ Kerberos.
* Giao thức đòi hỏi đồng hồ của tất cả những máy tính liên quan phải được đồng bộ. Nếu không đảm bảo điều này, cơ chế nhận thực giữa trên thời hạn sử dụng sẽ không hoạt động. Thiết lập mặc định đòi hỏi các đồng hồ không được sai lệch quá 10 phút.
* Cơ chế thay đổi mật khẩu không được tiêu chuẩn hóa.

## Xem thêm
* Giao thức Needham-Schroeder
* Đăng nhập một lần
* SPNEGO
* S/Key
* SRP

## Liên kết ngoài
* Trang về Kerberos tại MIT
* Bộ Tư pháp Hoa Kỳ tìm ra những chứng cứ chứng tỏ Microsoft cố tính phá vỡ tính tương thích của Kerberos
* Giải thích Kerberos bằng hình ảnh 
* "The Moron's Guide to Kerberos" 
* Câu hỏi thường gặp về Kerberos
* trang về Kerberos của Heimdal  tại KTH
* Shishi, phiên bản thực thi Kerberos miễn phí của hệ thống GNU
* Thiết kế một hệ thống nhận thực: Vở kịch bốn màn. Kịch vui miêu tả quá trình thiết kế Kerberos
* Dịch vụ nhận thực mạng Kerberos (V5)
* Mô tả Kerberos 5 trong thư viện SPORE
* Kerberos trong Windows Server 2003

## Tham khảo

* B. Clifford Neuman and Theodore Ts'o, *Kerberos: An Authentication Service for Computer Networks*, IEEE Communications, 32(9) pp33–38. tháng 9 năm 1994. http://gost.isi.edu/publications/kerberos-neuman-tso.html
* John T. Kohl, B. Clifford Neuman, and Theodore Y. T'so, *The Evolution of the Kerberos Authentication System*. Distributed Open Systems, pp78–94. IEEE Computer Society Press, 1994. [ftp://athena-dist.mit.edu/pub/kerberos/doc/krb_evol.PS] (Postscript format)