使用 Samba 架设中小企业共享文件服务器

来源:本站原创 服务器技术 超过834 views围观 0条评论

作者:徐秉義(Albert Hsu

中小企業在成長到一定規模後,擁有 File Server 應用於儲存企業內部重要資料是基本配備,使用 Linux+Samba 來架設不只經濟實惠、系統穩定度高且系統硬體規格需求低的好處。

Samba 基礎介紹

在微軟使用『網路芳鄰』在 Linux 需要 Samba 這個軟體才能辦到,接下來先從基本的介紹開始吧。

Samba 軟體安裝

設定好 yum 的 RHEL5.1 欲安裝 Samba 軟體是相當方便的,使用指令「yum list | grep samba」找到相關軟體後,再使用指令「yum install -y samba」安裝 Samba Server 應用程式。

clip_image002

溫馨提示:在 RHEL5.1 使用 yum 需要先行設定,請參考筆者 yum 相關文件。

Samba 啟停及程式名稱

安裝好軟體之後,就是要啟動 samba daemon 了,使用指令「/etc/init.d/smb restart」重新啟動 samba 服務(畫面上的 FAILED 是因為從未曾啟動過)。

使用「chkconfig smb on」指令設定下次開機自動啟動 samba 服務,指令「chkconfig –list smb」觀察設定情況。

指令「ps ax | grep mbd」觀察到 smbd 與 nmbd 這兩個名稱的程序正在運行。

clip_image004

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 檔案的內容。

clip_image006

想要讓 Samba 能夠對外服務,要小心預設防火牆會擋住服務的,指令「system-config-securitylevel」設定將 Samba 打勾即可。

clip_image008

Samba Server 預設值設定

讓我們先來了解一下,剛啟動的 Samba 預設值設定,主要介紹 Samba 設定檔案 smb.conf(位於 /etc/samba/ 目錄)以及測試此檔案參數的「testparm」指令。

smb.conf 基礎介紹

開啟 smb.conf 會發現一堆的註解(# 或 ; 開頭),主要有 [global] 區段(全域設定)以及其他區段(分享檔案與印表機);使用指令「testparm」來觀察最為方便。

全域設定

檔案與印表機分享設定

Samba 整體設定

分享檔案

分享印表機

[global] 區段

例如:[homes] 區段

例如:[printers] 區段

clip_image010

testparm 指令應用

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

clip_image012

testparm 另一個好處是,當我們在設定 Samba 時,不小心『輸入錯誤的設定參數』,會被她檢查報告出來,以下圖的例子來說:正確參數應該是『netbios name = MYSERVER』輸入成錯誤的『netbios names = lucky2』(name 多了 s),在執行 testparm 指令的期間,會出現以下訊息(錯的設定會被忽略)。

Unknown parameter encountered: "netbios names"

Ignoring unknown parameter "netbios names"

clip_image014

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

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 權限)。

溫馨提示:netbios name 沒有大小寫之分(符合 Windows 習慣)。

clip_image016

工作群組(workgroup)在尚未使用到網域(Domain)的情況下,說穿了其實是將主機分門別類在不同的目錄而已;下圖是 Windows 網路芳鄰的情況。

Samba 要調整工作群組的話,是在 [global] 區段內的 workgroup 參數即可。

clip_image018

網路芳鄰客戶端工具使用

在 Samba 啟動後,就可用 Windows 網芳連線過來作測試,一般使用者在 Windows 點選『網路芳鄰』找到相關工作群組以及主機,就可以看到此主機所提供的分享。

使用 Windows 網路芳鄰

較快速的網路芳鄰使用方法是『微軟鍵+R』(也就是【開始】→【執行】)輸入兩個反斜線 \\ 接著對方的主機名稱或 IP 然後〔Enter〕即可。

例如下圖的:「\\lucky」

clip_image020

預設值的 Samba 需要帳號密碼才可以存取分享,意思是不允許訪客帳號存取資源。

溫馨提示:Samba Server 上面的帳號密碼是使用「smbpasswd」指令來設定(後續介紹)。

clip_image022

使用 Linux 網路芳鄰

Linux 也有圖形介面存取網芳的方式,在 Gnome 桌面環境下的選單【位置】→【連接到伺服器】有著如下圖的對話框。

clip_image024

Linux 指令介面存取網芳有著快速精簡的優勢,例如使用指令「smbclient -L lucky」列出網芳主機名稱 lucky(在此也可以用 IP)所提供的分享。

clip_image026

公開唯讀的分享

設定一個公開唯讀的分享,在一般中小企業十分常見,我們就順手將他跟匿名存取的 ftp 目錄擺在一起吧!

ftp Server 相關介紹

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

clip_image028

如果有需要開放匿名 ftp 功能的話,就使用「/etc/init.d/vsftpd restart」啟動 vsftpd、指令「chkconfig vsftpd on」開機自動啟動,使用 lftp Client 端做一些基本的測試。

clip_image030

同樣小心防火牆擋住服務,使用指令「system-config-securitylevel」將 ftp 勾選後確定即可。

clip_image032

自訂公開唯讀分享

開啟 smb.conf(位於 /etc/samba/)來到檔案的最後,模仿設定檔內的範例自訂一個分享如下:

[pub]

path = /var/ftp

意思是開了一個分享名為 pub,存取 Server 上存放資料的路徑為 /var/ftp。

溫馨提示:預設值 Samba 開放出來的分享是『唯讀』且『不公開』

clip_image034

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

下圖是使用 Linux smbclient 指令測試存取,指令如下:

先用指令「smbclient -L lucky」(lucky 是網芳主機名稱)列出分享,會看到 pub 這個網路磁碟資料。

接著使用指令「smbclient //lucky/pub」測試存取 pub 分享,則存取被拒(NT_STATUS_ACCESS_DENIED)。

clip_image036

接下來介紹一個常用參數『public』(同等於 guest ok 參數)意思是要公開這個分享。

再次開啟 smb.conf 於先前撰寫的 [pub] 區段,加上 public = yes(也可寫成 guest ok = yes)。

clip_image038

修改完 smb.conf 重起 Samba 後做測試,Linux 使用 smbclient 可以存取成功(唯讀)但 Windows 卻會失敗。

溫馨提示:smbclient 連線成功後,使用類似 ftp 指令,像是 mget 下載、mput 上傳等等。

clip_image040

Windows 存取公開分享失敗的原因,主要是 Windows 無法匿名登入 Samba Server(也就是 Windows 希望要有帳號密碼才登入網路芳鄰主機),筆者解決這個問題的方式,建議更改 [global] 區段 map to guest 參數,由預設值『map to guest = Never』改成『map to guest = Bad User』,這樣 Windows 即可順利存取公開分享。

溫馨提示:下圖為修改 map to guest 參數的情況,若設定檔內沒有 map to guest 這個參數請自行加上即可,並將此參數放置於 [global] 區段內。

clip_image042

這樣 Windows 就可以順利的『匿名登入』Samba Server。

clip_image044

溫馨提示:指令「man smb.conf」說明文件中搜尋『map to guest』會找到下圖這一段解釋,改成 Bad User 這個數值的話,錯誤的帳號登入會自動被 Samba Server 對應成 guest 帳號。

clip_image046

存取的身份與權限

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

clip_image048

預設 [homes] 區段

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

建立 Samba 帳號與密碼

在建立 Samba 帳號與密碼期間,把握幾個原則比較不容易失敗:

一:先有 Linux 帳號,接著建立 Samba 帳號密碼。

二:第一次建立 Samba 帳號密碼需搭配 -a 選項(變更 Samba 密碼則不需要 -a 選項)。

實際案例如下:

使用指令「useradd foo」建立帳號 foo。

使用指令「smbpasswd -a foo」建立 Samba 帳號 foo 並設定密碼。

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

clip_image050

溫馨提示:指令「smbpasswd –help」有些基本的說明。

來自於 SELinux 安全性阻擋

先前看到的 foo 分享,當我們使用指令「smbclient //lucky/foo -U foo」去存取這個資源的時候,會被 SELinux 阻擋住(在筆者 SELinux 相關文件中有介紹過),需使用「setsebool -P samba_enable_home_dirs=1」開啟這個 SELinux 布林值,存取才會正常(如下圖)。

溫馨提示:欲在 /var/log/messages 內有 SELinux 相關資訊的話,setroubleshootd 必須是開啟的(使用指令「/etc/init.d/setroubleshoot restart」啟動)。

clip_image052

Windows 測試存取注意事項

因為我們已經將 Windows 存取的帳號對應成訪客(map to guest),此時欲換成用 foo 身份來登入的話,就使用『微軟鍵+R』輸入兩個反斜線 \\lucky\foo 然後〔Enter〕跳出帳號密碼視窗輸入正確即可。

如果 map to guest 的設定是先前預設值 Never 的話,就直接輸入正確的帳號密碼登入即可。

溫馨提示:如果無法登入成功,可能是受限於『Windows 存取同一台網芳不能突然切換帳號』的原因(如下圖的錯誤訊息);因為登入 pub 目錄已經是使用帳號 guest 有可能不能切換成 foo 身份。

clip_image054

欲解決上述問題的最好方法是 Windows 登出再登入一次即可,若是真的很不想登出可試試 dos 指令方式「net use * /delete」來中斷先前的連線。

clip_image056

誰登入看到誰的家目錄

在 testparm 訊息中,[homes] 區段設定而使得『誰登入看到誰的家目錄』;[printers] 區段(類似 [homes] 區段)則是『顯示所有系統上面的印表機(CUPS 印表機)』(因為我們沒有建立任何一台 CUPS 印表機,所以一台都不會顯示)。

[homes] 與 [printers] 兩者皆因『browseable = no』而瀏覽不到(也就是隱藏起來),且 [homes] 區段預設的 path 參數是設定成使用者家目錄(~),例如:帳號 foo 登入時,存取到 /home/foo 目錄。

clip_image058

溫馨提示:因此自訂分享的名稱(例如先前設定的 [pub])請勿與 Samba 帳號名稱(或印表機名稱)一樣。

Web-Based 設定 Samba:使用 SWAT

Samba 有個 Web-Based 設定介面名叫『SWAT』(Samba Web Administration Tool),欲使用 SWAT 的基本知識如下:

一: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」將他裝起來。

clip_image060

使用 SWAT

先前提到的使用 SWAT 兩點的注意事項在「man swat」都有解說(只可惜是英文的);關於事項一已經被 yum 自動處理相依性順道把 xinetd 也安裝起來,接下來就是使用的部份。

指令「chkconfig –list」尾端觀察出 swat 是以 xinetd 為基礎的啟動方式。

指令「chkconfig –list xinetd」觀察 xinetd 開機自動啟動。

clip_image062

指令「chkconfig swat on」設定 swat 開機自動啟動。

指令「/etc/init.d/xinetd restart」重新啟動 xinetd 使 swat 啟動設定生效(畫面上的 FAILED 是因為從未曾啟動過)。

在 Samba Server 本機使用 firefox 開啟網址 http://localhost:901/ 輸入 root 帳號密碼即可使用。

指令「netstat -na | grep -w 901」觀察埠號 901 在聆聽。

clip_image064

指令「system-config-securitylevel」則是用來調整防火牆設定(遠端使用開啟 tcp 901 埠)。

在檔案 /etc/xinetd.d/swat 內有一行『only_from = 127.0.0.1』如果要遠端使用 swat 的話,需將這行用#字號註解起來(或砍掉),並重新啟動 xinetd 服務。

溫馨提示:若要開放遠端控制 SWAT 的話,防火牆記得要開 901 tcp 埠,並開啟 xinetd 預設針對 swat 的防禦(如上圖及上兩行所述)。

SWAT 登入後的首頁。

clip_image066

好用參數設定範例

Samba 設定參數繁多,底下利用筆者經驗以及案例來介紹參數設定,希望提高設定實用性。

隱形分享

將分享區段名稱取成 $ 結尾(例如:[pub$])這樣子 Windows 圖形介面就會看不見這個分享(但是猜對分享名稱還是可以存取的喔!)這種隱形一使用指令介面存取就會看得到了(立即破功)。

溫馨提示:這 $ 結尾的隱形分享早就出現在 Windows ServerWinNT Win2K)所預設的磁碟分享(C槽是 C$、D槽是 D$)。

真正的隱形是使用參數「browseable = no」(看不到,也就是隱形)放在各自的分享區段就可以使得那個區段分享隱形起來,這同時也是 [homes] 區段家目錄隱形的原因。

下圖是將 pub 區段設定隱形所作的一個測試畫面,會發現客戶端列不出 pub 這個分享名稱但是知道 pub 這個分享名稱的話還是可以存取。

clip_image068

啟用還是停用

針對分享區段有個啟用/停用的開關,參數為 available 若設定成 yes 是啟用的意思。

這樣我們若遇到需要暫時停用此分享,只要將將此分享區段的『available = no』即可,這樣子我們就不用輸入一堆的註解符號,要再開啟時,也不用拿掉一堆註解符號。

clip_image070

唯讀還是讀寫;公開還是不公開

在分享區段內有個常用參數 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 相關欄位設定。

clip_image072

安全性相關的設定參數

Samba 針對安全性有些相關參數可供調整,列舉如下:

interfaces 相關的設定

在指令「testparm -v | grep interfaces」可找到兩個 interfaces 相關的參數可供設定,預設值 Samba 是聆聽所有介面的。

clip_image074

假如遇到 Samba Server 還需要兼當 NAT Server 時,勢必有個介面(或是 IP)是對外服務的,而往往 Samba 只對內部網路服務不對網際網路服務,這時關掉對外服務的介面(interfaces)的聆聽是還蠻不錯的。

例如:eth0 是對外介面、eth1 是對內介面,所以設定成『interfaces = eth1, lo』且『bind interfaces only = yes』之後在用 netstat 指令來觀察聆聽狀態(例如下圖聆聽 192.168.X.X 的 IP 而非 0.0.0.0)確認設定是否生效。

clip_image076

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」內有設定範例可供參考(如下圖)。

clip_image078

Samba ACL 建議

用 Windows 來設定針對誰可以存取哪些分享以及分享的權利大小(讀寫或是唯讀)應該很習慣 ACL(Access Control List)方式,Samba 應該是在 smb.conf 的各自分享區段使用以下這些設定參數來處理:

invalid users

無效使用者

列進去的使用者不能使用此分享

valid users

有效使用者

列進去的使用者可以使用此分享

admin users

最大權限使用者

列進去的使用者完全控制此分享

read list

唯讀使用者列表

列進去的使用者唯讀此分享

write list

讀寫使用者列表

列進去的使用者讀寫此分享

這些可以在 SWAT 設定各自分享的介面上看到,基本版(Basic)即可;進階版(Advanced)能設定的參數更多。

clip_image080

溫馨提示:Samba ACL 權限通過之後的 Linux 權限也是需要注意,例如:Samba 帳號 foo Linux 帳號也是對應到 foo 權限,能否存取相關分享出來的檔案與目錄也要特別注意(Linux 檔案系統 755644 這些權限設定)。

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=3353转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

您必须 [ 登录 ] 才能发表留言!