Cài đặt và Cấu hình Samba Server trên Linux: Chia sẻ File Nhanh và An toàn cho Client Windows

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

So sánh các giải pháp chia sẻ file từ Linux sang Windows

Chia sẻ file giữa máy chủ Linux và máy trạm Windows là tác vụ hàng ngày trong các môi trường đa hệ điều hành. Qua nhiều năm, các quản trị viên mạng đã dựa vào một số giao thức tiêu chuẩn, mỗi giao thức đều có những ưu và nhược điểm thực tế rõ ràng:

  • Samba (SMB/CIFS): Tiêu chuẩn thực tế (de facto) cho việc chia sẻ đa nền tảng. Windows Explorer có thể kết nối ngay lập tức mà không cần cài thêm bất kỳ phần mềm bên thứ ba nào. Giao thức này ánh xạ trực tiếp Windows ACL sang quyền hạn Linux một cách mượt mà và tích hợp trơn tru với Active Directory khi doanh nghiệp mở rộng quy mô tài khoản domain.
  • NFS (Network File System): Tốc độ cực nhanh khi truyền tải giữa Linux với Linux, nhưng lại khá cồng kềnh trên Windows. Các client Windows cần sử dụng phiên bản Pro hoặc Enterprise và phải bật tính năng NFS tùy chọn. Việc ánh xạ định danh bảo mật Windows SID (Security Identifier) sang Linux UID/GID thường xuyên phát sinh các lỗi phân quyền khó hiểu.
  • SFTP / SSHFS: Rất tiện lợi cho các tác vụ quản trị nhanh qua SSH. Tuy nhiên, đối với người dùng văn phòng thông thường, việc gắn (mount) một thư mục SSHFS thành ổ đĩa mạng đòi hỏi phải cài thêm driver hỗ trợ như WinFsp và SSHFS-Win. Những công cụ này thường bị treo hoặc mất kết nối khi truyền tải các file dung lượng lớn.
  • WebDAV / Cloud Gateway (Nextcloud, ownCloud): Giải pháp đáng tin cậy cho nhân viên làm việc từ xa cần truy cập qua web và đồng bộ trên thiết bị di động. Dẫu vậy, việc phải vận hành cả một web server hoàn chỉnh cùng cơ sở dữ liệu MySQL sẽ tạo ra gánh nặng tài nguyên không cần thiết nếu bạn chỉ cần truyền file tốc độ cao 1 Gbps hoặc 10 Gbps qua mạng switch nội bộ tại văn phòng.

Ưu và nhược điểm của Samba

Trước khi chuẩn hóa hệ thống lưu trữ nội bộ bằng Samba, hãy cân nhắc kỹ giữa các lợi ích nhận được và những phát sinh trong quản trị hàng ngày:

Ưu điểm

  • Không cần cấu hình phía client: Người dùng có thể ánh xạ ổ đĩa mạng ngay lập tức bằng đường dẫn chuẩn UNC (Universal Naming Convention) như \\192.168.1.100\share.
  • Kiểm soát truy cập nhiều lớp: Bạn có thể kết hợp các quy tắc hạn chế share của Samba chồng lên hệ thống phân quyền POSIX tiêu chuẩn và POSIX ACL của Linux.
  • Bảo mật đường truyền hiện đại: Các phiên bản Samba hiện nay mặc định kích hoạt mã hóa SMB3, gộp băng thông đa kênh (multichannel) và kiểm tra dialect chặt chẽ, đồng thời loại bỏ hoàn toàn các giao thức cũ tiềm ẩn lỗ hổng bảo mật.

Điểm cần lưu ý

  • Hai cơ sở dữ liệu người dùng riêng biệt: Trừ khi bạn đang triển khai một domain LDAP hoặc Active Directory, mỗi người dùng đều cần có tài khoản trong cả /etc/passwd lẫn cơ sở dữ liệu nội bộ của Samba (passdb.tdb).
  • Xung đột mặt nạ phân quyền (permission mask): Chỉ cần một sai lệch nhỏ giữa quyền thư mục Unix (chmod/chown) và mặt nạ tạo file của Samba (create mask/directory mask) cũng có thể khiến người dùng bị khóa quyền truy cập vào các file bảng tính vừa mới tạo.

Kiến trúc đề xuất: Phương pháp tiếp cận bằng setgid

Tuyệt đối không mở các thư mục chia sẻ cho khách (guest share) không cần xác thực trên mạng LAN production. Thay vào đó, hãy thiết lập một thư mục riêng biệt do group quản lý kết hợp với thuộc tính setgid của Linux. Cơ chế này sẽ buộc mọi file và thư mục con mới tạo phải tự động kế thừa quyền sở hữu group của thư mục cha.

Chúng tôi đã thử nghiệm phương pháp này trên một máy ảo Ubuntu 22.04 LTS (2 vCPU, 4GB RAM) phục vụ đồng thời 25 client Windows 11. Cơ chế kế thừa group đã giúp giảm số lượng yêu cầu hỗ trợ liên quan đến phân quyền về con số không. Nó cũng loại bỏ hoàn toàn nhu cầu chạy cron job chmod -R hàng giờ vốn làm hao phí tài nguyên CPU trong giờ làm việc cao điểm.

Cấu hình bảo mật cơ sở của chúng tôi áp dụng 4 nguyên tắc cốt lõi:

  • Bắt buộc sử dụng giao thức SMB2 hoặc SMB3. Loại bỏ SMBv1 giúp ngăn chặn các cuộc tấn công khai thác lỗ hổng cũ như EternalBlue.
  • Gán quyền truy cập cho một group Linux chuyên dụng không phải root (ví dụ: smbfinance).
  • Thiết lập quyền thư mục cha nghiêm ngặt với chmod 2770 để đảm bảo quyền sở hữu group luôn đồng nhất.
  • Chỉ cho phép Samba lắng nghe trên subnet nội bộ của bạn. Tuyệt đối không để lộ cổng 445 ra ngoài internet công cộng.

Hướng dẫn triển khai từng bước

Bước 1: Cài đặt các gói Samba

Đầu tiên, hãy cập nhật danh mục gói phần mềm và cài đặt các binary Samba cần thiết:

sudo apt update
sudo apt install -y samba samba-common-bin smbclient

Kiểm tra xem tiến trình nền (daemon) của Samba đã hoạt động hay chưa:

sudo systemctl status smbd --no-pager

Bước 2: Xây dựng cấu trúc thư mục và gán Group

Hãy lưu trữ các dữ liệu chia sẻ bên ngoài thư mục home cá nhân. Quy ước tiêu chuẩn trên Debian và Ubuntu là đặt tại /srv/samba. Hãy tạo thư mục chia sẻ cùng với một group hệ thống chuyên dụng:

sudo mkdir -p /srv/samba/finance_share
sudo groupadd smbfinance

Gán quyền sở hữu cho root:smbfinance và áp dụng quyền 2770. Số 2 ở đầu sẽ kích hoạt thuộc tính setgid:

sudo chown -R root:smbfinance /srv/samba/finance_share
sudo chmod -R 2770 /srv/samba/finance_share

Bước 3: Thêm người dùng Linux và Samba

Samba cần một tài khoản người dùng Linux nền tảng để quản lý quyền sở hữu file, nhưng tài khoản đó không nhất thiết phải có quyền truy cập shell tương tác vào máy chủ. Hãy dùng cờ -M (không tạo thư mục home) và -s /usr/sbin/nologin để tạo một user hệ thống bị giới hạn:

# Tạo user Linux bị giới hạn quyền shell
sudo useradd -M -s /usr/sbin/nologin -g smbfinance sarah

# Thiết lập mật khẩu Samba để xác thực từ Windows
sudo smbpasswd -a sarah

Nhập mật khẩu an toàn khi được yêu cầu. Người dùng Windows sẽ sử dụng mật khẩu này khi ánh xạ thư mục chia sẻ từ máy tính của họ.

Bước 4: Cấu hình /etc/samba/smb.conf

Luôn sao lưu file cấu hình mặc định trước khi chỉnh sửa:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

Mở file cấu hình bằng trình soạn thảo văn bản:

sudo nano /etc/samba/smb.conf

Thay thế hoặc cập nhật khối [global] với các thiết lập bảo mật tối ưu sau. Hãy điều chỉnh dòng interfaces sao cho khớp với subnet thực tế của bạn (ví dụ: 192.168.1.0/24):

[global]
   workgroup = WORKGROUP
   server string = Ubuntu File Server
   security = user
   passdb backend = tdbsam
   
   # Tăng cường bảo mật giao thức: vô hiệu hóa SMB1 và NetBIOS
   server min protocol = SMB2_10
   client min protocol = SMB2_10
   disable netbios = yes
   smb ports = 445
   bind interfaces only = yes
   interfaces = 127.0.0.1/8 192.168.1.0/24
   
   # Ghi log
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file

Cuộn xuống cuối file và định nghĩa cấu hình chia sẻ cho phòng tài chính:

[Finance]
   comment = Thư mục chia sẻ cho phòng Tài chính
   path = /srv/samba/finance_share
   valid users = @smbfinance
   guest ok = no
   read only = no
   browsable = yes
   create mask = 0660
   directory mask = 0770
   force group = smbfinance

Lưu file và kiểm tra cú pháp cấu hình:

testparm

Nếu testparm hiển thị Loaded services file OK, hãy khởi động lại dịch vụ để áp dụng các thay đổi:

sudo systemctl restart smbd

Bước 5: Cấu hình Tường lửa

Nếu bạn đang sử dụng UFW, hãy giới hạn lưu lượng truy cập cổng 445 chỉ trong phạm vi subnet nội bộ. Tránh mở cổng này ra toàn cầu:

sudo ufw allow from 192.168.1.0/24 to any port 445 proto tcp comment 'Samba SMB'

Bước 6: Kết nối từ máy trạm Windows

  1. Nhấn tổ hợp phím Windows + R để mở hộp thoại Run.
  2. Nhập đường dẫn UNC của máy chủ: \\192.168.1.100\Finance và nhấn Enter.
  3. Khi Windows yêu cầu thông tin xác thực mạng, nhập tên đăng nhập sarah và mật khẩu Samba bạn đã đặt ở bước trước.
  4. Tạo thử một file .docx hoặc .txt bên trong thư mục. Hãy kiểm tra xem bạn có thể chỉnh sửa, đổi tên và xóa file mà không gặp lỗi nào hay không.

Xử lý các sự cố thường gặp

Nếu Windows hiển thị thông báo Access is Denied (Truy cập bị từ chối):

  • Kiểm tra quyền thư mục: Chạy lệnh ls -ld /srv/samba/finance_share. Kết quả hiển thị phải có dạng drwxrws--- thuộc quyền sở hữu root:smbfinance. Nếu thiếu bit s, hãy chạy lại lệnh sudo chmod 2770 /srv/samba/finance_share.
  • Kiểm tra log client đang hoạt động: Theo dõi log kết nối theo thời gian thực bằng lệnh sudo tail -n 50 /var/log/samba/log.* để xem các lần đăng nhập thất bại hoặc trường hợp giao thức bị từ chối.
  • Kiểm tra trạng thái tài khoản: Nếu người dùng không thể kết nối, hãy đảm bảo tài khoản Samba của họ không bị khóa: sudo smbpasswd -e sarah.
Share: