設置 SAMBA
DaveFernandes 撰寫
<<TableOfContents: execution failed [Argument "maxdepth" must be an integer value, not "[1]"] (see also the log)>>
由於防火牆(iptables)及 SELinux 保護,在 CentOS 上設置 Samba 是比較難。這其實是一件好事,因為安全性是非常重要,但要令 Samba 與伺服器的外界溝通,我們需要花點功夫及對它有所認識。
SAMBA 採用連接埠 137 — 139 及 445。為甚麼會是這些連接埠?讓我們看得再詳細一點。微軟的舊款主從通訊協議是 netbios。它的連接埠是 137、138 及 139。這款網絡設置依賴一台 netbios 伺服器(WINS)[Windows Internet Naming Service]來提供傳送給客戶端的名稱。換句話說,WINS 就是昔日的 DNS。它可以是一項非常不安全的服務,但設置卻很容易。如果你曾經採用過 net view 或 net use 這些指令,你便是使用 WINS 服務。
時移世易,WINS 被新進的 Active Directory(AD)所淘汰。這是微軟對 Novell 的 Networking 服務(NDS)的反擊,而它又是 Novell 對 UNIX 的 NFS 伺服器的反應。最大的分別就是 Active Directory 依賴一台 DNS 伺服器而不是 netbios。這意味著連接埠上的改動。微軟的 AD 服務改用 445 號埠(UDP 及 TCP)。現時,除非你就這個服務擁有一台 Windows 伺服器,否則 Windows 預設會採用 netbios,而你必須透過控制台內的「系統」圖示進行特別設置才能更改它。如果你不會採用 Netbios,你亦可以在 Windows 控制台的「網絡連線」圖示下的 tcp/ip 服務來停用它。再一次,這些設定都超越了這份文檔的範疇。
現在讓我們再次返回那些連接埠及 Samba。以下的清單詳細列出 Samba 在你的系統上運行時所需的連接埠。請注意一個 TCP 埠只是個服務埠。80 號埠是供網頁使用,而 22 號埠是供安全遠端連線(ssh)使用。UDP(用戶定義埠)是變種的 TCP 埠。這篇文章不會以解釋當中的分別作為焦點,但你可以輕易地在網上搜尋。現時你只需知道它們是有分別的。
(舊的系統)
- 137 號埠 —— UDP NetBIOS 命名服務(WINS)
- 138 號埠 —— UDP NetBIOS 資料包
- 139 號埠 —— TCP NetBIOS 工作階段(TCP)、Windows 檔案及打印機共享(這是最不安全的連接埠)
(Active Directory)
- 445 號埠 —— Microsoft-DS Active Directory、Windows 共享資源(TCP)
- 445 號埠 —— Microsoft-DS SMB 檔案共享(UDP)
為何要知道這一切呢?因為你須要知道為 SAMBA 開啟及不要開啟哪些連接埠,否則你便無法令它在 CentOS 上運作。
1. 放寬防火牆
請進到你的防火牆檔案 /etc/sysconfig/iptables。
請利用你所喜歡的文字編輯器(例如 vi、joe、或任何適用的程式)按實際情況在這個檔案加入下列數行。
如果你採用 Active Directory 並且想在 Samba 內單單啟用這個功能。
-A RH-Firewall-1-INPUT -s 192.168.10.0/24 -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT -A RH-Firewall-1-INPUT -s 192.168.10.0/24 -m state --state NEW -m udp -p udp --dport 445 -j ACCEPT
請不要被詞法嚇怕。我不會涵蓋整個防火牆,但你可理解一些基礎。
-s (ip 位址) 限定你的安裝上的 C 級 IP 位址。當然你可以按你的需要將它改至乎合你的網絡,這樣比開放你的網絡給整個世界存取更為安全。
--state NEW [基本上是開始新規則之意。]
-p [你想打開的 tcp 或 udp 連接埠。我已經為你下了功夫,因此你不必推斷該開啟哪種連接埠]
dport 445 [這是埠號。再一次我們針對 AD 採用 445 號埠。]
現在,如果你的 Samba 設置須要呼喚舊款的 netbios:
-A RH-Firewall-1-INPUT -s 192.168.10.0/24 -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT -A RH-Firewall-1-INPUT -s 192.168.10.0/24 -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT -A RH-Firewall-1-INPUT -s 192.168.10.0/24 -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
請留意大小寫,並分辨 tcp 和 udp,否則 samba 便會無法正常運作。這些都必須是正確的 —— 我便是從錯字裡學回來!
現在重新開啟防火牆。你可遁兩個途徑在 CentOS 下重新啟動服務
- service iptables restart
- /etc/init.d/iptables restart
任何一個方法都可行。你喜歡的話,亦可以重新啟動該台伺服器。
註:你可以利用 Redhat 的系統工具來編輯防火牆,但我們不建議如此做。它不會加入 -s 這個參數,並會打開所有 samba 連接埠 137 — 139 和 445,是我們不提倡的局面。
2. SELinux
希望你跟得上!接下來我們需要安撫 SELinux。SELinux 會基於安全理由自動阻止任何共享資源被瀏覽。眾多個解決方案中的等一個就是弄掉 SELinux —— 壞主意。其實要與這個優良的安全性功能合作並不困難。
setsebool 這個指令可以開啟或關閉 SELinux 的保障。你可以透過 getsebool -a 來取得一份完整的清單。這是由於較新的版本會增加更多安全性的功能。
getsebool -a | grep samba getsebool -a | grep smb
這樣大致上會為你列出所有 samba 選項,至少是最重要的那一些。留意我們利用 grep 這個指令進行過濾。如果你從未使用過 grep,你錯過了不少。grep 是在 linux 下一個值得認識的奇妙工具。
如果你想 samba 作為區域控制站:
setsebool -P samba_domain_controller on
如果你想分享預設的主目錄,請輸入這個指令:
setsebool -P samba_enable_home_dirs on
截至 CentOS 5.3 這是你所須做的一切。現在我們要利用 semanage 這個指令(SELinux 套件內的一部份)來打開你期望在網絡上分享的目錄。真的。沒有這樣做,當你啟動 samba 時只會穫得一堆空置的目錄,導致你誤信伺服器已經刪除你的所有資料!
semanage fcontext -a -t samba_share_t '/<共享目錄>(/.*)?' restorecon -R /<共享目錄>
有關主目錄的備註:
主目錄的意思就是唯有你 —— 用戶本人 —— 才能連線到你的主目錄。亳無疑問這個主目錄可以成為一個流動組態並且儲存用戶所建立的檔案。同樣地,你亦可以用 useradd 這個指令來定義主目錄到任何位置。容讓我繼續探討在這個問題。
試想像以下情況。你想去掉操作系統。你希望連同主目錄一併保留你的資料。可能嗎?可能,而且做法是這樣。
3. 建立資料分割區
請在硬盤上建立另一個分割區,然後掛載這個分割區及將它分享出來。再一次,箇中原因就是要將它與系統的檔案分隔開,好讓當你需要重裝操作系統時,這個資料磁區不會受你的動作所影響。(我們有這個經歷)另外請留意整個 CentOS 操作系統只佔用很少的空間。在這個範例裡我們為操作系統保留 12G(足夠有餘)並利用(/)這個掛載點。然後我們為開機(/boot)保留 100M,並將餘下的空間變為共享資源(/data)。然後我們將 /data 掛載在掛載目錄(/mnt/data)上。在大容量的硬盤上,你可以為客戶端提供一個龐大的 data 目錄。
讓我們應用一個範例。假設我們在 /dev/hda(首個硬盤)上建立了另一個分割區並稱它為 /data。以下是內中的步驟
mkdir /mnt/data mount /dev/hd3 /mnt/data
(你當然可以隨自己的喜好為這個目錄命名。這注意在我的範例中它是第三個分割區 /dev/hd3。視乎你如何設由置你的分割區,它在你的硬盤上可能會在不同位置。你可以利用 fdisk /dev/hda 及 p 這個命令來取得分割區清單。如果你從未使用過 fdisk,請先在一個測試用的硬盤上進行實驗。fdisk 是有點兒……危險)
現在請應用 semanage 這個指令在該目錄上。
semanage fcontext -a -t samba_share_t '/mnt/data(/.*)?' restorecon -R /mnt/data
如此,不論整個內的目錄的路徑有多深,它們的 SELinux 存取權都會被修改。請留意 -R 是遞迴的意思,你也可以在 rm 及 cp 等很多指令裡採用它。
此刻你應該為 /data 這個分割區設置權限及擁有者。這部份由你來決定。如果時間緊迫的話,你可以抉捷、不擇手段地完成這件事情。有關 chmod 及 chown 的細節,請參閱它們的使用說明,因為這些都超越了本篇文章的範疇。
chmod 770 -R /mnt/data chmod -R root:(主群組名稱) /mnt/data
這樣會將存取整個碟盤所有權限開放給它的擁有者及該群組。你可以此作為起點,按你的需要作出修訂。下一節將會告訴你如何在新分割區上設置該用戶及相關的主目錄。
4. 新增用戶
既然我們已經辦妥安全措施,是時候加入戶用了。在這個範例裡,我將會建立一位名叫 dave 的用戶(碰巧這是我的名字)
useradd dave -d /mnt/data/home/dave
(請留意 -d 這個選項)。它會在新的資料碟盤上建立我的主目錄,離開操作系統。這樣你便可兩全其美。
我們建議你為每位用戶設定以下權限。
chown (用戶): (用戶) /mnt/data/home/(用戶) chown dave:dave /mnt/data/home/dave
這些都應該由 useradd 這個指令所設置,但你仍可檢查它是否正確。至於用戶的存取權便再次由你作主。Ubuntu 有一個不錯的理念。所有用戶的權限都是以 chmod 640 來設定。
passwd dave (你選用的密碼) smbpasswd -a dave
(-a 的意思就是將它加進資料庫。當然,請勿用 -a 來修改一個現存的用戶)如果這是首位用戶,你的畫面將會出現錯誤信息。問題不大。它只是在建立一個新的資料庫,而你不會再看見這些信息。
最後一個行動(smbpasswd)將密碼加進 smbpasswd 資料庫內。這個密碼檔隨著時間而有所更改。現時它名叫 passtb.tdb,但它先前名叫 smbpasswd。你可以想像一個指令與檔案擁有相同名稱所帶來的混亂!
取後,請再新啟動 smb
service smb restart (或者 /etc/init.d/smb restart)
這樣便會運用新的改動。現在你可以你的安裝上設置 samba。外面有多不勝數的文章關於這個題目,本人曾考慮新增一篇 samba 的文章,但一篇短文實在無法涵蓋如此豐富的主題。你應該開始著手做了!
Translation of revision 19