Cách cung cấp chia sẻ mạng SMB/CIFS cho các máy khách cụ thể

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

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

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

Cách cung cấp chia sẻ mạng SMB/CIFS cho các máy khách cụ thể


Samba là một triển khai mã nguồn mở của khối thông báo máy chủ (SMB) và các giao thức hệ thống tệp internet phổ biến (CIFS), nó cho phép chúng tôi truy cập tài nguyên chia sẻ tệp Windows từ Linux.

Với Samba, chúng tôi có thể xuất các thư mục cụ thể trong một hệ thống tệp qua mạng sang các máy khách Windows hoặc Linux khác, cho phép chúng tôi chia sẻ các tệp khác nhau qua mạng giữa các hệ điều hành khác nhau.

Điều quan trọng là phải định cấu hình điều này đúng cách và bảo mật nó càng nhiều càng tốt để chỉ những khách hàng và người dùng được yêu cầu mới có quyền truy cập vào chia sẻ SMB/CIFS, nếu không, bất kỳ ai cũng có thể gắn kết và truy cập dữ liệu.

Để làm điều này, chúng tôi sẽ sử dụng tệp /etc/samba/smb.conf trên máy chủ SMB/CIFS và khóa các chia sẻ để chỉ các địa chỉ IP và tài khoản người dùng cụ thể mới có thể truy cập được.

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 khách Samba: 192.168.0.100 – Máy khách Linux này sẽ gắn một thư mục từ máy chủ SMB/CIFS.
  • Máy chủ Samba: 192.168.0.200 – Máy chủ Linux này sẽ cung cấp một thư mục qua SMB/CIFS cho máy khách.

2. Cấu hình máy chủ Samba

Máy chủ có dữ liệu để chia sẻ sẽ đóng vai trò là máy chủ SMB và cần cài đặt gói samba.

Mã nguồn [Chọn]
yum install samba -y
Sau khi cài đặt, chúng tôi có thể kích hoạt máy chủ Samba của mình tự động khởi động dịch vụ SMB cần thiết khi khởi động, chúng tôi cũng sẽ khởi động dịch vụ ngay bây giờ vì dịch vụ này không chạy theo mặc định sau khi cài đặt. Chúng tôi cũng làm điều này với dịch vụ NMB chịu trách nhiệm về NetBIOS và là một phần của gói samba.

Mã nguồn [Chọn]
systemctl enable smb nmb
systemctl start smb nmb

Để biết thêm thông tin về quản lý dịch vụ cơ bản với systemctl, hãy xem hướng dẫn của chúng tôi tại đây .

Khi dịch vụ smb đã bắt đầu thành công, chúng tôi có thể xác nhận rằng dịch vụ này đang nghe chính xác trên các cổng TCP 139 và 445.

Mã nguồn [Chọn]
[root@centos7 ~]# netstat -antup | grep smb
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      3536/smbd
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      3536/smbd
tcp6       0      0 :::139                  :::*                    LISTEN      3536/smbd
tcp6       0      0 :::445                  :::*                    LISTEN      3536/smbd

Tiếp theo, tường lửa phải được định cấu hình để cho phép lưu lượng SMB đi qua một cách chính xác, điều này có thể được thực hiện như minh họa bên dưới với tường lửa. Thay đổi này sẽ cho phép lưu lượng truy cập cổng TCP 135/445 SMB/CIFS vào máy chủ từ bất kỳ địa chỉ IP nguồn nào. Cấu hình tường lửa cũng phải được tải lại vì chúng tôi đã đặt một quy tắc vĩnh viễn sẽ không áp dụng cho cấu hình đang chạy.

Mã nguồn [Chọn]
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

Trong ví dụ này, chúng tôi sẽ gắn thư mục chính của người dùng lên SMB, vì vậy chúng tôi cần thực hiện thay đổi sau đối với SELinux để cho phép điều này. Lưu ý rằng -P biến điều này thành thay đổi vĩnh viễn sẽ tồn tại khi khởi động lại hệ thống.

Mã nguồn [Chọn]
setsebool -P samba_enable_home_dirs on
Tiếp theo, chúng ta sẽ tạo một người dùng có thư mục chính sẽ được chia sẻ. Chúng tôi đang chỉ định shell /sbin/nologin ở đây vì chúng tôi không muốn người dùng cụ thể này có thể đăng nhập trực tiếp vào máy chủ thông qua bảng điều khiển hoặc SSH, tài khoản này sẽ chỉ được sử dụng để truy cập SMB.

Mã nguồn [Chọn]
useradd rootusers -s /sbin/nologin
Điều này tạo ra một người dùng Linux tiêu chuẩn, tuy nhiên chúng tôi cần đặt mật khẩu SMB trên tài khoản.

Mã nguồn [Chọn]
[root@server ~]# smbpasswd -a rootusers
New SMB password:
Retype new SMB password:
Added user rootusers.

Chia sẻ tệp Samba được định cấu hình với tệp /etc/samba/smb.conf, tệp này liệt kê các thư mục có sẵn để truy cập qua SMB/CIFS, cũng như xác định bất kỳ địa chỉ IP nguồn cụ thể nào sẽ được phép kết nối trong .

Mã nguồn [Chọn]
hosts allow = 127. 192.168.0.100
Điều này sẽ chỉ cho phép máy khách của chúng tôi tại 192.168.0.100 kết nối, cũng như máy chủ cục bộ 127.0.0.0/8. Tên máy chủ cũng có thể được sử dụng thay cho địa chỉ IP, miễn là chúng phân giải thành địa chỉ IP dự định bằng DNS chẳng hạn. Ngoài ra, chúng tôi cũng có thể từ chối các máy chủ cụ thể bằng cách chỉ định 'máy chủ từ chối' trong cấu hình.

Lưu ý rằng tường lửa hiện được đặt để cho phép bất kỳ địa chỉ IP nào trên các cổng SMB, đây là ứng dụng chịu trách nhiệm cho phép hoặc từ chối các địa chỉ IP, đó chính là mục tiêu của RHCE này. Trong thế giới thực, chúng tôi cũng sẽ sử dụng tường lửa để chỉ cho phép các địa chỉ IP nguồn cụ thể .

Chúng tôi cũng có thể cho phép truy cập vào một người dùng cụ thể thay vì chỉ một máy chủ cụ thể, do đó phương pháp này yêu cầu xác thực theo cách của mật khẩu người dùng. Trong trường hợp này, tài khoản rootusers được phép truy cập qua SMB, tất cả những người dùng khác sẽ bị từ chối.

Mã nguồn [Chọn]
valid users = rootusers
Chúng tôi có thể chạy lệnh 'testparm' sau khi thực hiện các thay đổi đối với tệp cấu hình để kiểm tra cú pháp, điều này sẽ thông báo nếu có bất kỳ sai sót hoặc lỗi nào trong cấu hình trước khi khởi động lại dịch vụ.

Mã nguồn [Chọn]
[root@server ~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
        workgroup = MYGROUP
        server string = Samba Server Version %v
        security = USER
        log file = /var/log/samba/log.%m
        max log size = 50
        idmap config * : backend = tdb
        hosts allow = 192.168.0.100
        cups options = raw

Sau bất kỳ thay đổi nào đối với tệp /etc/samba/smb.conf, chúng tôi cần khởi động lại dịch vụ smb để áp dụng các thay đổi.

Mã nguồn [Chọn]
systemctl restart smb nmb
3. Cấu hình máy khách Samba

Bây giờ máy chủ đã sẵn sàng chấp nhận các kết nối SMB, chúng ta cần chuẩn bị máy khách.

Trước tiên hãy cài đặt gói samba-client và cifs-utils được sử dụng để gắn các chia sẻ SMB.

Mã nguồn [Chọn]
yum install samba-client cifs-utils -y
Tiếp theo sửa đổi tường lửa bằng cách cho phép dịch vụ samba-client.

Mã nguồn [Chọn]
firewall-cmd --permanent --add-service=samba-client
firewall-cmd --reload

Bạn có thể xác nhận rằng trình duyệt đang hoạt động bằng cách sử dụng smbclient trên máy khách để kết nối với máy chủ. Trong ví dụ này, chúng tôi đang kết nối với máy chủ SMB tại 192.168.0.200 bằng tài khoản rootusers mà chúng tôi đã tạo ở đó.

Mã nguồn [Chọn]
[root@client ~]# smbclient -L 192.168.0.200 -U rootusers
Enter rootusers's password:
Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]

        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (Samba Server Version 4.2.10)
        rootusers       Disk      Home Directories
        Send_To_OneNote_2013:1 Printer   Send To OneNote 2013
        Microsoft_Print_to_PDF:4 Printer   Microsoft Print to PDF
        Fax:3           Printer   Fax
        Microsoft_XPS_Document_Writer:2 Printer   Microsoft XPS Document Writer

Trong số những thứ khác, chúng ta có thể thấy phần chia sẻ của người dùng root được liệt kê dưới dạng thư mục chính, như được đánh dấu ở trên.

4. Gắn kết Chia sẻ Samba

Bây giờ chúng tôi đã chuẩn bị ứng dụng khách và chia sẻ samba, chỉ ứng dụng khách của chúng tôi từ địa chỉ IP 192.168.0.100 mới có thể gắn kết nó, hãy thử nghiệm. Các hệ thống máy khách cũng sẽ cần cài đặt gói cifs-utils để có thể gắn các điểm gắn SMB/CIFS.

Mã nguồn [Chọn]
[root@client ~]# mount //192.168.0.200/rootusers /mnt -o username=rootusers
Password for rootusers@//192.168.0.200/rootusers:  ********

Bây giờ điều này đã được gắn kết, chúng ta có thể kiểm tra và xác nhận rằng nó được liệt kê trong đầu ra của df chẳng hạn.

Mã nguồn [Chọn]
[root@client ~]# df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/sda3                  18G  4.5G   14G  25% /
/dev/sda1                 297M  144M  154M  49% /boot
//192.168.0.200/rootusers   18G  3.7G   15G  21% /mnt

Như hình trên chúng ta có thể thấy rằng   Đăng nhập để xem liên kết đã mount thành công vào thư mục /mnt. Nếu chúng tôi muốn tự động gắn cái này trong khi khởi động hệ thống, chúng tôi có thể sửa đổi tệp /etc/fstab như hình bên dưới.

Mã nguồn [Chọn]
//192.168.0.200/rootusers /mnt cifs username=rootusers,password=password 0 0
Khi điều này đã được thêm vào tệp /etc/fstab, bạn có thể chạy 'mount -a' để thử gắn nó. Lưu ý rằng theo mặc định, quyền truy cập tệp của tệp /etc/fstab cho phép bất kỳ người dùng nào đọc tệp, vì vậy bạn có thể không muốn lưu trữ mật khẩu người dùng trực tiếp trong tệp.

Thay vì chỉ định tên người dùng và mật khẩu trong /etc/fstab, chúng ta có thể sử dụng tham số thông tin xác thực để trỏ đến một tệp trên đĩa có chứa các thông tin xác thực này như minh họa bên dưới.

Mã nguồn [Chọn]
//192.168.0.200/rootusers /mnt cifs credentials=/root/credentials 0 0
Mặc dù tệp này vẫn lưu trữ thông tin đăng nhập ở dạng văn bản thuần túy và không cần nỗ lực mã hóa chúng, nhưng chúng tôi có thể đặt quyền thành 600 để chỉ người dùng root mới có thể đọc tệp, từ chối quyền truy cập đối với bất kỳ người dùng nào khác.

Mã nguồn [Chọn]
[root@client ~]# chmod 600 /root/credentials
[root@client ~]# ls -la /root/credentials
-rw-------. 1 root root 37 May 22 16:12 /root/credentials
[root@client ~]# cat credentials
username=rootusers
password=password

Kiểm tra lại xem việc gắn với những thay đổi này có hoạt động chính xác không.

Tại thời điểm này, bạn có thể kiểm tra bằng cách sửa đổi tệp /etc/samba/smb.conf trên máy chủ SMB để đặt địa chỉ IP 'host allow' thành địa chỉ khác, sau đó tải lại dịch vụ smb và thử kết nối lại. Kết nối sẽ không thành công vì địa chỉ IP của máy khách không còn được phép truy cập, xác nhận rằng cấu hình của chúng tôi chỉ cho phép các máy khách cụ thể truy cập.

5. Tạo chia sẻ tùy chỉnh

Cho đến giờ chúng ta mới chỉ gắn kết thành công một thư mục chính qua SMB, bây giờ chúng ta sẽ giới thiệu cách tạo một thư mục tùy ý và gắn kết cả thư mục đó.

Trước tiên, chúng tôi sẽ tạo một thư mục mà chúng tôi sẽ chia sẻ qua SMB.

Mã nguồn [Chọn]
[root@server ~]# mkdir /testing
[root@server ~]# chmod 777 /testing

Tiếp theo, chúng tôi sẽ bắt đầu bằng cách sửa đổi tệp /etc/samba/smb.conf trên máy chủ SMB, thêm vào tệp cấu hình bên dưới cho thư mục tùy chỉnh mà chúng tôi muốn chia sẻ.

Mã nguồn [Chọn]
[testing]
comment = This is a file share for the /testing directory.
browseable = yes
path = /testing
valid users = rootusers
writable = yes

Điều này cho phép tài khoản người dùng rootusers mà chúng tôi đã tạo trước đó truy cập vào thư mục /testing.

Cuối cùng, chúng tôi sửa đổi ngữ cảnh SELinux của thư mục này. Nếu cú pháp của lệnh này khó nhớ, chỉ cần tham khảo trang hướng dẫn 'semanage-fcontext' để biết ví dụ.

Mã nguồn [Chọn]
[root@server ~]# semanage fcontext -a -t samba_share_t "/testing(/.*)?"
[root@server ~]# restorecon -v /testing/
restorecon reset /testing context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0

Tiếp theo, chúng ta có thể kiểm tra xem cái này có thể truy cập được không, rồi gắn kết nó.

Mã nguồn [Chọn]
[root@client ~]# smbclient -L 192.168.0.200 -U rootusers
Enter rootusers's password:
Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]

        Sharename       Type      Comment
        ---------       ----      -------
        testing         Disk      This is a file share for the /root/testing directory.

[root@client ~]# mount //192.168.0.200/testing /mnt -o username=rootusers

Tại thời điểm này, chúng ta có thể tạo một tệp thử nghiệm từ máy khách như hình bên dưới.

Mã nguồn [Chọn]
[root@client ~]# echo Testing > /mnt/test123
Chúng tôi có thể kiểm tra xem tệp này có tồn tại trên máy chủ hay không, vì chúng tôi có thể thấy nội dung dự kiến có trong tệp này trên máy chủ SMB xác nhận rằng chúng tôi có thể viết nội dung từ máy khách tại đây.

Mã nguồn [Chọn]
[root@server ~]# cat /testing/test123
Testing

6. Khắc phục sự cố Samba

Đang có những vấn đề? Hãy thử các tài nguyên này.

6.1. Tài liệu

Có sẵn tài liệu cục bộ trên hệ thống của bạn, tài liệu này có thể được truy cập trong kỳ thi RHCE. Kiểm tra /usr/share/doc/samba- / danh mục.

Các trang hướng dẫn cũng có thông tin hữu ích.

Mã nguồn [Chọn]
man samba
man 5 smb.conf

6.2. Lệnh smbstatus

Bạn có thể chạy lệnh smbstatus trên máy chủ để liệt kê các máy khách hiện đang được kết nối và thu thập thêm thông tin.

Mã nguồn [Chọn]
[root@server ~]# smbstatus

Samba version 4.2.10
PID     Username      Group         Machine            Protocol Version
------------------------------------------------------------------------------
13929     rootusers     rootusers     192.168.0.100 (ipv4:192.168.0.100:41380) NT1

Service      pid     machine       Connected at
-------------------------------------------------------
IPC$         13929   192.168.0.100  Sat May 21 23:20:53 2016
rootusers    13929   192.168.0.100  Sat May 21 23:20:53 2016

No locked files

6.3. Lệnh testparm

Như đã trình bày trước đó, hãy chạy lệnh testparm trên máy chủ Samba để kiểm tra cú pháp của tệp /etc/samba/smb.conf.

6.4. Đặt lại tệp smb.conf

Nếu bạn nghĩ rằng mình đã làm hỏng mọi thứ không thể sửa chữa được, chỉ cần di chuyển hoặc xóa tệp /etc/samba/smb.conf rồi cài đặt lại Samba, thao tác này sẽ tạo một tệp mới hoàn toàn với các cài đặt mặc định.

Mã nguồn [Chọn]
yum reinstall samba
6.5. SELinux

Để chia sẻ thư mục qua SMB, ngữ cảnh phải được đặt thành samba_share_t.

Ngoài ra, bạn có thể đặt samba_export_all_ro cho phép truy cập chỉ đọc vào bất kỳ thư mục nào mà bạn có thể muốn chia sẻ qua SMB, ngay cả khi chúng không có tập ngữ cảnh samba_share_t. Boolean samba_export_all_rw hoạt động tương tự ngoại trừ nó cho phép đọc/ghi.

Mã nguồn [Chọn]
[root@server ~]# setsebool -P samba_export_all_ro off
[root@server ~]# setsebool -P samba_export_all_rw off

Tuỳ chọn -P làm cho những thay đổi này tồn tại trong quá trình khởi động lại hệ thống.

Như được hiển thị, chúng ta có thể gắn các thư mục từ máy chủ Samba vào máy khách chạy Linux. Chức năng này cho phép chúng tôi kết nối với các chia sẻ tệp dựa trên Windows SMB/CIFS từ hệ thống Linux hoặc cách khác là cho phép máy chủ Linux cung cấp chia sẻ mà các hệ thống Windows có thể truy cập.