Mục tiêu chương
Nắm vững cách cấu hình Samba để chia sẻ file giữa Linux và Windows
Cài đặt Samba
Cài gói samba và samba-common, khởi động smb và nmb service, kiểm tra với smbclient để xác nhận Samba đang chạy.
Cấu hình smb.conf
Hiểu cấu trúc smb.conf: section [global], [homes], [printers] và cách tạo custom share. Cấu hình workgroup, security, passdb backend.
Tạo Shared Folder
Tạo thư mục chia sẻ, set permissions Linux và SELinux context (samba_share_t), thêm vào smb.conf với valid users và read only settings.
Quản lý Samba Users
Dùng smbpasswd để thêm và đổi mật khẩu Samba (có thể khác password Linux), quản lý database passwords với tdbsam backend.
smbclient & Mount CIFS
Dùng smbclient để kết nối và test shares, mount Samba share từ Linux với mount -t cifs, cấu hình /etc/fstab cho auto-mount.
SELinux & Firewall Samba
Mở port TCP 445/139 và UDP 137/138 trong firewall, cấu hình SELinux Booleans (samba_enable_home_dirs) và file contexts (samba_share_t).
Lý thuyết
Cài đặt và khởi động Samba
Samba cần hai daemon: smbd (file/print sharing, port TCP 445 và 139) và nmbd (NetBIOS name resolution, port UDP 137/138). Sau khi cài, dùng smbclient để test.
$ sudo dnf install samba samba-common samba-client
Installed: samba-4.22.3-1.fc42.x86_64
# Start smb và nmb services
$ sudo systemctl enable --now smb nmb
$ sudo systemctl status smb
● smb.service - Samba SMB Daemon
Active: active (running)
Main PID: 7947 (smbd)
Status: "smbd: ready to serve connections..."
# Kiểm tra kết nối ban đầu (anonymous)
$ smbclient -L localhost
Password for [SAMBA\user]: [Enter]
Anonymous login successful
Sharename Type Comment
IPC$ IPC IPC Service (Samba 4.22.3)
Cấu hình smb.conf
File cấu hình chính: /etc/samba/smb.conf. Gồm các sections: [global] (cài đặt chung), [homes] (home directories), [printers] (máy in), và các custom shares.
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
netbios name = FEDORA42
log file = /var/log/samba/log.%m
max log size = 50
[homes]
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
inherit acls = Yes
[printers]
comment = All Printers
path = /var/tmp
browseable = no
printable = yes
create mask = 0600
[salesdata]
comment = Sales data for current year
path = /var/salesdata
read only = no
valid users = chris
Quản lý Users và kiểm tra với smbclient
Samba dùng database riêng cho passwords (tdbsam). Lệnh smbpasswd quản lý Samba passwords (có thể khác password Linux). Dùng smbclient để test từ command line.
# Thêm Samba password cho user chris
$ sudo smbpasswd -a chris
New SMB password: *********
Retype new SMB password: *********
Added user chris.
# Kiểm tra shares có sẵn (với user chris)
$ smbclient -L localhost -U chris
Password for [SAMBA\chris]: ****
Sharename Type Comment
salesdata Disk Sales data for current year
print$ Disk Printer Drivers
chris Disk Home Directories
# Kết nối và dùng share
$ smbclient -U chris //localhost/salesdata
Password: ****
smb: \> ls
test N 0 Mon Jul 27 05:20:17 2025
smb: \> put /etc/hosts hosts
putting file hosts (43.5 kb/s)
smb: \> quit
# Mount Samba share từ Linux (CIFS)
$ sudo mount -t cifs //192.168.1.100/salesdata /mnt/sales \
-o username=chris,password=secret
$ ls /mnt/sales
hosts test
Firewall và SELinux cho Samba
Samba cần port TCP 445 (chính), TCP 139 (legacy), UDP 137-138 (NetBIOS). SELinux cần context samba_share_t trên thư mục chia sẻ và Booleans phù hợp.
# Mở firewall cho Samba
$ sudo firewall-cmd --permanent --add-service=samba
success
$ sudo firewall-cmd --reload
# Tạo thư mục share với permissions đúng
$ sudo mkdir /var/salesdata
$ sudo chmod 775 /var/salesdata
$ sudo chown chris:chris /var/salesdata
# Set SELinux context cho Samba share
$ sudo semanage fcontext -a -t samba_share_t /var/salesdata
$ sudo restorecon -v /var/salesdata
Relabeled /var/salesdata to samba_share_t
# SELinux Booleans quan trọng
# Cho phép home directory qua Samba
$ sudo setsebool -P samba_enable_home_dirs on
# Cho phép share any file read-only
$ sudo setsebool -P samba_export_all_ro on
# Cho phép share any file read/write
$ sudo setsebool -P samba_export_all_rw on
# Liệt kê tất cả Samba Booleans
$ semanage boolean -l | egrep "smb|samba"
Lab Thực Hành
Kịch bản: Cài Samba, tạo shared folder /var/projects, cấp quyền cho user devteam, test từ smbclient và mount CIFS
Cài đặt Samba
$ sudo dnf install -y samba samba-common samba-client
$ sudo systemctl enable --now smb nmb
$ sudo systemctl status smb | grep Active
Active: active (running)
Tạo user và Samba password
$ sudo useradd devteam
$ sudo passwd devteam
$ sudo smbpasswd -a devteam
New SMB password: ***** Added user devteam.
Tạo thư mục chia sẻ
$ sudo mkdir /var/projects
$ sudo chown devteam:devteam /var/projects
$ sudo chmod 770 /var/projects
$ sudo semanage fcontext -a -t samba_share_t "/var/projects(/.*)?"
$ sudo restorecon -Rv /var/projects
Relabeled /var/projects to samba_share_t
Thêm share vào smb.conf
[projects]
comment = Development Projects
path = /var/projects
valid users = devteam
read only = no
browseable = yes
$ sudo systemctl restart smb
Mở firewall và bật SELinux Boolean
$ sudo firewall-cmd --permanent --add-service=samba
$ sudo firewall-cmd --reload
$ sudo setsebool -P samba_enable_home_dirs on
$ sudo setsebool -P samba_export_all_rw on
Test và mount CIFS
$ smbclient -L localhost -U devteam
projects Disk Development Projects
$ sudo mkdir /mnt/projects
$ sudo mount -t cifs //localhost/projects /mnt/projects -o username=devteam
$ ls /mnt/projects
# Thêm vào /etc/fstab cho auto-mount:
//server/projects /mnt/projects cifs credentials=/etc/samba/creds,_netdev 0 0
Câu hỏi ôn tập
Samba gồm hai daemon chính là gì? Mỗi daemon có nhiệm vụ gì?
smbd: cung cấp file sharing và print sharing qua SMB protocol (port TCP 445 và 139). nmbd: cung cấp NetBIOS name resolution, map tên máy tính sang địa chỉ IP (port UDP 137 và 138). smbd là service bắt buộc, nmbd cần thiết khi không có Windows domain controller.
smb.conf có cấu trúc gồm những sections nào và chức năng mỗi section?
[global]: cài đặt toàn server (workgroup, security, passdb backend, printing)
[homes]: cấu hình home directories của Samba users
[printers]: chia sẻ máy in qua CUPS
[print$]: thư mục chứa printer drivers
Custom sections như [salesdata]: các shared folders tùy chỉnh
Lệnh nào dùng để thêm/đổi Samba password? Samba password có khác Linux password không?
sudo smbpasswd -a username — thêm user vào Samba database. sudo smbpasswd username — đổi password. Có, Samba password được lưu riêng trong TDB database (tdbsam backend) và hoàn toàn độc lập với Linux system password trong /etc/shadow.
SELinux context nào cần được set trên thư mục chia sẻ qua Samba?
Context samba_share_t cần được set. Lệnh: semanage fcontext -a -t samba_share_t "/var/myshare(/.*)?" rồi restorecon -Rv /var/myshare. Để cho phép home directories qua Samba: setsebool -P samba_enable_home_dirs on.
Lệnh mount nào để mount Samba share từ Linux? Và cú pháp /etc/fstab?
Mount thủ công: mount -t cifs //server/share /mnt/point -o username=user,password=pass
/etc/fstab: //server/share /mnt/point cifs credentials=/etc/samba/creds,_netdev 0 0
File credentials: username=user, password=pass (chmod 600)
smbclient -L localhost cho output gì? Dùng để làm gì?
smbclient -L localhost liệt kê tất cả shares available từ Samba server, bao gồm Disk shares (thư mục), Printer shares (máy in), và IPC shares. Dùng để test Samba đang chạy và xem shares có được chia sẻ đúng không. Dùng -U username để xem với quyền user cụ thể.
Các ports nào cần mở trong firewall cho Samba hoạt động?
- TCP port 445: SMB chính (bắt buộc)
- TCP port 139: NetBIOS session (legacy SMB1 compatibility)
- UDP port 137: NetBIOS name service (cho nmbd)
- UDP port 138: NetBIOS datagram service (cho nmbd)
Lệnh nhanh: firewall-cmd --permanent --add-service=samba
Directive "valid users" trong smb.conf có tác dụng gì?
valid users chỉ định danh sách Samba users/groups được phép truy cập share đó. Ví dụ: valid users = chris, @admins — chỉ cho phép user chris và members của group admins. %S là variable đặc biệt thay thế bằng service name (dùng trong [homes] section).