使用Samba 架設中小企業File Server
以開放原始碼打造資源分享環境

2008-07-24
中小企業成長到一定規模後,使用File Server來儲存企業內部的重要資料將是一種必然的趨勢。使用Linux和Samba來架設儲存環境,不只經濟實惠,還有系統穩定度高和系統硬體規格需求低的好處。
微軟中所使用的「網路芳鄰」,在Linux內需要Samba這個軟體才能互通使用。在設定好yum的RHEL5.1上安裝Samba軟體相當簡單。使用指令「yum list | grep samba」找到相關軟體後,再執行指令「yum install -y samba」即可安裝Samba Server應用程式。

Samba啟停和程式名稱

安裝好Samba之後,接著啟動samba daemon。執行指令「/etc/init.d/smb restart」即可重新啟動samba服務,若畫面中出現FAILED訊息,代表是第一次啟動。接著使用「chkconfig smb on」指令設定下次開機時自動啟動samba服務,而指令「chkconfig --list smb」可以用來觀察目前的設定情況。此時若執行指令「ps ax | grep mbd」,則可以觀察到smbd與nmbd這兩個程序正在運行中。

Samba聆聽埠號與防火牆設定

Samba服務聆聽的埠號包括UDP 137、138以及TCP 139、445,可執行指令「netstat -na | egrep -w "13[7-9]|445"」來觀察。在「/etc/services」內就可以找到這些埠號的定義,從中可以發現Linux上執行的Samba係使用「NETBIOS over TCP/IP」通訊方式。下圖是使用指令「egrep -w "13[7-9]|445" /etc/services」查看services檔案的情形。

若希望對外提供Samba服務,須注意預設的防火牆設定可能會擋住服務。修改防火牆設定的辦法很簡單,先執行指令「system-config-securitylevel」,然後勾選其中的「Samba」選項,再按下〔OK〕按鈕。

Samba Server預設值

剛啟動的Samba服務,其預設值設定主要包含兩大部分:Samba的設定檔案smb.conf(位於「/etc/samba/」目錄)以及測試此檔案參數的「testparm」指令。

smb.conf介紹

開啟smb.conf後,會發現一堆的註解(#或;開頭),包括[global]區段(全域設定)和其他區段(分享檔案與印表機)。使用指令「testparm」來觀察是最方便不過了。

全域設定 檔案與印表機分享設定
Samba整體設定 分享檔案 分享印表機
[global]區段 例如[homes]區段 例如[printers]區段

testparm指令應用

testparm指令中常用的「-v」選項(詳細模式),可以顯示出所有[global]區段的設定變數與數值。下圖為執行指令「testparm -v | grep netbios」來輸出過濾關鍵字「netbios」的情形,其中「-v」選項所顯示的訊息較多,且一般是[global]區段設定參數。

使用testparm的另一個好處是,在設定Samba時若不小心輸入錯誤的設定參數,將會出現警告訊息。以下圖為例子,若正確參數為「netbios name = MYSERVER」卻輸入錯誤成「netbios names = lucky2」(name多了s),在執行testparm指令時,將會出現以下的警告訊息(錯誤的設定則會被忽略)。

Unknown parameter encountered: "netbios names"
Ignoring unknown parameter "netbios names"

網芳主機名稱與工作群組設定參數

與Samba網芳主機名稱和工作群組相關的設定,在[global]區段中netbios name和workgroup這兩個參數內。netbios name就是網路芳鄰中出現的主機名稱,如果沒有特別指定,預設值會是「短的主機名稱」,例如完整的主機名稱是「lucky.ol」,而短的主機名稱為「lucky」,因此本例的netbios name是「lucky」。

在預設情況下,參數不會出現在執行「testparm」指令後的輸出結果,所以必須加上「-v」選項才會顯示預設值的全部參數與數值,例如「netbios name = LUCKY」。若搭配「grep」一起使用會更好,例如「testparm -v | grep netbios」。

此外,「hostname」指令搭配「-s」(短的主機名稱)、「-f」(完整的主機名稱)等選項一起執行,則可用來顯示或修改主機名稱。但修改主機名稱時,須具備root權限。

NOTE
netbios name沒有大小寫之分(符合Windows習慣)

工作群組(Workgroup)在尚未使用到網域(Domain)的情況下,說穿了其實是將主機分門別類在不同的目錄而已,如果想在Samba中調整工作群組,可以到[global]區段內修改workgroup參數。

使用網路芳鄰客戶端工具

啟動Samba後,就可以利用Windows網芳連線進行測試。一般使用者在Windows內點選「網路芳鄰」找到相關工作群組和主機,就可以看到該主機所提供的分享資料夾。

使用Windows網路芳鄰

較快速的網路芳鄰使用方法是按下+組合鍵(或者點選功能表【開始】→【執行】),然後輸入兩個反斜線\\以及對方的主機名稱或IP,例如「\\lucky」,再按下按鍵即可。隨後輸入Samba的登入帳號和密碼,就可以開始存取分享資料夾。如果想要修改Samba Server上的帳號密碼,可以使用「smbpasswd」指令來設定。

使用Linux網路芳鄰

在Linux上也可以透過圖形介面存取網路芳鄰,在Gnome桌面環境下依序點選功能表【位置】→【連接到伺服器】,就會出現如下圖的對話框。

至於透過Linux指令介面來存取網芳,則較為快速精簡,例如使用指令「smbclient -L lucky」,即可列出網芳主機名稱lucky(或使用IP)所提供的分享。

公開唯讀的分享

設定一個公開唯讀的分享,在一般中小企業十分常見,因此接下來就將其與匿名存取的ftp目錄擺在一起。

Ftp Server相關介紹

RHEL5.1預設並未安裝vsftpd套件。可使用指令「yum install -y vsftpd」進行安裝,安裝好了之後,ftp的家目錄(「/var/ftp/」)就會自動產生了。

如果需要開放匿名ftp功能,則使用指令「/etc/init.d/vsftpd restart」來啟動vsftpd,並透過指令「chkconfig vsftpd on」使其開機時自動啟動,並使用lftp Client端做一些基本的測試。

同樣必須留意防火牆是否擋住服務。可使用指令「system-config-securitylevel」開啟設定介面,然後勾選「FTP」選項,再按下〔OK〕。

自訂公開唯讀分享

切換至「/etc/samba/」目錄內,開啟smb.conf,然後來到檔案的最後,模仿設定檔內的範例,自訂一個如下的分享。該設定的涵意是開了一個名為「pub」的分享,而Server上的存放資料路徑是「/var/ftp」。

[pub]
path = /var/ftp

NOTE
Samba開放出來的分享預設為「唯讀」且「不公開」

使用指令「/etc/init.d/smb restart」重新啟動Samba Server後,使用Linux或Windows來測試,發現都沒有足夠的權限來存取這個資源,因為預設「不公開」(不允許訪客存取)。

下頁圖為使用Linux smbclient指令測試存取的情況。先用指令「smbclient -L lucky」(lucky是網芳主機名稱)列出分享,將會看到pub這個網路磁碟資料。接著使用指令「smbclient //lucky/pub」測試存取pub分享,則存取被拒(NT_STATUS_ACCESS_DENIED)。

接下來,介紹一個常用參數「public」(等同於「guest ok」參數),表示要公開這個分享。再次開啟smb.conf,找到先前撰寫的[pub]區段,加入「public = yes」或「guest ok = yes」這一行設定。

修改smb.conf之後重新啟動Samba,並再次進行測試。在Linux作業系統上使用smbclient可以成功存取(唯讀),但是在Windows嘗試存取卻失敗。Windows存取公開分享失敗的原因,在於Windows無法匿名登入Samba Server,也就是Windows希望要有帳號密碼才能登入網路芳鄰主機。建議更改[global]區段內的「map to guest」參數,將預設值「map to guest = Never」改成「map to guest = Bad User」後,Windows應該就可以順利存取分享了。

NOTE
smbclient連線成功後,可使用類似ftp的指令來存取,例如以mget來下載、利用mput上傳等等。

下圖為修改「map to guest」參數的情況,若設定檔內沒有「map to guest」這個參數,請自行加入,並將此參數放在[global]區段內。設定好了之後,Windows就可以順利地「匿名登入」Samba Server。

如果執行指令「man smb.conf」開啟說明文件,再以關鍵字「map to guest」進行搜尋,就會找到下圖這一段解釋。

若改成Bad User這個數值,在使用錯誤的帳號登入時,將會被Samba Server自動對應成guest帳號。

存取的身分與權限

存取Samba Server時,使用者在Samba將是一個「身分」,然後在Linux對應到一個身分。以匿名存取來說,在Samba時的身分是「guest」,而在Linux的身分則是「nobody」,這可由執行指令「testparm -v | grep guest」後找出「guest account = nobody」而得知。所以,遇到存取失敗時,要先想想Samba身分是否能夠正常存取(通常是定義在smb.conf內),接著才是對應到Linux身分能否正常存取(也就是Linux檔案系統權限為755、644等等)。

預設的[homes]區段

在預設的smb.conf設定中有個[homes]區段,這個區段設定的作用是「用某個使用者帳號登入Samba就會出現某個帳號的家目錄可存取」,例如使用foo帳號登入Samba就會出現foo網路磁碟以供存取,這個網芳分享實際存取的是Samba主機上foo的家目錄。

建立Samba帳號與密碼

在建立Samba帳號與密碼期間,把握幾個原則比較不容易失敗:
1.先有Linux帳號,再建立Samba帳號密碼。
2.第一次建立Samba帳號密碼,須搭配「-a」選項(但變更Samba密碼時毋需「-a」選項)。

接著,以實際案例進行說明。先使用指令「useradd foo」建立帳號foo,接著執行指令「smbpasswd -a foo」建立Samba帳號foo,並設定密碼。

指令測試方法是執行「smbclient -L lucky -U foo」(「-U」選項後面接的是帳號foo)。輸入正確密碼之後,就會看到foo的網芳磁碟分享名稱(註解為Home Directories)。

TIPS
執行指令「smbpasswd-help」後會顯示基本的說明。

來自於SELinux安全性阻擋

使用指令「smbclient //lucky/foo -U foo」存取先前出現的foo分享時會被SELinux阻擋,必須包含「setsebool -P samba_enable_home_dirs=1」這行設定來開啟這個SELinux布林值,存取才會正常。

TIPS
如果想在「/var/log/messages」內包含SELinux的相關資訊,setroubleshootd必須開啟,可使用指令「/etc/init.d/setroubleshoot restart」啟動

Windows測試存取注意事項

因為已經將Windows存取的帳號對應成訪客(map to guest),此時欲換成以foo身分來登入的話,可按下+組合鍵再輸入兩個反斜線「\\lucky\foo」,然後按下,接著在跳出的視窗內輸入正確的帳號和密碼即可。如果「map to guest」的設定是先前的預設值Never,直接輸入正確的帳號和密碼登入即可。

如果無法登入成功,可能是受限於「Windows存取同一台網芳不能突然切換帳號」的緣故,如下圖的錯誤訊息)。因為登入pub目錄時已經使用帳號guest,可能無法切換成foo身分。欲解決這個問題,最好的方法是登出Windows再登入一次。若不想登出,可試著輸入DOS指令「net use * /delete」來中斷先前的連線。

點圖放大

只登入自己的家目錄

在testparm訊息中,[homes]區段為設定「登入時只看到自己的家目錄」;[printers]區段(類似[homes]區段)則是「顯示所有系統上的印表機(CUPS印表機)」,本例因為沒有建立任何CUPS印表機,所以不會顯示出來。

[homes]與[printers]兩者皆因「browseable = no」設定的關係而瀏覽不到(隱藏起來),而且[homes]區段預設的path參數是設定成使用者家目錄(?),例如帳號foo登入時,存取「/home/foo」目錄。因此自訂分享的名稱(例如先前設定的[pub])請勿與Samba帳號名稱(或印表機名稱)一樣。

使用圖形介面SWAT 設定Samba

Samba提供一個圖形化的設定介面—SWAT(Samba Web Administration Tool)。SWAT是以xinetd/inetd為基礎的啟動方式,因此必須安裝並啟動xinetd。

此外,SWAT預設的埠號是901並採TCP通訊協定,所以必須以連結網址「http://localhost:901/」的方式來使用SWAT。

安裝SWAT

先使用指令「yum list | grep samba」找出SWAT套件名稱「samba-swat」,接著執行指令「yum install -y samba-swat.i386」開始安裝SWAT。

使用SWAT

執行指令「man swat」就可以找到與SWAT相關的解說。使用yum來安裝SWAT,就會自動處理相依性,並順道安裝好xinetd。接著介紹如何使用SWAT。

STEP1→先執行指令「chkconfig --list」,從每一行的尾端可以觀察到swat是以xinetd為基礎的啟動方式。然後使用指令「chkconfig --list xinetd」觀察xinetd是否開機時自動啟動。

STEP2→執行指令「chkconfig swat on」設定SWAT開機自動啟動。隨後使用指令「/etc/init.d/xinetd restart」重新啟動xinetd,讓SWAT啟動設定生效。若畫面上出現FAILED訊息,這只是表示SWAT從未曾啟動過,不會有任何影響。

STEP3→接著在Samba Server本機啟動Firefox網頁瀏覽器,並連結至網址「http://localhost:901/」,然後輸入root的帳號和密碼即可開始使用。此時,可以使用指令「netstat -na | grep -w 901」查看埠號901是否正在聆聽。也可以利用指令「system-config-securitylevel」調整防火牆設定,但遠端使用時必須先開啟tcp 901埠。

TIPS
若要從遠端控制SWAT,防火牆記得要開放901 tcp埠,並開啟xinetd預設針對SWAT的防禦,如上圖中前兩行的設定。

在檔案「/etc/xinetd.d/swat」內有一行「only_from = 127.0.0.1」設定,如果想要遠端使用SWAT,必須用#字號將這一行註解起來或刪除,並重新啟動xinetd服務。

參數設定範例

Samba設定參數繁多,以下透過案例來介紹參數設定。

隱形分享

分享區段名稱若以$結尾,例如[pub$],Windows圖形介面就看不到這個分享,但如果猜對分享名稱還是可以存取。這種隱形的方式,在使用指令介面來存取時就無所遁形了。

NOTE
這種以$結尾的隱形分享早就出現在Windows NT Server與Windows 2000 Server所預設的磁碟分享,C槽是C$、D槽則為D$。

如果想要真正隱形,則必須使用參數「browseable = no」(完全看不到,就算隱形)。如此一來,放在各自的分享區段就可以將其區段分享隱形起來,這同時也是[homes]區段家目錄之所以能夠隱形的原因。

下圖是將pub區段設定為隱形所做的一個測試畫面,從中可以會發現客戶端沒有列出pub這個分享名稱。但是如果知道pub這個分享名稱,還是可以存取。

啟用或停用

分享區段有一個啟用或停用的開關,相關參數為available,若設定成「yes」代表啟用。若遇到需要暫時停用此分享,只要將此分享區段設定成「available = no」即可,如此就不必輸入一些註解符號,而下次想要再開啟時,也不必再一一刪除這些註解符號,省了不少的麻煩。

設定唯讀或讀寫、公開或不公開

在分享區段內有一個常用的參數,「read only」(唯讀)與「writeable」(能夠寫入)是「反義詞」,二擇一使用即可。

至於允不允許訪客使用、公開或不公開,public參數與guest ok是同義詞,同樣也是二選一。

唯讀 read only = yes或writeable = no
讀寫 read only = no或writeable = yes
公開 public = yes或guest ok = yes
不公開 public = no或guest ok = no

下圖為SWAT設定[pub]區段分享的頁面,其中包含「read only」與「guest ok」相關欄位設定。

與安全性相關的設定參數

Samba針對安全性,提供了一些相關的參數以供調整,以下分別加以說明:

與interfaces相關的設定

執行指令「testparm -v | grep interfaces」後,可以發現兩個與interfaces相關的設定參數,Samba預設值會聆聽所有介面。

假如遇到Samba Server還兼任NAT Server的情形,一定會有一個介面(或是IP)是對外服務的,而Samba往往只對內部網路服務而不對外提供網際網路服務,所以建議關掉對外服務的介面(Interface)聆聽。

例如eth0是對外的介面、eth1是對內介面,就可以設定成「interfaces = eth1, lo」和「bind interfaces only = yes」。

設定好了之後,可使用「netstat」指令來觀察聆聽狀態,確認設定是否生效。例如,下圖聆聽的IP是192.168.X.X而非0.0.0.0。

hosts allow與hosts deny

假設已經聆聽了某個介面(或IP)但須要設定Host-Based Allow/Deny時,可利用Samba本身內建的「hosts allow」與「hosts deny」機制。

這個「hosts allow deny」機制與TCP Wrappers(「/etc/hosts.allow」和「/etc/hosts.deny」)相當類似,規則也一樣。有此可見,TCP Wrappers很重要。它可以設定在global區段(全部會受影響)或是特定的分享區段。執行指令「man smb.conf」,就可以找到可供參考的設定範例。

Samba的ACL建議

使用Windows來設定那一位使用者可以存取哪些分享,以及其分享的權限大小(讀寫或唯讀),很多人習慣採用ACL(Access Control List)的方式。

在Samba的smb.conf檔案內容內,其各自分享區段可採用下列的設定參數來處理:

invalid users 無效使用者 這些使用者不能使用此分享
valid users 有效使用者 這些使用者可以使用此分享
admin users 最大權限使用者 這些使用者完全控制此分享
read list 唯讀使用者列表 這些使用者只能唯讀此分享
write list 讀寫使用者列表 這些使用者可讀寫此分享

以上這些設定條件,在基礎版(Basic)SWAT設定各自分享的介面內都找得到,若切換到進階版(Advanced)介面,可以設定的參數還更多。

Samba的ACL權限通過之後的Linux權限也必須注意,例如當Samba的帳號foo在Linux帳號中也對應到foo權限時,要特別留意能否存取相關分享出來的檔案與目錄,尤其是Linux檔案系統內755、644此類的權限設定。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!