基於 Samba 的網路儲存系統

前言

網路儲存設備 (Network-attached storage, NAS) 的基本功能,不外乎資料儲存,以及利用權限來控管資料的存取,高階的型號更支援惡意程式掃描及 RAID(磁碟陣列)功能。在本篇文章中,筆者將簡介開放源碼社群中著名的 Samba 伺服器,並實作具有帳號控管及資料儲存功能的 NAS 系統。

下表為本篇教學的系統環境:

軟體名稱 官方網址
說明

Fedora 11

https://fedoraproject.org
Linux 作業系統。
Samba
https://www.samba.org
檔案伺服器,為了預留後續新增病毒掃描的功能,因此在此使用 Samba 3.0.23 版本,而不使用最新版本。

▲ 表1: 本篇教學的系統環境

 

Samba 的簡介

Samba 是架構在 NetBIOS (Network Basic Input/Output System) 系統基礎上的開放源碼軟體。主要用來連結 Microsoft Windows 系統的 SMB/CIFS (Server Message Block/Common Internet File System) 網路協定。自 1992 年 Samba 發表第一代版本以來,成為 Microsoft Windows 系統與 Linux 系統之間常用的溝通橋樑。

在最新的版本中(目前的版本為 V3),Samba 除了可與 Microsoft Windows 系統分享資料夾及印表機資源外,也可整合於 Windows Server 的網域、扮演網域控制站 (Domain Controller),以及加入 Active Directory 成員等功能。

為了讓後續 Samba 伺服器支援即時掃毒模組,本篇文章將以原始碼編譯的方式來安裝 Samba。

首先,移除系統內建的 Samba 伺服器,

$ yum erase samba*

接著請讀者至 Samba 的官方網站取得原始碼,並依序執行下列指令編譯:

取得原始碼

$ wget https://www.samba.org/samba/ftp/stable/samba-3.0.23.tar.gz 

進行配置

將下載的檔案解壓縮後,可使用 --prefix 參數指定程式安裝的路徑(本例為 /usr/local/samba),並記得啟用 pam 認證 (--with-pam)。若在編譯過程中,出現找不到 iniparser.h 的錯誤,讀者可將 /iniparser/src/ 中的 iniparser.h 複製至 /usr/include 目錄即可解決。

$ ./configure --prefix=/usr/local/samba  --with-pam

開始編譯

$ make proto
$ make

正式安裝

$ make install

安裝的路徑為先前設定的 --prefix 參數值。

Samba 的指令說明

下表為 Samba 重要執行檔的說明,

程式名稱 說明
smb
此程式用來管理 Samba 主機分享的目錄、檔案與印表機等相關資源。主要利用 TCP 埠 139 及 445 來傳輸資料。
nmbd
此程式用來管理工作群組、 NetBIOS 名稱等等的解析工作。主要利用 UDP 協定開啟埠 137, 138 負責名稱解析的任務。一個完整的 Samba 服務需同時啟動 smbd 及 nmbd 程式。
testparm
此程式用來檢驗 Samba 設定檔 smb.conf 的語法是否正確,當編輯完成 smb.conf 後,建議使用這個指令檢查以確定設定檔的語法皆正確。
smbstatus
列出目前的 Samba 的執行狀態。
smbpasswd
如果 Samba 伺服器所分享的資源需設定帳號/密碼的控管,即可使用此指令來建立所需的帳號/密碼。
smbclient
欲查看別台電腦所分享出來的目錄與裝置時,就可以使用 smbclient 來查看啦!這個指令也可以用在自己的 Samba 主機上面,查看是否設定成功。
smbmount
在微軟的 Windows 系統上,我們可以利用「網路磁碟機」的功能來連接到自己的主機,而在 Linux 系統上,即可以透過 smbmount 將遠端主機分享的檔案與目錄掛載到自己的 Linux 系統。
smbtree
有點像 Windows 系統的「網路上的芳鄰」顯示的結果,可以查到工作群組與電腦名稱的樹狀目錄分佈圖。

▲ 表2: Samba 重要的執行檔及其說明

Samba 的設定說明

Samba 伺服器的主要設定檔為 smb.conf。下表為常見的設定及說明,

Section(區間) 屬性名稱
說明
global
workgroup [工作群組名稱]
設定工作群組名稱(如 WORKGROUP),此設定要與 Windows 系統的工作群組名稱一致。

server string [說明文字]
描述此 Samba 伺服器的說明文字。

security
[share|user|server|domain|ads]
設定此 Samba 伺服器的管控方式,提供下列管控方式。

share:
不設定任何的認證方式來存取 Samba 伺服器所分享的資源,即完全開放任何人存取。

user:
可利用帳號/密碼的認證方式來存取 Samba 伺服器所分享的資源,這也是本文所採用的存取方式。

server:
可利用其它的認證主機來從事帳號認證,如利用 LDAP 伺服器來認證。

domain:
採用網域控制器 (Domain Controllers) 的帳號/密碼認證方式來存取 Samba 伺服器所分享的資源。

ads:
使用 AD(Active Directory) 伺服器來認證帳號 / 密碼的有效性。

smb passwd file [檔名]
設定密碼是否要經過加密。

hosts allow [ip資訊]
限制可存取 Samba 伺服器的主機。
如設定
hosts allow 192.168.2. #僅允許192.168.2 網段中的主機存取此 Samba 伺服器。
一般建議讀者除了使用帳號/密碼認證外,還可使用此參數來限制能存取的主機,更能確保 Samba 伺服器的安全。

Client code page[code 編號]
設定字元編碼,如果需要儲存以中文為檔名 的檔案,建議可設為 950,以避免中文檔名變成亂碼。
[名稱]

設定分享的資源區段,名稱可自取。

comment [字串]
說明此分享資源的說明文字。

path [目錄名稱]
分享資源的所在目錄
如設定 path /tmp 即其它使用者可存取 /tmp目錄下的檔案。

browseable [yes|no]
是否可被微軟 Windows 系統的網路芳鄰瀏覽,如設為 yes 即表示利用 Windows 系統的網路芳鄰功能即可瀏覽此分享目 錄。

Writable [yes|no]
分享的目錄是否被允許寫入。

read only [yes|no]
分享的目錄是否為唯讀。

public  [yes|no]
是否要公開分享的目錄。

valid users [使用者名稱]
白名單設定,設定可使用此 Samba 伺服器所分享資源的使用者。

invalid users [使用者名稱]
黑名單設定,設定不可使用此 Samba 伺服器所分享資源的使用者。

▲ 表3: Samba 常見設定及說明

接下來將以 /share 為 Samba 伺服器的分享目錄,權限僅允許 admin 得以存取。

I. smb.conf 的範例設定

[global]
#指定工作群組的名稱,此名稱需與使用者所使用的工作群組名稱相同。
workgroup = WORKGROUP
#說明 Samba 伺服器的文字。
server string = Samba Server
#指定使用帳號/密碼的認證方式來控管。
security = user
#設定帳號/密碼資訊所存的檔案位置,在此為 /etc/smbpwd 。
smb passwd file /etc/smbpwd
#設定密碼需為加密過的型式,不得為明碼型式。
encrypt password true
#設定文字編碼為 950,支援繁體中文,以避免中文檔名發生亂碼。
Client code page 950
#描述此分享資源的說明。
comment = virus-protected /public directory
#分享目錄為 /share 。
path = /share
#可以利用網路芳鄰的功能來瀏覽此分享資源。
browseable = yes
#設定可寫入此目錄。
writable = yes
#設定可使用此分享資源的使用者,在此例中為只有 admin 使用者可使用。
valid users admin
#設定是否為唯讀 。
read only = no
#是否要公開此分享資源,在此例中設定為公開。
public = yes

設定帳號及密碼

建立名為 smbpasswd 的密碼檔案:

$ touch /etc/smbpasswd

記得將該密碼檔設定為只有 root 才有讀寫的權限:

$ chmod 600 /etc/smbpasswd

利用 smbpasswd 指令建立名為 "admin" 的使用者:

$ /usr/local/samba/bin/smbpasswd -a admin -c /usr/local/samba/etc/smb.conf

接下來,請按照指示設定相關資訊。

設定完成後可利用下列指令檢查是否已寫入相關的帳號及密碼。

$ cat /etc/smbpasswd

啟動 Samba 伺服器

在重新啟動 Samba 伺服器之前,讀者可利用下列指令檢查 Samba 伺服器設定檔是否有錯誤。

$ testparm  -C /usr/local/samba/etc/smb.conf

如果沒有錯誤,則用下列指令以常駐程式的方式啟動 Samba 伺服器。

$ nmbd -D -s /usr/local/samba/etc/smb.conf
$ smbd -D -s /usr/local/samba/etc/smb.conf

啟動完成後,讀者可利用「網路芳鄰」瀏覽分享的資源(本例的分享資源為 /share 目錄),並以先前設定的帳號及密碼(僅允許 admin 帳號登入)登入。

安裝 Samba 的圖形化管理介面 - SWAT

對於不習慣文字介面編輯設定檔的讀者,Samba 伺服器貼心提供 Web 管理程式 - SWAT。

SWAT 依賴超級常駐程式 (super-daemon),如 inetd 或 xinetd 來啟動。由於目前 Linux 系統大多使用 xinetd 程式,所以接下來將以 xinetd 為範例。

xinetd 主要利用 /etc/xinetd.d 目錄下的設定檔決定啟動的服務,因此我們在 /etc/xinetd.d 目錄下新增一個名稱為 "swat" 的檔案如下:

service swat
{
port = 901
socket_type = stream
wait = no
only_from = 192.168.2.0 # 允許使用的來源IP資訊,讀者可自行針對本身實際系統環境設定。
user = root
server = /usr/local/samba/sbin/swat # 指定 SWAT 主程式的所在位置。
log_on_failure += USERID
disable = no #啟動此服務。
}

設定完成後,僅需利用下列指令來重新啟動 xinetd 即可。

$ /etc/init.d/xinetd restart

接下來,讀者可利用瀏覽器開啟 URL 瀏覽,如 https://192.168.2.1:901(SWAT 是運作在 901 埠),正常可看到如下畫面:

圖1: SWAT 的畫面

▲ 圖1: SWAT 的畫面

結論

筆者僅簡單說明 Samba 伺服器,其實 Samba 可搭配其他相關模組,如利用 Clamav(Linux 系統下著名的防毒軟體)實作 Samba 伺服器的即時病毒掃描功能,或利用 Linux Software RAID 實作磁碟陣列。甚至組合相關開放源碼社群的資源,也可以實作出媲美商業化的 NAS 系統,或者直接採用開放源碼社群成熟且完整的 FreeNAS 解決方案。

後續文章將繼續為讀者介紹如何擴充 Samba 的功能,例如即時惡意程式掃描等。




自由軟體鑄造場電子報 : 第 183 期 GPL 條款對於衍生程式的判定標準與其授權拘束性的擴散範圍(下)

分類: 技術專欄