Contents

Linux - 提供 SMB 檔案分享

Windows 作業系統中透過網路芳鄰 (CIFS) 互相傳輸,然而 Linux 要存取可以透過 SMB (逆向工程解析出來的CIFS) 來傳輸,也能在 Linux 提供 SMB 服務分享檔案給 Windows OS 使用 。

練習環境
可以使用 HowHow 的創建 Lab 練習環境,來實作 SMB 伺服器與存取操作,使用方式請參閱 HowHow 網站 - Linux 練習 Lab 第二版

1. SMB 簡介

SMB 伺服器訊息區塊(Server Message Block) 原是用於 Microsoft Windows 伺服器與 Client 的標準檔案分享協議,透過 Windows 預設的工作群組成員及伺服器上的用戶帳號及密碼即可分享。

Linux 所需套件
Linux Client 端如需存取 SMB 文件分享,需安裝 cifs-utils 套件 。

2. 使用 SMB 伺服器分享檔案

1
2
3
4
5
6
7
8
9
使用 ServerA 為 SMB Server 範例:

    1. Server A SMB 分享 data 並掛載在 /smbshare 目錄下 。
    2. SMB Workgroup 設定為 mycompany 。
    3. 任何人都可以存取此目錄,只有 marketing 組成員可以寫入。
    4. /smbahare 目錄為 markering 組擁有並具備 SGID,僅具備gorup成員可以寫入,其他人僅能唯讀。
    5. SMB 創建  qa 和 op 使用者帳號 ,密碼為 redhat。
    6. qa 為 marketing 組成員。
    7. Server B 也創建 qa 和 op 帳號,另 qa 為 markering 組成員。

2.1. 安裝 SMB 套件

1
2
3
4
5
[root@servera ~]# yum install samba -y  | tail -n 4
  samba-libs-4.16.4-4.el8_7.x86_64
  tdb-tools-1.4.6-1.el8.x86_64

Complete!

2.2. 設定分享目錄

  1. 創建 marketing 群組 。
1
[root@servera ~]# groupadd marketing
  1. 創建分享目錄 。
1
[root@servera ~]# mkdir /smbshare
  1. 設定 /smbshare 群組擁有者及 SGID 。
1
2
[root@servera ~]# chgrp marketing /smbshare
[root@servera ~]# chmod 2775 /smbshare
  1. 設定 Selinux 並驗證其結果 。
1
2
3
4
5
[root@servera ~]# semanage fcontext -a -t samba_share_t '/smbshare(/.*)?'
[root@servera ~]# restorecon -Rv /smbshare/
Relabeled /smbshare from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:samba_share_t:s0
[root@servera ~]# ls -lZd /smbshare/
drwxrwsr-x. 2 root marketing unconfined_u:object_r:samba_share_t:s0 6 Feb 25 21:00 /smbshare/
警告
如果某個目錄原本就是 NFS 或是 FTP 分享的目錄,請勿使用 Samba 來分享該目錄,可能會導致檔案損壞或是其他檔案無法正常存取。

2.3. 設定 Samba Server

  1. 修改工作群組為 mycompany
1
[root@servera ~]#  sed -i 's/workgroup = SAMBA/workgroup = mycompany/g' /etc/samba/smb.conf
  1. 添加 data 分享目錄分享目錄及寫入權限
1
2
3
4
5
[root@servera ~]# cat >> /etc/samba/smb.conf << EOF
> [data]
>      path = /smbshare
>      write list = @marketing
> EOF
設定分享參數

[global] 後可以自定義所需分享的名稱,以中括號表示所分享的名稱。

  1. path : 伺服器上分享目錄的位置
  2. writeable : 是否開啟所有人具備讀寫權限,預設為 no 。
  3. write list : 哪些可以具備寫入的能力,如果是群組則加上 @ 符號。
  4. valid users : 預設所有驗證過的使用者都可以存取該分享區,如果要限定使用者可以加上此參數,多個使用者以逗號區隔。
  1. 驗證設定檔

如果要驗證 /etc/samba/smb.conf 設定檔有無錯誤,執行 testparm 後不須輸入任何參數,並按下 Enter 如未顯示錯誤表示此設定沒有問題。

1
2
3
4
5
6
7
[root@serverd ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions
...output omitted...
  1. 設定 samba 使用者

創建 op 、 qa 及 sambamount 分享帳號,並使用 smbpasswd 創建該 samba 認證時密碼( redhat )。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[root@servera ~]# useradd -s /sbin/nologin -G marketing qa
[root@servera ~]# useradd -s /sbin/nologin op

[root@servera ~]# smbpasswd -a qa
New SMB password:
Retype new SMB password:
Added user qa.
[root@servera ~]# smbpasswd -a op
New SMB password:
Retype new SMB password:
Added user op.
[root@servera ~]# useradd -r -s /sbin/nologin sambamount
[root@servera ~]# smbpasswd -a sambamount
New SMB password:
Retype new SMB password:
Added user sambamount.
Tip
每一個 samba 使用者須具備與 Linux 服務帳號同樣名子,建議將此服務帳號設定 /sbin/nologin 禁止使用 ssh 登入。
  1. 啟動 smb 服務並開放防火牆規則
1
2
3
4
5
6
[root@servera ~]# systemctl enable --now smb
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.
[root@servera ~]# firewall-cmd --permanent --add-service=samba
success
[root@servera ~]# firewall-cmd --reload
success

3. Client 掛載 Samba 目錄

3.1. 安裝 SMB 套件

1
2
3
[root@serverb ~]# yum install cifs-utils -y  | tail -n 4
  samba-client-libs-4.16.4-4.el8_7.x86_64   samba-common-4.16.4-4.el8_7.noarch
  samba-common-libs-4.16.4-4.el8_7.x86_64

3.2. 創建所需帳號

1
2
3
[root@serverb ~]# groupadd marketing
[root@serverb ~]# useradd -G marketing qa
[root@serverb ~]# useradd op

3.3. 設定 smb client

  1. 添加連線用的帳號密碼資訊,並創建掛載目錄
1
2
3
4
5
6
[root@serverb ~]# cat > /etc/samba/creds.txt <<EOF
> username=sambamount
> password=redhat
> EOF
[root@serverb ~]# chmod 600 /etc/samba/creds.txt
[root@serverb ~]# mkdir /data
  1. 設定自動掛載 servera 所分享的 data ,並寫入 /etc/fstab 使開機後自動掛載。
1
2
3
4
5
6
7
[root@serverb ~]# cat >> /etc/fstab <<EOF
> //servera.lab.example.com/data /data cifs credentials=/etc/samba/creds.txt,multiuser 0 0
> EOF
[root@serverb ~]# mount -a
[root@serverb ~]# df /data
Filesystem                     1K-blocks    Used Available Use% Mounted on
//servera.lab.example.com/data   9345024 1497404   7847620  17% /data
  1. 使用 qa 帳號並輸入登入密碼 (redhat),驗證可以存取分享區及寫入。
1
2
3
4
5
6
7
8
[root@serverb ~]# su - qa
[qa@serverb ~]$  cifscreds add servera.lab.example.com
Password:
[qa@serverb ~]$ echo Hello World >  /data/test.txt
[qa@serverb ~]$ cat /data/test.txt
Hello World
[qa@serverb ~]$ exit
logout
  1. 使用 op 帳號並輸入登入密碼 (redhat),驗證可以存取分享區檔案,另限制其帳號是不可寫入。
1
2
3
4
5
6
7
[root@serverb ~]# su - op
[op@serverb ~]$  cifscreds add servera.lab.example.com
Password:
[op@serverb ~]$ cat /data/test.txt
Hello World
[op@serverb ~]$ echo "mod by op" >> /data/test.txt
-bash: /data/test.txt: Permission denied

4. 小結

SMB 在實務上是很常見的功能,除了 NFS 之外的另外一種選擇可以使用 SMB 來分享其檔案及目錄。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!