Hướng dẫn cấu hình NFS Server và Client trên Linux an toàn với Kerberos

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bối cảnh & Vấn đề bảo mật của NFS

Hãy hình dung một cụm 5 máy chủ web cùng phải đọc ghi vào một kho media dung lượng 500GB. Lưu riêng trên từng máy thì lãng phí ổ cứng. Đồng bộ qua rsync liên tục thì nghẽn mạng và dễ lệch dữ liệu.

NFS giải quyết êm bài toán này. Nó cho phép gắn trực tiếp thư mục từ máy chủ từ xa về máy local. Ứng dụng đọc, ghi file qua mạng mà không nhận ra sự khác biệt nào so với ổ cứng gắn trong.

Dù vậy, giao thức NFS cổ điển tồn tại một rủi ro lớn. Ở chế độ sec=sys mặc định, server tin tuyệt đối vào IP và UID do client gửi sang. Kẻ tấn công chỉ cần cắm một laptop lạ vào switch nội bộ, gán IP trùng và tạo user root (UID 0) là đủ quyền xóa sạch toàn bộ dữ liệu chia sẻ.

Muốn an toàn, bạn buộc phải dùng NFSv4 kèm xác thực Kerberos (tùy chọn sec=krb5p). Cơ chế này mang lại hai lớp bảo vệ then chốt: bắt buộc xuất trình vé danh tính hợp lệ trước khi mount, đồng thời mã hóa toàn bộ dữ liệu truyền trên dây mạng bằng thuật toán AES để chặn đứng nguy cơ nghe lén gói tin.

Môi trường lab & Cài đặt

Mô hình thử nghiệm gồm hai máy Linux trong cùng dải mạng nội bộ:

  • NFS Server: 192.168.1.10 (hostname: nfs-server.lab.local)
  • NFS Client: 192.168.1.20 (hostname: nfs-client.lab.local)
  • KDC Domain: LAB.LOCAL

Lưu ý kỹ thuật sống còn: Kerberos sẽ từ chối mọi vé xác thực nếu hai máy lệch giờ quá 300 giây (5 phút). Hãy chắc chắn dịch vụ chrony hoặc systemd-timesyncd đang chạy đồng bộ chuẩn xác. Đồng thời, DNS xuôi và ngược (PTR record) của cả server lẫn client phải phân giải thông suốt.

1. Cài đặt trên NFS Server

Cập nhật repo và cài các gói dịch vụ cần thiết cho Ubuntu/Debian:

sudo apt update
sudo apt install -y nfs-kernel-server krb5-user

Với hạ tầng dùng RHEL hoặc AlmaLinux 9:

sudo dnf install -y nfs-utils krb5-workstation

2. Cài đặt trên Client

Thao tác cài đặt tương tự ở phía máy client:

# Ubuntu / Debian
sudo apt update
sudo apt install -y nfs-common krb5-user

# RHEL / AlmaLinux
sudo dnf install -y nfs-utils krb5-workstation

Cấu hình chi tiết

1. Tạo Principal Kerberos và xuất Keytab

Mỗi node cần một service principal dạng nfs/<FQDN>@REALM. Thông tin này được lưu vào file /etc/krb5.keytab để server và client tự xác thực lẫn nhau mà không cần gõ mật khẩu.

Khởi tạo principal trực tiếp trên máy chủ KDC:

# Tạo principal cho cả 2 máy
kadmin.local -q "addprinc -randkey nfs/[email protected]"
kadmin.local -q "addprinc -randkey nfs/[email protected]"

# Trích xuất keytab riêng biệt
kadmin.local -q "ktadd -k /tmp/server.keytab nfs/[email protected]"
kadmin.local -q "ktadd -k /tmp/client.keytab nfs/[email protected]"

Chuyển từng file keytab về thư mục /etc/krb5.keytab của đúng máy qua kênh SCP an toàn. Sau đó siết chặt quyền truy cập:

sudo chmod 600 /etc/krb5.keytab
sudo chown root:root /etc/krb5.keytab

Đồng bộ domain định danh NFSv4 trong file /etc/idmapd.conf trên cả hai máy:

[General]
Domain = lab.local

2. Cấu hình thư mục chia sẻ trên Server

Tạo thư mục lưu trữ thực tế và phân quyền đọc ghi:

sudo mkdir -p /srv/nfs_share/project_data
sudo chmod -R 775 /srv/nfs_share/project_data

Khai báo thư mục xuất bản trong file /etc/exports:

sudo nano /etc/exports

Ghi thêm dòng cấu hình sau:

/srv/nfs_share/project_data 192.168.1.0/24(rw,sync,no_subtree_check,sec=krb5p)

Ý nghĩa các tùy chọn cấu hình:

  • rw: Mở quyền đọc và ghi dữ liệu cho client.
  • sync: Chỉ phản hồi thành công sau khi dữ liệu đã nằm an toàn trên đĩa cứng vật lý. Tùy chọn này giảm nguy cơ hỏng file khi mất điện đột ngột.
  • no_subtree_check: Ngăn việc kiểm tra ngược phân cấp cây thư mục cha. File access nhờ đó phản hồi nhanh hơn đáng kể.
  • sec=krb5p: Mức bảo mật cao nhất (Privacy). Toàn bộ payload dữ liệu lẫn header gói tin đều được mã hóa AES xuyên suốt đường truyền.

Tải lại bảng export và khởi động service rpc-gssd làm cầu nối Kerberos:

sudo exportfs -rav
sudo systemctl restart rpc-gssd
sudo systemctl enable --now nfs-kernel-server

3. Gắn ổ đĩa (Mount) từ Client

Phía client bắt buộc phải bật tiến trình daemon rpc-gssd để xử lý vé Kerberos khi mount:

sudo systemctl enable --now rpc-gssd

Tạo mount point và tiến hành mount thủ công để kiểm tra:

sudo mkdir -p /mnt/shared_data
sudo mount -t nfs4 -o sec=krb5p nfs-server.lab.local:/srv/nfs_share/project_data /mnt/shared_data

Cấu hình tự động mount mỗi khi reboot bằng cách thêm vào /etc/fstab:

nfs-server.lab.local:/srv/nfs_share/project_data /mnt/shared_data nfs4 sec=krb5p,_netdev,rsize=1048576,wsize=1048576 0 0

Tùy chọn _netdev giúp hệ thống trì hoãn lệnh mount cho tới khi card mạng đã nhận IP. Không có cờ này, tiến trình khởi động của Linux rất dễ bị treo.

Cặp tham số rsize=1048576,wsize=1048576 (buffer 1MB) tạo ra khác biệt hiệu năng rất lớn. Thử nghiệm sao chép file nén tar 10GB qua mạng 1Gbps cho thấy: buffer mặc định chỉ đạt tốc độ 35-40 MB/s. Khi nâng buffer lên 1MB, throughput đạt ngưỡng trần 112 MB/s, bão hòa hoàn toàn băng thông đường truyền.

Kiểm tra & Giám sát hiệu năng

1. Xác minh quyền ghi và cơ chế vé Kerberos

Kiểm tra trạng thái phân vùng vừa mount:

df -hT /mnt/shared_data

Lấy vé TGT cho tài khoản kỹ thuật và ghi file kiểm tra:

# Xin cấp vé Kerberos cho user cá nhân
kinit [email protected]

# Thao tác ghi file lên thư mục mạng
echo "NFS Kerberos testing OK" > /mnt/shared_data/test_sync.txt
cat /mnt/shared_data/test_sync.txt

Hủy vé bằng lệnh kdestroy rồi thử sửa file trên. Hệ thống sẽ báo lỗi Permission denied ngay lập tức. Điều này chứng minh dữ liệu được bảo vệ chặt chẽ bằng phiên vé Kerberos thực tế, không dựa vào IP thuần túy.

2. Theo dõi I/O và độ trễ qua nfsstat và nfsiostat

Kiểm tra tổng số lượng request RPC và hiệu quả bộ nhớ đệm cache:

nfsstat -s   # Xem thống kê phía Server
nfsstat -c   # Xem thống kê phía Client

Cài đặt gói sysstat trên client để sử dụng công cụ nfsiostat:

nfsiostat 2 5

Lệnh trên thu thập số liệu mỗi 2 giây và hiển thị 5 chu kỳ đo. Ba chỉ số bạn cần đặc biệt quan tâm:

  • ops/s: Số lượng request đọc/ghi trong một giây.
  • kB/s: Lưu lượng dữ liệu thực tế đẩy qua card mạng.
  • avg RTT (Round Trip Time): Thời gian từ lúc client gửi request RPC tới khi server phản hồi xong.

Nếu avg RTT vượt ngưỡng 20ms đối với mạng LAN, hệ thống lưu trữ đang quá tải I/O đĩa hoặc switch mạng có hiện tượng drop packet. Bạn nên kiểm tra lại chỉ số I/O wait trên server bằng iostat -xz 1 để khoanh vùng nút thắt cổ chai.

Share: