Cách sử dụng Kerberos để kiểm soát quyền truy cập vào chia sẻ mạng NFS

Tác giả sysadmin, T.M.Hai 29, 2022, 03:24:08 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách sử dụng Kerberos để kiểm soát quyền truy cập vào chia sẻ mạng NFS


Theo mặc định, NFS không an toàn lắm, không có xác thực thực sự và quyền truy cập được cấp dựa trên tên máy chủ hoặc địa chỉ IP, thông tin được gửi qua mạng ở dạng văn bản thuần túy và việc giả mạo UID/GID của bạn cũng khá dễ dàng.

Bằng cách sử dụng Kerberos, chúng tôi có thể bảo mật NFS vì điều này cung cấp xác thực, mã hóa và tính toàn vẹn.

1. Môi trường ví dụ

Đây là danh sách các máy chủ của chúng tôi mà chúng tôi sẽ thử nghiệm, cả hai đều đang chạy CentOS 7.

  • Máy chủ Kerberos (KDC): 192.168.1.13 – Máy chủ Linux này sẽ đóng vai trò là KDC của chúng tôi và phân phối vé Kerberos. Nó cũng là máy chủ NFS của chúng tôi.
  • Máy khách Kerberos: 192.168.1.14 – Máy khách Linux này sẽ yêu cầu vé Kerberos từ KDC. Nó cũng là ứng dụng khách NFS của chúng tôi và sẽ gắn kết từ máy chủ ở trên.

2. Điều kiện tiên quyết

Để Kerberos hoạt động chính xác, trước tiên phải định cấu hình các mục sau trên cả hai máy chủ.

  • Để sử dụng Kerberos cho NFS, trước tiên chúng ta phải thiết lập KDC với một khách hàng đã tham gia vào lĩnh vực này.
  • Bạn cũng đã có một thiết lập máy khách và máy chủ NFS đang hoạt động.
  • Cả máy chủ và máy khách đều phải cài đặt gói 'nfs-utils'.

3. Thiết lập máy chủ

Trong ví dụ này, cả máy chủ NFS và KDC đều đang chạy trên cùng một hệ thống CentOS 7. Chúng tôi giả định rằng bạn đã thiết lập máy chủ KDC và NFS tại đây, nếu bạn cần thực hiện việc này, hãy xem các liên kết trong phần điều kiện tiên quyết.

Ngoài thông tin được cung cấp trong bài đăng NFS được liên kết ở trên, một số dịch vụ bổ sung cần được kích hoạt và bắt đầu hỗ trợ Kerberos, cụ thể là 'nfs-secure-server'.

Mã nguồn [Chọn]
systemctl enable nfs-secure-server nfs-server
systemctl start nfs-secure-server nfs-server

Nếu bạn gặp bất kỳ lỗi nào khi bật hoặc khởi động một trong hai dịch vụ này, hãy thử thực hiện lại từ đầu khi mọi thứ đã được định cấu hình hoàn chỉnh.

Với điều đó, chúng ta cần sửa đổi bản xuất NFS của mình trong /etc/exports để chỉ định tùy chọn Kerberos.

Mã nguồn [Chọn]
/opt/mnt 192.168.1.14(rw,sec=krb5p)
Như được hiển thị, tùy chọn Kerberos có thể được chỉ định bằng tùy chọn 'sec', danh sách bên dưới phác thảo các tùy chọn khả dụng.

  • sys: Đây là tùy chọn mặc định và nó tin cậy UID/GID do khách hàng gửi. Các quyền Linux tiêu chuẩn được sử dụng, UID/GID của máy khách NFS được ánh xạ tới cùng một quyền trên máy chủ, điều này có thể không lý tưởng vì bạn có thể nhận được một số UID/GID người dùng khác.
  • krb5: Tùy chọn này chỉ cung cấp xác thực, danh tính khách hàng được xác nhận bằng tệp keytab Kerberos.
  • krb5i: Ngoài mọi thứ mà tùy chọn krb5 cung cấp, tùy chọn này cũng cung cấp tính toàn vẹn cho liên lạc.
  • krb5p: Ngoài mọi thứ mà tùy chọn krb5i cung cấp, tùy chọn này cũng cung cấp mã hóa. Có thể có một tác động hiệu suất nhỏ ở đây do chi phí chung, tuy nhiên đây là tùy chọn an toàn nhất.

Bây giờ trên máy chủ KDC, chúng ta sẽ sử dụng   Đăng nhập để xem liên kết và tạo các nguyên tắc máy chủ và nfs cho cả máy chủ và máy khách NFS. Trong ví dụ này, KDC cũng đóng vai trò là máy chủ NFS, đó là lý do tại sao chúng tôi tạo nguyên tắc máy chủ/nfs cho   Đăng nhập để xem liên kết

Mã nguồn [Chọn]
[root@kdc ~]# kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:  addprinc -randkey host/kdc.example.com
WARNING: no policy specified for host/[email protected]; defaulting to no policy
Principal "host/[email protected]" created.
kadmin.local:  addprinc -randkey host/client.example.com
WARNING: no policy specified for host/[email protected]; defaulting to no policy
Principal "host/[email protected]" created.
kadmin.local:  addprinc -randkey nfs/kdc.example.com
WARNING: no policy specified for nfs/[email protected]; defaulting to no policy
Principal "nfs/[email protected]" created.
kadmin.local:  addprinc -randkey nfs/client.example.com
WARNING: no policy specified for nfs/[email protected]; defaulting to no policy
Principal "nfs/[email protected]" created.
kadmin.local:  addprinc -randkey nfs/kdc
WARNING: no policy specified for nfs/[email protected]; defaulting to no policy
Principal "nfs/[email protected]" created.

Bây giờ chúng ta sẽ tạo một tệp keytab cục bộ trên máy chủ NFS chứa các nguyên tắc cho KDC.

Mã nguồn [Chọn]
kadmin.local: ktadd nfs/kdc.example.com
Entry for principal nfs/kdc.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc.example.com with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.

kadmin.local:  ktadd host/kdc.example.com
Entry for principal host/kdc.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kdc.example.com with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.

kadmin.local:  ktadd nfs/kdc
Entry for principal nfs/kdc with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab.
Entry for principal nfs/kdc with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.

Tiếp theo, chúng tôi sẽ sử dụng 'ktadd -k' từ bên trong   Đăng nhập để xem liên kết để chỉ định tệp keytab để ghi vào, trong ví dụ này, chúng tôi tạo /root/client.keytab chứa các nguyên tắc máy chủ và nfs cho   Đăng nhập để xem liên kết và sau đó chuyển tệp này qua máy chủ của khách hàng.

Mã nguồn [Chọn]
[root@kdc ~]# kadmin.local
Authenticating as principal root/[email protected] with password.

kadmin.local:  ktadd -k /root/client.keytab host/client.example.com
Entry for principal host/client.example.com with kvno 3, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type des3-cbc-sha1 added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type arcfour-hmac added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type camellia256-cts-cmac added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type camellia128-cts-cmac added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type des-hmac-sha1 added to keytab WRFILE:/root/client.keytab.
Entry for principal host/client.example.com with kvno 3, encryption type des-cbc-md5 added to keytab WRFILE:/root/client.keytab.

kadmin.local:  ktadd -k /root/client.keytab nfs/client.example.com
Entry for principal nfs/client.example.com with kvno 5, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type des3-cbc-sha1 added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type arcfour-hmac added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type camellia256-cts-cmac added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type camellia128-cts-cmac added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type des-hmac-sha1 added to keytab WRFILE:/root/client.keytab.
Entry for principal nfs/client.example.com with kvno 5, encryption type des-cbc-md5 added to keytab WRFILE:/root/client.keytab.
kadmin.local:  quit

[root@kdc ~]# scp /root/client.keytab 192.168.1.14:/etc/krb5.keytab
[email protected]'s password:
client.keytab                                                                      100% 1226     1.2KB/s   00:00

4. Thiết lập ứng dụng khách

Bây giờ tệp keytab đã được đặt trên máy chủ của khách hàng, chúng ta có thể bắt đầu dịch vụ bảo mật nfs. Dịch vụ này đọc tệp keytab, đó là lý do tại sao chúng tôi đã sao chép tệp này trước khi khởi động.

Mã nguồn [Chọn]
systemctl enable nfs-secure
systemctl start nfs-secure

Tại thời điểm này, chúng tôi có thể chạy một số thử nghiệm cơ bản trên máy khách để xác nhận rằng chúng tôi có thể nhận được vé Kerberos với nguyên tắc nfs.

Mã nguồn [Chọn]
[root@client ~]# kinit -k -t /etc/krb5.keytab nfs/client.example.com
[root@client ~]# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: nfs/[email protected]

Valid starting       Expires              Service principal
06/11/2016 23:01:41  06/12/2016 23:01:41  krbtgt/[email protected]

Tuyệt vời để chúng tôi thực sự có thể nhận được vé. Tại thời điểm này, bạn nên khởi động lại các dịch vụ trên máy khách và máy chủ để đảm bảo mọi thứ đang chạy bình thường và được cập nhật. Nếu tôi không thực hiện các lần khởi động lại này, tôi nhận được lỗi "mount.nfs: truy cập bị máy chủ từ chối khi đang cài đặt 192.168.1.13:/opt/mnt" khi cố gắng cài đặt NFS.

Máy chủ:

Mã nguồn [Chọn]
[root@kdc ~]# systemctl restart nfs-server
[root@kdc ~]# systemctl restart nfs-secure-server

Máy khách:

Mã nguồn [Chọn]
[root@client ~]# systemctl restart nfs-secure
Bây giờ chúng ta có thể thực hiện gắn kết vào máy chủ NFS của mình như hình bên dưới. Cờ -o được sử dụng để chỉ định tùy chọn sec, lưu ý rằng tùy chọn này phải được đặt giống như những gì được xác định trong tệp /etc/exports trên máy chủ NFS.

Mã nguồn [Chọn]
[root@client ~]# mount -t nfs -o sec=krb5 192.168.1.13:/opt/mnt /mnt
[root@client ~]# df -h /mnt
Filesystem             Size  Used Avail Use% Mounted on
192.168.1.13:/opt/mnt   18G  4.3G   14G  25% /mnt

Lưu ý rằng không cần chạy kinit để giá đỡ hoạt động, bạn có thể kiểm tra điều này bằng cách chạy 'kdestroy' để hủy tất cả vé Kerberos, ngắt kết nối giá treo NFS rồi gắn lại.

Như được hiển thị, chúng tôi đã thực hiện thành công quá trình gắn kết NFS an toàn với Kerberos.

5. Xử lý sự cố

Dưới đây là một số vấn đề tôi gặp phải trong quá trình thực hiện và cách tôi giải quyết chúng.

5.1. Sự cố bàn phím

Khi cố gắn điểm gắn kết NFS, tôi đã gặp lỗi này:

Mã nguồn [Chọn]
[root@client ~]# mount -t nfs -o sec=krb5p 192.168.1.13:/opt/mnt /mnt
mount.nfs: access denied by server while mounting 192.168.1.13:/opt/mnt

Sau khi kiểm tra tệp nhật ký /var/log/krb5kdc.log, tôi tìm thấy mục sau:

Mã nguồn [Chọn]
-Jun 11 22:39:48 kdc.exmaple.com krb5kdc[12079](info): TGS_REQ (6 etypes {18 17 16 23 25 26}) 192.168.1.14: LOOKING_UP_SERVER: authtime 0,  nfs/[email protected] for nfs/[email protected], Server not found in Kerberos database
Tôi vẫn không chắc chắn chính xác lý do tại sao điều này xảy ra, tuy nhiên tôi đã sửa nó bằng cách quay lại   Đăng nhập để xem liên kết và thêm nguyên tắc nfs/kdc, tôi không chắc liệu nguyên tắc nfs/kdc.example.com của mình có bị bỏ qua hay cũng được yêu cầu hay không.

5.2. Đồng bộ hóa thời gian

Tại một thời điểm trong quá trình thử nghiệm của mình, tôi đã khôi phục một trong các máy ảo của mình về ảnh chụp nhanh trước đó, điều này đã phá vỡ thời gian của nó, tôi muốn chỉ ra điều này vì Kerberos yêu cầu thời gian của mỗi máy chủ phải cách nhau trong vòng 5 phút để hoạt động bình thường.

Đã tìm thấy thông báo lỗi sau trong tệp /var/log/krb5kdc.log sau khi cố gắng thực hiện quá trình gắn kết.

Mã nguồn [Chọn]
Jun 11 22:42:12 kdc.exmaple.com krb5kdc[12079](info): TGS_REQ (6 etypes {18 17 16 23 25 26}) 192.168.1.14: ISSUE: authtime 1465648677, etypes {rep=18 tkt=18 ses=18}, nfs/[email protected] for nfs/[email protected]
Điều này khá rõ ràng vì sự cố được ghi nhận là do 'thời gian xác thực', tôi nhận thấy rằng một trong các máy chủ của mình được đặt thành múi giờ AEST trong khi máy chủ kia là PDT, sau khi đặt cả hai vào cùng một thời điểm thì sự cố đã biến mất.

Chúng tôi đã đề cập đến cách sửa đổi máy chủ NFS của bạn để nó có thể hoạt động với KDC và sử dụng Kerberos để tăng tính bảo mật của chia sẻ NFS bằng cách cung cấp xác thực, tính toàn vẹn và mã hóa.