(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Omarine Native Directory (OND): Trung tâm khóa mật mã MIT Kerberos 5

Dịch vụ thư mục đã được ứng dụng rộng rãi. Điển hình là Active Directory của Microsoft, và gần gũi với hệ thống mở là Samba trong vai trò AD DC. Samba là một phần mềm khá tốt và đang được cải tiến mạnh mẽ. Tuy nhiên, nó có một số hạn chế sau đây:

  • Samba là một tầng dịch vụ chèn vào hệ thống, và hệ thống liên lạc với thế giới bên ngoài thông qua nó. Như vậy, Samba không tận dụng đầy đủ nguồn lực của hệ thống cũng như hệ thống không hiểu biết cặn kẽ về nó. Người dùng (user) Samba và người dùng địa phương là riêng biệt. Công cụ samba-tool không nhận thức về người dùng địa phương. Cũng vậy, lệnh getent passwd của hệ thống không liệt kê người dùng Samba. Người dùng địa phương khi cần liên lạc bảo mật phải mượn vé (kerberos) của người dùng Samba. Điều đó dẫn đến dư thừa tài khoản người dùng và không phối hợp đầy đủ trong việc sử dụng tài nguyên của hệ thống. Sự chia sẻ file và thư mục đối với người dùng và nhóm trở nên phức tạp do tồn tại song hành hai loại người dùng đó.

  • Do không phải là bộ phận bản thể của hệ thống, Samba yêu cầu ràng buộc đối với hệ thống, làm mất đi một số tính năng của hệ thống. Chẳng hạn khi sử dụng zone tải động cho máy chủ tên miền (là biện pháp tốt nhất cho Samba), Samba yêu cầu named (daemon dịch vụ tên miền – DNS) không được chroot vào môi trường của mình, làm cho toàn thể hệ thống không được an toàn như ý muốn. Lý do là vì trong môi trường chroot, named không nhận thức được đường dẫn tới plugins ở bên ngoài.

  • Cách đây vài tháng, Samba 4.6 va chạm với trung tâm khóa mật mã MIT Kerberos 5 (kdc) của hệ thống. Các phương thức liên lạc bảo mật khác như ssh sử dụng kerberos không hoạt động được như thường lệ. Vấn đề này hiện nay đã được khắc phục, các phiên bản Samba 4.7 đã có tính năng sử dụng MIT Kerberos hệ thống thay cho Heimdal Kerberos nối cứng bên trong Samba.

Tại sao Omarine Native Directory?

Omarine Native Directory (OND) là một mô hình dịch vụ thư mục sử dụng biện pháp an ninh mật mã tiên tiến, kết hợp các bộ phận tự nhiên của hệ thống và do đó không gây ra bất kỳ sự va chạm nào. OND sử dụng các bộ phận phần mềm và kỹ thuật dưới đây:

  1. Named

    Là DNS server, cung cấp tên miền cho các dịch vụ khác.

  2. MIT Kerberos 5

    Quản lý và phân phối khóa mật mã.

  3. Openldap

    Thi hành giao thức truy cập thư mục hạng nhẹ.

  4. NFSv4

    hệ thống file mạng phiên bản 4. Các máy tính sử dụng OND sẽ ở trong miền nfsv4. Chia sẻ sử dụng các hương vị an ninh mật mã krb5, krb5i, krb5p.

  5. Nfs4-acl-tools

    Công cụ danh sách điều khiển truy cập cho nfsv4.

  6. Cyrus SASL

    Là tầng an ninh xác minh đơn giản, phục vụ ldap và có liên quan tới các dịch vụ khác.

  7. OpenSSL

    Bộ công cụ cho các giao thức tầng socket bảo mật và an ninh tầng vận tải. OpenSSL được chọn để tạo các chứng chỉ CA, chứng chỉ server và chứng chỉ khách trong OND.

  8. TLS

    Giao thức an ninh tầng vận tải, được chọn cho kỹ thuật EXTERNAL của ldap.

  9. GSSAPI

    Được chọn cho kỹ thuật GSSAPI của ldap với kerberos 5.

  10. Nss-ldap

    Cung cấp thông tin tài khoản người dùng và nhóm thông qua ldap, và các thông tin khác theo nhu cầu.

  11. Nscd

    Cache yêu cầu dịch vụ tên như passwd, group, vv.

  12. Một số kỹ thuật khác tùy theo nhu cầu của người sử dụng.

Giải pháp xây dựng mô hình dịch vụ từ các bộ phận cấu thành của hệ điều hành làm cho hệ thống có khả năng tự cường, vừa tận dụng các đặc tính truyền thống của một hệ Unix, vừa tiếp nhận các kỹ thuật tiên tiến. Các phần mềm bộ phận không chịu sự ràng buộc nào để sẵn sàng cho cập nhật tới phiên bản mới nhất.

Các thông tin thực hành

Trong một loạt bài về OND, chúng ta sẽ sử dụng các thông số dưới đây cho các ví dụ và hình minh họa. Trong đó omarine.org là tên của một miền địa phương. Các ví dụ đều lấy từ kết quả chạy thực tế. Chúng ta sử dụng hai máy, máy chủ tên là omarine, máy khách là toshi.

  • Miền dns: omarine.org

  • Miền kerberos (krb5 realm): OMARINE.ORG

  • Miền nfsv4: nfsv4.omarine.org

  • Máy chủ kdc: omarine.omarine.org

  • Máy chủ ldap: omarine.omarine.org

    Các máy chủ có thể là khác nhau, nhưng vì chỉ có một máy làm máy chủ nên chúng ta chỉ dùng omarine chung cho các server. Có một khía cạnh kỹ thuật đáng bàn ở đây đối với kdc và ldap: nếu kdc sử dụng ldapi:/// thì nó sẽ ở cùng máy với ldap và liên lạc thông qua socket miền Unix. Khi đó việc xây dựng mô hình sẽ đơn giản đi nhiều, kèm theo hạn chế đó. OND cho phép hai server này ở trên hai máy khác nhau. Kdc sử dụng ldaps://omarine.omarine.org, do đó ldap có thể ở trên máy khác với kdc (thay omarine.omarine.org bằng tên miền đầy đủ của máy chủ ldap).

  • Máy chủ nfs: omarine.omarine.org

  • Máy chủ named: omarine.omarine.org

  • IP của omarine.omarine.org: 192.168.0.1

  • Máy khách: toshi.omarine.org

  • IP của máy khách: 192.168.0.13

    Máy khách được cấp IP tự động và được cập nhật hostname tự động vào máy chủ dns bằng liên lạc bảo mật với cặp hdcpd và dhclient.

  • Quản trị hệ thống: root, và các người sử dụng trong nhóm wheel. root đồng thời quản trị nfs.

  • Quản trị kerberos: root/admin

  • Quản trị ldap: admin

  • Người sử dụng địa phương: tho

  • Người sử dụng mạng: emin. emin có tài khoản để trong máy chủ ldap, không nằm trong các tệp /etc/passwd và /etc/shadow địa phương.

  • Chính sách mật khẩu: dict

MIT Kerberos 5

Tường lửa trong vai trò kiểm soát IP và cổng đã trở nên lỗi thời với tấn công IP spoofing. Kerberos là giao thức xác minh trên mạng không tin cậy, do đó nó phù hợp nhất với Internet. Hiện nay kerberos có mặt trong hầu hết các hệ thống an ninh an toàn, trong đó MIT Kerberos 5 là thi hành tốt nhất. Như đã nêu trên, Samba cũng vừa mới chuyển sang sử dụng MIT Kerberos 5 (MIT krb5). Phần này trình bày cách cấu hình và sử dụng krb5 theo cách thông thường.

Bạn tạo tệp cấu hình /var/lib/krb5kdc/kdc.conf cho kdc có nội dung như sau:

# Begin /var/lib/krb5kdc/kdc.conf

[kdcdefaults]
    kdc_listen = 88
    kdc_tcp_listen = 88
[realms]
    OMARINE.ORG = {
        kadmind_port = 749
        max_life = 12h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        dict_file = /usr/share/dict/words
        supported_enctypes = aes256-cts-hmac-sha1-96:normal aes128-cts-hmac-sha1-96:normal des3-cbc-sha1:normal arcfour-hmac:normal
    }
[logging]
    kdc = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmin.log
    default = FILE:/var/log/krb5lib.log

# End /var/lib/krb5kdc/kdc.conf

Tệp cấu hình /etc/krb5.conf dành cho cấu hình khách. Chúng ta có máy chủ dns, và nếu không dùng dịch vụ kadmin thì không cần tệp krb5.conf.

Thay vào đó, bạn thêm các bản ghi như dưới đây vào cơ sở dữ liệu dns:

$ORIGIN omarine.org.
$TTL 86400 ; 1 day
_kerberos             TXT     "OMARINE.ORG"
                                               URI     10 1 "krb5srv:m:tcp:kerberos.omarine.org"
kerberos              CNAME   omarine
omarine               A       192.168.0.1

Nếu sử dụng kadmin, bạn tạo tệp cấu hình /etc/krb5.conf đơn giản là cho biết địa chỉ máy chủ kadmin, có nội dung như sau:

# Begin /etc/krb5.conf

[realms]
    OMARINE.ORG = {
        admin_server = kerberos.omarine.org
    }

# End /etc/krb5.conf

Thiết lập quyền truy cập acl

Tệp cấu hình /var/lib/krb5kdc/kadm5.acl dùng để chỉ định quyền truy cập vào cơ sở dữ liệu kerberos. Các dòng trống và dòng bắt đầu với dấu # được bỏ qua. Mỗi mục trên một dòng có dạng sau

principal permissions [target_principal [restrictions] ]

principal phải ở dạng tên đầy đủ, chỉ ra đối tượng nào được đặt phép. Mỗi bộ phận của tên có thể sử dụng dấu hoa thị (*) làm kí tự đại diện.

permissions qui định phép truy cập, là một xâu kí tự bao gồm một hay nhiều kí tự đưới đây, chữ thường là cho phép, chữ in hoa là không cho phép:

  • a

    [Không] cho phép thêm principal hoặc chính sách.

  • c

    [Không] cho phép thay đổi mật khẩu của các principal.

  • d

    [Không] cho phép xóa principal hoặc chính sách.

  • e

    [Không] cho phép trích xuất khóa mật mã của các principal.

    Lệnh con ktadd của kadmin bình thường không trích xuất khóa, nó thay đổi mật khẩu của principal mục tiêu và tạo ra một phiên bản mới ngẫu nhiên của khóa, rồi đưa khóa này vào bảng khóa. Như vậy lệnh này chỉ yêu cầu quyền thay đổi mật khẩu (c) và quyền đọc thông tin của principal mục tiêu (i). Nhưng nếu chúng ta dùng lệnh ktadd dạng kadmin: ktadd -norandkey principal thì mật khẩu không thay đổi, cũng không cần thông tin của principal mục tiêu nên các quyền c và i là không yêu cầu. Mặt khác khóa của principal giữ nguyên nên hoạt động này sẽ thực sự trích xuất khóa. Chỉ khi đó, quyền e là yêu cầu để thực hiện lệnh.

    Quyền e cần được sử dụng thận trọng để tránh làm lộ những khóa quan trọng như những khóa của các principal kadmin/* và krbtgt/*. Principal krbtgt/REALM@REALM dùng để cấp vé cấp vé cho khởi tạo phiên liên lạc của người sử dụng. Chi tiết này sẽ được trình bày bên dưới. Thuộc tính lockdown_keys của principal có thể được sử dụng để ngăn ngừa việc trích xuất khóa dù có mặt của quyền e.

  • i

    [Không] cho phép lấy thông tin về principal hoặc chính sách.

  • l

    [Không] cho phép xem danh sách principal hoặc chính sách.

  • m

    [Không] cho phép sửa đổi principal hoặc chính sách.

  • p

    [Không] cho phép truyền cơ sở dữ liệu (từ kdc chính tới kdc phụ).

  • s

    [Không] cho phép đặt khóa principal trực tiếp.

    Quyền này được yêu cầu khi gọi hàm kadm5_setkey_principal(void *, krb5_principal, krb5_keyblock *, int).

  • x

    Viết gọn của admcilps (bao gồm tất cả các quyền trừ quyền e).

  • *

    Giống như x.

target_principal là trường lựa chọn, viết dưới dạng tên ngắn hoặc tên đầy đủ của principal, chỉ ra principal mục tiêu mà phép áp dụng tới. Mỗi bộ phận của tên có thể là kí tự đại diện sử dụng dấu hoa thị (*). target_principal có thể bao gồm tham chiếu ngược tới principal được đặt phép, trong đó *number khớp * thứ number trong principal được đặt phép.

restrictions là trường lựa chọn, bao gồm một chuỗi cờ hạn chế, trong phạm vi dưới đây:

  • {+|-}tên_cờ

    Cờ được ép tới tên_cờ. Các cờ được phép sử dụng là giống như đối với biến default_principal_flags trong kdc.conf.

  • -clearpolicy

    Chính sách được ép tới rỗng.

  • -policy pol

    Chính sách được ép tới pol.

  • -{expire, pwexpire, maxlife, maxrenewlife} time

    Giá trị kết hợp được ép tới min(time, giá trị yêu cầu). time phải được viết trong định dạng kỳ hạn, ví dụ -expire 365d (không dùng định dạng getdate).

Các cờ hạn chế nếu có sẽ ảnh hưởng tới các hoạt động thêm và sửa đổi principal.

Thay đổi nội dung tệp cấu hình acl cần khởi động lại dịch vụ kadmin để có tác dụng, như sau:

systemctl restart kadmin

Tệp kadm5.acl thực hành có nội dung sau:

# Begin /var/lib/krb5kdc/kadm5.acl

*/admin@OMARINE.ORG    x     *    -expire 730d
tho@OMARINE.ORG        li
emin@OMARINE.ORG       li
root@OMARINE.ORG       lic

# End /var/lib/krb5kdc/kadm5.acl

Trên dòng cấu hình thứ nhất, các quản trị có mọi quyền, trừ e. Những pricipal do quản trị tạo ra bị hạn chế kỳ hạn 2 năm. Phần kỳ hạn được thêm vào so với thực hành để minh họa tính năng cấu hình, không ảnh hưởng gì tới kết quả hiện tại. Ở dòng 2 và 3, tho và emin có quyền xem danh sách và thông tin các principal. Dòng cuối cùng, root có quyền như tho và emin, và thêm quyền thay đổi mật khẩu của các pricipal.

Chúng ta bắt đầu tạo realm:

kdb5_util create -s

Sau đó chạy kadmin.local để thêm chính sách mật khẩu tên là dict, đây là chính sách sử dụng từ điển để kiểm tra mật khẩu yếu. Chính sách này được áp dụng ngay để tạo quản trị krb5 tên là root/admin. Hai lệnh đó trong dấu nhắc của kadmin.local như sau:

kadmin.local: addpol dict

kadmin.local: addprinc -policy dict root/admin

Dưới đây là hình ảnh thực hành quá trình tạo realm và quản trị

Nhập mật khẩu cho quản trị lần thứ nhất còn yếu và được yêu cầu nhập lại. Sau khi tạo xong quản trị root/admin, bạn gõ lệnh quit để thoát ra.

Chúng ta chuẩn bị quản trị krb5 bằng principal root/admin. Principal đại diện cho người sử dụng (user) hoặc dịch vụ. Tên đầy đủ có dạng

bộ_phận_1[/bộ_phận_2]@REALM

Tên ngắn gọn có thể bỏ qua @REALM đối với realm mặc định, trừ khi có yêu cầu cụ thể. Khi thuộc loại user, bộ_phận_1 là tên user, bộ_phận_2 nếu có biểu thị vai trò của user. root/admin dành cho root với vai trò quản trị. Tên đầy đủ của nó trong ví dụ là root/admin@OMARINE.ORG.

Đối với principal loại dịch vụ, bộ_phận_1 là tên dịch vụ, bộ_phận_2 thường là tên máy (hostname) đầy đủ. Sử dụng dịch vụ nào là do yêu cầu liên lạc xác định, do thỏa thuận giữa phần mềm server và khách hoặc qui định bởi hai đầu liên lạc nói chung mà áp dụng kỹ thuật GSSAPI để xác minh. Một kdc cần có dịch vụ host để xác minh máy như chúng ta sẽ tạo ra host/omarine.omarine.org bên dưới. Chúng ta cũng sẽ tạo ldap/omarine.omarine.org cho ldap, nfs/omarine.omarine.org cho máy chủ nfsv4, nfs/toshi.omarine.org cho máy khách nfsv4 trong các bài sau.

Trường hợp ngoại lệ với ví dụ điển hình là krbtgt/REALM@REALM dùng để mã hóa vé cấp vé (TGT – Ticket Granting Ticket). TGT là cơ sở để kdc (cụ thể là TGS – Ticket Granting Server, một bộ phận của kdc) cấp vé dịch vụ đối với principal dịch vụ tương ứng. Cấp vé là một hoạt động cơ bản của kdc, ý nghĩa của TGT là dùng vé TGT để cấp vé khác. Vé được coi như giấy xác nhận của khách để sử dụng dịch vụ. Chẳng hạn thông tin chính của TGT bao gồm

  • Principal khách.

  • krbtgt/REALM@REALM.

  • Danh sách các địa chỉ IP mà sử dụng vé (nó có thể là rỗng – không hạn chế, hoặc là danh sách các địa chỉ IP của các giao diện mạng của máy khách).

  • Thời điểm vé có hiệu lực.

  • Thời hạn vé.

  • Khóa phiên.

Tuy nhiên, người sử dụng không nhận được vé như thế. Nó được mã hóa bằng khóa của TGS, và người sử dụng được yêu cầu vào mật khẩu (hoặc biện pháp xác minh khác). Khi xác minh đạt yêu cầu, quá trình giải mã được tiến hành, khóa phiên được trích xuất và TGT (vẫn còn dạng mã hóa và chỉ mở bởi TGS sau đó khi có yêu cầu dịch vụ tới phần mềm server cụ thể) được chứa trong cache giấy xác nhận của người sử dụng.

TGS là một server cấp vé dịch vụ. Nhưng bản thân nó cũng là một dịch vụ và principal dịch vụ của nó chính là krbtgt/REALM@REALM. Khi người sử dụng chạy kinit để yêu cầu TGT, TGT được mã hóa bằng khóa của dịch vụ yêu cầu, trong trường hợp này là krbtgt/REALM@REALM, chính là khóa của TGS. Tuy nhiên, TGT được cấp bởi server bộ phận khác của kdc, là server xác thực (AS – Authentication Server).

Ví dụ khác về principle đặc biệt là K/M@REALM, dùng để mã hóa cơ sở dữ liệu của kdc.

Để sử dụng root/admin chúng ta khởi động hai dịch vụ hệ thống kdc và kadmin, rồi chạy lệnh kadmin:

systemctl enable kdc

systemctl enable kadmin

systemctl start kdc

systemctl start kadmin

kadmin

Chúng ta tạo các principal tho, emin, root; xem danh sách các principal, xem thông tin về emin. Các lệnh con của kadmin như sau:

kadmin:  addprinc -policy dict tho
kadmin:  addprinc -policy dict emin
kadmin:  addprinc -policy dict root
kadmin:  listprincs
kadmin:  getprinc emin

Và dưới đây là hình ảnh đầy đủ

Sau cùng, chúng ta tạo thêm principal host/omarine.omarine.org dùng cho dịch vụ host, rồi thêm nó vào bảng khóa /etc/krb5.keytab:

kadmin:  addprinc -randkey host/omarine.omarine.org
kadmin:  ktadd host/omarine.omarine.org

Bây giờ bạn đã sẵn sàng để sử dụng krb5. Người dùng xin cấp vé bằng lệnh kinit, xem vé bằng lệnh klist và hủy vé bằng lệnh kdestroy. Người dùng bình thường cũng có thể quản trị trong quyền hạn của mình được chỉ định trong acl.

Bài này đã giới thiệu cách thiết lập một miền kerberos cơ bản. Sau các bài về ldap và tạo chứng chỉ chúng ta sẽ thiết kế krb5 để sử dụng ldap như một nguồn cơ sở dữ liệu.

Advertisements

Gửi phản hồi

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.

%d bloggers like this: