Samba服務(wù)器安全指南
在本文中,將了解這些概念:
- 在防火墻級別配置進出 Samba 服務(wù)器的訪問
- 排除與 Samba 服務(wù)器有關(guān)的防火墻故障
本文幫助您準備 Linux Professional Institute (LPI) 的混合環(huán)境專業(yè)考試(302)的主題 315 下的目標 315.2。該目標的權(quán)值為 2。
先決條件
為了最有效地利用本系列中的文章,您應(yīng)該具備高級 Linux 知識,并需要準備一個 Linux 系統(tǒng),用它來練習(xí)本文介紹的命令。另外,您還要能訪問 Windows 環(huán)境,從而可以用它來測試安全設(shè)置。
防火墻
Samba 有很多特性可以限制哪些人能訪問哪些共享文件 — 限制特定用戶名的訪問、強制要求密碼、檢查組成員或在網(wǎng)絡(luò)層過濾。后面的參數(shù),比如 allow hosts 和 smb ports,它們對 IP 地址和 User Datagram Protocol (UDP)/TCP 端口進行操作,提供了一種簡單的方法來控制哪些主機可連接到 Samba 服務(wù)器上。
如果能識別哪些設(shè)備連接到服務(wù)器,比如屬于內(nèi)部網(wǎng)絡(luò),或者甚至是某個特定的子網(wǎng)或一組服務(wù)器,那么就實現(xiàn)了網(wǎng)絡(luò)層控制。這是第一道防線:如果攻擊者無法連接到設(shè)備,那么設(shè)備會更安全。
在 Samba 守護進程中控制網(wǎng)絡(luò)網(wǎng)絡(luò)訪問,這聽上去是完美的解決方案,但其實有更好的方法。為了確定遠程連接是否滿足要求,Samba 首先要接受連接,因為 Samba 只有在完成連接后才能獲取詳細信息。如果是想要防止不符合要求的用戶連接到 Samba,那么防止 Samba 看到這些連接更有意義。Samba 中的所有配置都只會影響 Samba,因此必須為其他的守護進程(比如 web 服務(wù)器和文件傳輸)找到類似的解決方案。
在典型環(huán)境中,網(wǎng)絡(luò)安全不是由系統(tǒng)管理員而是由其他 IT 員工負責(zé)。在主機層(而不是應(yīng)用程序?qū)樱┛刂圃L問能夠?qū)崿F(xiàn)業(yè)務(wù)分離,而且會減少由于更改 smb.conf 而導(dǎo)致的錯誤。
了解 iptables
Linux 提供了一個強大的基于主機的防火墻,稱為 iptables。該防火墻能夠檢查進出或通過 Linux 設(shè)備的包。iptables 也可以指 Linux 內(nèi)核中的包過濾系統(tǒng)或用來管理過濾器的命令名稱。經(jīng)過幾年的發(fā)展,內(nèi)核中的包過濾系統(tǒng)已經(jīng)從簡單的匹配引擎發(fā)展成可動態(tài)加載插件的強大防火墻。因此,如果是在基本用例范圍之外,配置起來就相當復(fù)雜。
關(guān)于 iptables 的第一個重要概念就是表本身。一個表就是一組規(guī)則和操作的自包含列表。當內(nèi)核需要過濾包時,它會查詢 filter 表。如果需要網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT),就會用到 nat 表。根據(jù)加載到內(nèi)核的網(wǎng)絡(luò)特性的不同,還會用到其他表。一個數(shù)據(jù)包可遍歷多個表 — 例如,在地址轉(zhuǎn)換前執(zhí)行包過濾。
每個表的內(nèi)部都是一組鏈。每個表都有一些預(yù)定義的鏈,您也可以將自定義鏈加入列表中。這些預(yù)定義的鏈會在數(shù)據(jù)包生命周期不同時刻使用。例如,filter 表有三個預(yù)定義鏈:
- INPUT。 用來定義如何處理傳向主機自身的數(shù)據(jù)包。
- OUTPUT。 適用于從主機傳出的包。
- FORWARD。 僅用于從一個接口傳遞到另一個接口,比如當主機充當路由器時的數(shù)據(jù)包。
每條鏈都是一個包含零個或多個規(guī)則的有序列表,每個規(guī)則由匹配的子句和目標組成。匹配子句可以是任何內(nèi)容,從 IP 地址或端口到只在特定操作過于頻繁時起作用的速率限制語句。目標可以是另一個鏈或一個操作,比如接受或丟棄數(shù)據(jù)包的指令。您可以通過內(nèi)核模塊創(chuàng)建匹配子句和目標,沒有任何限制。
內(nèi)核會根據(jù)需要做什么來選擇鏈,并按順序查看每條規(guī)則。符合第一條匹配規(guī)則后,內(nèi)核就跳到目標上。大多數(shù)情況下,規(guī)則處理會停止,盡管有些目標—比如登錄—被認為是不會結(jié)束的,因此內(nèi)核將繼續(xù)處理下一條規(guī)則。如果沒有匹配任何規(guī)則,將會使用鏈的默認目標。
請注意:出于本文的目的,本文只用到 filter 表。
使用防火墻保護 Samba
有多種不同的方法來設(shè)計 Samba 的防火墻策略,選擇時要考慮網(wǎng)絡(luò)布局以及誰或哪些主機需要訪問 Samba 服務(wù)器等事項。從較高的層面來看,您可以選擇保護整個主機或只關(guān)注 Samba。
如果您想要保護整個主機,那么您就不必擔(dān)心 Samba 使用哪個端口。以下代碼是一個簡單策略,只允許來自 10.0.0.0/8 專用網(wǎng)絡(luò)的流量傳輸?shù)奖镜胤?wù)器:
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP |
第一個命令向 INPUT 鏈添加了一條規(guī)則,它將規(guī)則添加到當前的規(guī)則列表中。該規(guī)則設(shè)置了來自源網(wǎng)絡(luò)(-s)10.0.0.0/8 的所有內(nèi)容都跳到 ACCEPT 目標,它將會接受數(shù)據(jù)包。第二個命令允許來自現(xiàn)有會話的包,這是通過調(diào)用帶有 -m state 的狀態(tài)匹配器實現(xiàn)的。匹配器會追蹤哪些連接離開主機。傳出的連接的響應(yīng)包被認為是 established 或 related,因此規(guī)則的其余部分會接受這些包。
最后一個命令設(shè)置 INPUT 鏈丟棄數(shù)據(jù)包的默認策略。如果數(shù)據(jù)包不是來自 10.0.0.0/8 網(wǎng)絡(luò)或者不是主機生成的連接的一部分,那么它不會被接受。
您可以通過在端口層過濾來獲得更加精細的粒度。前一個示例過濾源地址,因此會阻塞所有服務(wù)。如果在您的主機上有一個 web 服務(wù)器,您想讓它對一般的 Internet 開放訪問,那么之前的策略就不起作用了。
回想一下 “學(xué)習(xí) Linux,302(混合環(huán)境):配置 Samba”,Samba 使用了四種不同的端口:
- 137 UDP。 網(wǎng)絡(luò)基本輸入/輸出系統(tǒng) (NetBIOS) 名稱服務(wù)。
- 138 UDP。 NetBIOS 數(shù)據(jù)報服務(wù)。
- 139 TCP。 NetBIOS 會話服務(wù)。
- 445 TCP。 直接托管(TCP 上的 Common Internet File System [CIFS])。
清單 1 演示了一個策略,允許從 10.0.0.0/8 網(wǎng)絡(luò)連接到 Samba 服務(wù),也允許 web 服務(wù)器沒有任何限制地進行操作。
清單 1. 在端口層操作的策略
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 137 -j ACCEPT iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 138 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 139 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 445 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP |
清單 1 的策略比之前的策略復(fù)雜得多,因為它對不同的應(yīng)用程序進行了設(shè)置,每個都有不同的策略。前兩條規(guī)則匹配所有作為新會話(-m state --state NEW)的一部分,并且發(fā)送到端口 80 或端口 443(--dport 80、 --dport 443)的傳入的 TCP 數(shù)據(jù)包(-p tcp)。對于源地址沒有任何限制,因此會支持所有人。
接下來的兩行匹配所有從內(nèi)部網(wǎng)絡(luò)(-s 10.0.0.0/8)發(fā)送到端口 137 或端口 138(--dport 137、--dport 138)的 UDP 數(shù)據(jù)包(-p udp)。UDP 沒有狀態(tài),因此無需擔(dān)心連接是新的還是已建立的。
第 5 行和第 6 行結(jié)合狀態(tài)匹配器和源地址過濾器,僅僅允許端口 139 和端口 445 上來自內(nèi)部網(wǎng)絡(luò)的新連接。
最后兩行與之前策略的操作相同。如果數(shù)據(jù)包與當前連接有關(guān),則支持它。其他的將會被丟棄。
排除防火墻故障
防火墻問題很常見,因為會遇到?jīng)]有想到的的需求或發(fā)現(xiàn)應(yīng)用程序并沒有按您預(yù)計的方式運行。規(guī)則本身的錯誤也很常見,尤其是處理一長串端口號和 IP 地址時。但也不是所有問題都與防火墻有關(guān),因此您應(yīng)該了解一些基本的網(wǎng)絡(luò)故障排除步驟。
查看策略
使用 iptables 命令查看策略。-L 選項會列出策略,而 verbose(-v)選項會添加額外的細節(jié)信息,比如數(shù)據(jù)包計數(shù)器。清單 2 顯示了 清單 1 的策略。
清單 2. 查看詳細策略
# iptables -L -v Chain INPUT (policy DROP 47 packets, 5125 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:http 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:https 0 0 ACCEPT udp -- any any 10.0.0.0/8 anywhere udp dpt:netbios-ns 0 0 ACCEPT udp -- any any 10.0.0.0/8 anywhere udp dpt:netbios-dgm 0 0 ACCEPT tcp -- any any 10.0.0.0/8 anywhere state NEW tcp dpt:139 0 0 ACCEPT tcp -- any any 10.0.0.0/8 anywhere state NEW tcp dpt:445 214 15216 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 292 packets, 35009 bytes) pkts bytes target prot opt in out source destination |
明細統(tǒng)計數(shù)據(jù)會顯示匹配頭兩列規(guī)則的數(shù)據(jù)包數(shù)目和字節(jié)數(shù)目。對于清單 2,您會看到該數(shù)據(jù)包只匹配最后一條規(guī)則。仔細看輸出的第一行,您會看到默認的目標也有一個數(shù)據(jù)包數(shù)目。有 45 個數(shù)據(jù)包被丟棄,因為它們不匹配任何一條規(guī)則;這表示或者是未授權(quán)的用戶試圖訪問主機,或者是合法的流量被不正確的防火墻策略所阻塞。
查看防火墻策略的另一用途是完整地了解策略。由于處理會在第一次匹配后停止,因此您應(yīng)該從策略開頭處開始,一直往下看,確定是否有一條規(guī)則會丟棄您的流量。
一個常見場景是不具體的規(guī)則出現(xiàn)在具體的規(guī)則之前。為了避免出現(xiàn)問題,將最具體的規(guī)則放在策略頭部,以便首先發(fā)現(xiàn)例外。但這樣的慣例并不總是有效,因此您應(yīng)該自己查找那些不能連接到服務(wù)器的用戶。
清單 3 顯示了 Engineering 網(wǎng)絡(luò)中一臺服務(wù)器的策略。同一個網(wǎng)絡(luò)中的用戶無法連接到服務(wù)。
清單 3. 含有覆蓋規(guī)則的策略
# iptables -L -v Chain INPUT (policy DROP 21 packets, 2967 bytes) target prot opt in out source destination ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:http ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:https DROP tcp -- any any 10.0.0.0/8 anywhere ACCEPT udp -- any any 10.2.3.0/24 anywhere udp dpt:netbios-ns ACCEPT udp -- any any 10.2.3.0/24 anywhere udp dpt:netbios-dgm ACCEPT tcp -- any any 10.2.3.0/24 anywhere state NEW tcp dpt:netbios-ssn ACCEPT tcp -- any any 10.2.3.0/24 anywhere state NEW tcp dpt:microsoft-ds ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED |
清單 3 中的服務(wù)器屬于 Engineering 網(wǎng)絡(luò),它是 10.2.3.0/24。從公司其他地方,即 10.0.0.0/8 的訪問也會被阻塞。10.2.3.0/24 網(wǎng)絡(luò)是更大網(wǎng)絡(luò)的子網(wǎng),因此阻塞整個 10.0.0.0/8 網(wǎng)絡(luò)的規(guī)則在 Server Message Block (SMB) 相關(guān)規(guī)則之前;因此,即使是 Engineering 用戶也會被 DROP 捕獲,因為 iptables 使用的是首次匹配,而非最佳匹配概念。
以上問題的解決方案是在具體規(guī)則處理之后阻塞公司網(wǎng)絡(luò)。那樣的話,將首先接受 Engineering 網(wǎng)絡(luò)的包。
高級故障排除
您通常無法確定是防火墻的問題,還是網(wǎng)絡(luò)其他地方出了問題。最簡單的測試方法是關(guān)閉防火墻,看看連接是否成功。當然,并不總能這么做,如果不能關(guān)閉防火墻,那么其次的最佳方案是觀察進入服務(wù)器的數(shù)據(jù)包。
tcpdump 工具能顯示服務(wù)器看到的網(wǎng)絡(luò)包,即使防火墻策略丟棄了該包。如果能看到來自服務(wù)器的連接嘗試,那么您就知道數(shù)據(jù)包到達了服務(wù)器。假設(shè)服務(wù)正在運行,那么您很有可能得出防火墻丟棄數(shù)據(jù)包的結(jié)論。清單 4 顯示了 tcpdump 工具正在執(zhí)行。
清單 4. 被阻塞的 SMB 連接的數(shù)據(jù)包跟蹤
# tcpdump -i eth0 tcp port 445 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:24:18.392106 IP CLIENT.search > SERVER.microsoft-ds: S ... 20:24:21.358458 IP CLIENT.search > SERVER.microsoft-ds: S ... 20:24:27.393604 IP CLIENT.search > SERVER.microsoft-ds: S ... |
tcpdump 選項如下所示:
- -i eth0。 監(jiān)聽 eth0 接口。
- tcp port 445。 檢查 TCP 端口 445 的數(shù)據(jù)包。
清單 4 的結(jié)果顯示有三個數(shù)據(jù)包進入服務(wù)器。箭頭表示數(shù)據(jù)流的方向:三個包在 microsoft-ds port 端口(即 455)上從客戶端到達服務(wù)器。行末的 S 表示連接嘗試,沒有響應(yīng)表示服務(wù)器未響應(yīng)。
連接失敗的另一個跡象是連續(xù)數(shù)據(jù)包之間的差別。左側(cè)的時間戳顯示第二個包在第一個包之后約 3 秒鐘才到達,第三個包又在這 6 秒鐘后到達。大多數(shù)網(wǎng)絡(luò)協(xié)議會實現(xiàn)指數(shù)后退 (exponential back-off) 算法,這意味著每次連續(xù)嘗試之間的時間會翻倍。
原文:http://www.ibm.com/developerworks/cn/linux/l-lpic3-315-2/index.html?ca=drs-