close

使用 Linux 防火牆設定來保護 Linux Server

http://www.babyface2.com/NetAdmin/23200712iptables...作者:徐秉義(Albert Hsu)

有鑑於這幾年資安事件層出不窮,對於主機安全的需求也大幅增加,不論 Linux 或是 Windows 都在防火牆下了不少功夫,微軟甚至連桌上型系統都建議開啟防火牆來保護電腦安全,以避免主機遭受蠕蟲或是駭客攻擊。至於用於伺服器的 Linux 系統除了行之有年的防火牆之外更祭出進階應用 SELinux(Security-Enhanced Linux)來保護系統,為您的伺服器安全加上更深一層的保障。

談及設定防火牆這部份,微軟桌上型的引進使得一般人或多或少會調整到防火牆,也使得我們至少有些基礎防火牆的概念,可惜的是此概念主要是以桌上型客戶端的電腦為主,也因此對於架設伺服器的防火牆設定會較不熟悉,筆者這次主要介紹的內容是關於 Linux 架設 Server 後該如何配置防火牆促使主機更加安全,至於「配置 SELinux」的部份留待後續再與讀者分享。

Linux 防火牆基礎認識

我們這次也是從基本安裝 RHEL5 完成後開始,預設 RHEL5 會開啟防火牆來保護您的主機,在大部分的 Linux 皆可粗略地使用指令「iptables -L」來觀察有無設定防火牆規則(預設只觀察 filter 這個 table),我們先從了解 RedHat 預設 firewall 規則開始吧!

RedHat 預設 firewall 規則解說

RedHat 預設 firewall 規則如下:(圖為執行 iptables -L 指令)

要先知道 RedHat 使用自訂(user-defined)的 chain 名稱 RH-Firewall-1-INPUT

規則(rule)大致上的意思是最終會將所有進來 local process 的封包都擋住(最後一行的 REJECT),前面幾行是我們允許放行(ACCEPT)的封包,若要調整自訂的放行,就是要定規則在這前面,所以這邊就是我們後續調整設定的重點。

溫馨提示:進來到 local process 意思就是要存取這台主機,並不是 forward 出去(forward 指的是一進一出、經過卻不來到 local process)的封包。

磁碟狀態

下圖為執行指令「iptables -L -v」(-v 為詳細模式情形)的最後幾行。

首先觀察有 lo 的那一行使得 lo 介面(Local Loopback)都放行,存取本地主機(localhost;也就是我自己)實不需阻擋。

Linux 對於 ping 的 icmp 封包通常不擋(接下來的有 icmp 那一行)。

主動出去存取外部主機所建立的相關連線,所回傳的封包不擋(有 RELATED,ESTABLISHED 那行)

允許遠端連線 ssh 進入主機操控,因此放行目的埠是 ssh 連線(dpt:ssh 那一行)

最後那行 REJECT 則是將其餘封包拒絕。

請注意規則是有先後的、並且符合規則者有 target 遵照 target 運作(ACCEPT/REJECT/DROP…)後就不需繼續向下做判斷(所以無 target 者需繼續向下判斷)。

溫馨提示:dpt:ssh 意思是 destination port(目的埠) ssh(22 埠)之意。

磁碟狀態

提供甚麼服務開甚麼埠

Linux 當 Server 依需求看是要提供那些服務,來啟動相關 daemon 接著開啟相關 firewall 設定,知名的像是 Web 服務開 80 埠、Mail 開 25/110 埠等等…但是有些服務運作原理及特性上較為複雜(例如 NFS/FTP…)所以在防火牆設定方面要更加注意及小心。

Linux 防火牆實戰設定

早先我們觀察到 RHEL5 預設開啟 ssh 做遠端連線管理,藉此來介紹 Red Hat firewall 建議設定方式以及相關設定檔案、設定工具(如下表)接著先從幾個較單純的服務開始設定防火牆吧!

圖形化設定工具(或選單模式) 相關設定檔案 相關啟停 Scripts
system-config-securitylevel /etc/sysconfig/iptables /etc/init.d/iptables
或 service iptables

Web Server 設定 firewall

要測試 Web Server 關於 firewall 設定最好是將 Web Server 啟動,在 Red Hat 使用指令「/etc/init.d/httpd start」啟動;觀察 daemon 聆聽(LISTEN)埠號狀態則是使用 netstat 指令,例如「netstat -na | grep -E -w '(80|443)'」

至於 http 預設使用 80 埠;https 預設使用 443 埠則是定義在 /etc/services 內,可利用 grep 指令過濾以及搜尋特定字串,例「grep http /etc/services」;「rpm -q 某某套件」可用來查詢某某套件是否已經安裝,例如:「rpm -q httpd」查詢提供 80 埠的 Web Server 套件 httpd 是否已安裝完成。

若是遇到套件尚未安裝則建議使用 yum 來安裝,以安裝 Apache2(httpd)來說,使用指令「yum -y install httpd」,安裝 https 功能模組的 mod_ssl 也很類似,指令「yum -y install mod_ssl」,至於 RHEL5 配置 yum 請參閱筆者近幾期文章。

磁碟狀態

調整 firewall 的部份則使用指令「system-config-securitylevel」呼叫出設定 firewall 工具,將方框內 Secure WWW(HTTPS)、WWW(HTTP)勾選後按〔OK〕即可。

磁碟狀態

使用圖形介面程式的同時,就在我們按下〔OK〕按鈕之後 Red Hat 會將設定檔案 /etc/sysconfig/iptables 修改,並且重新載入 firewall 規則(使用指令 /etc/init.d/iptables restart)。

利用一些文字處理工具去觀察 /etc/sysconfig/iptables 在設定前與設定後的差異,不難發現有著類似 ssh(22 埠)開放方式的 http(80 埠)、https(443 埠)那兩行設定。

溫馨提示:ssh、http 與 https 都是使用 TCP 傳輸方式,所以設定檔案文字會相當類似。

下圖中的 tail 指令用來觀察檔案尾巴幾行的工具;diff 主要用來比對文字檔案的工具。

磁碟狀態

測試的部份使用網頁瀏覽器存取 http 與 https 是否有回應,順道一提的使用指令「telnet IP或主機名稱 埠號」方式也很方便,例如「telnet al 80」(al 是 172.18.0.136 短的主機名稱)接著「GET /」(抓根目錄之意)。

溫馨提示:指令「telnet al 80」的 80 埠也可以改成 http(請參照 /etc/services 內 80 定義成名稱 http)

磁碟狀態

DNS Server 設定 firewall

介紹 DNS Server 設定 firewall 的原因是 DNS 有使用到 UDP 傳輸方式(埠 53)而且要特別注意的是 DNS 在做 zone transfer 是使用到 TCP 傳輸,有別於一般查詢時用到的 UDP 通訊方式。在 Linux 上面 DNS 套件名稱叫做 bind 所以使用指令「yum -y install bind」就可以輕鬆利用 yum 將 DNS 軟體安裝起來啦!

裝好套件之後 RHEL5 只要將設定檔案「摸出來」並啟動 daemon 即可(請注意 daemon 名為 named)。使用指令「touch /etc/named.conf」產生設定檔案、「/etc/init.d/named start」啟動、「netstat -na | grep -w 53」觀察聆聽埠 53 TCP 與 53 UDP、「grep -w 53 /etc/services」則是定義 53 埠預設給 DNS 通訊使用。

磁碟狀態

至於 firewall 則是使用先前介紹的設定介面,在下方 Other ports 的地方去新增(Add)53 UDP、53 TCP 埠,同樣也是觀察 /etc/sysconfig/iptables 檔案內容以及「iptables -L -n」顯示出來的資訊(關於 53 埠的部份)。

磁碟狀態

iptables 有內建 save/restore 指令分別為「iptables-save > iptables」、「iptables-restore < iptables」指令產生的檔案 iptables 會與 /etc/sysconfig/iptables 內容幾乎一樣。(RedHat 只是將之包裝成 scripts)

磁碟狀態

測試 DNS Server 回應使用 dig 或 host 指令相當方便,例如:指令「dig @172.18.0.136」是向 172.18.0.136 詢問 DNS 根主機資訊;指令「host -l foo.com.tw 172.18.0.136」則是向 172.18.0.136 做 foo.com.tw 的 zone transfer,下圖指令範例中若是 dig 到 Server 有回應會有「;; SERVER: 172.18.0.136#53(172.18.0.136)」那一行(表示是誰回應的)代表 DNS Server 回應正常,其他單純只是指令範例與實際執行結果會有出入,若要測試 zone transfer 最好架設完成 master 或 slave 的 zone 資訊才行。

磁碟狀態

Mail Server 設定 firewall

Mail Server 所使用到的埠號與服務類型如下述,以伺服主機的觀點來看,分成接收遞送信件進來的 SMTP daemon 與信件被收走(讀取)的 POP3 與 IMAP daemon,且幾乎都是 TCP 封包列表如下:

通訊協定 SMTP POP3 IMAP POP3S IMAPS
使用埠號 25 110 143 995 993
主要用途 遞送信件 收取信件(有 S 是 over SSL 之意)
RHEL5 預設
daemon 名稱
sendmail
postfix
dovecot

觀看 Mail Server 所使用埠號用的是類似先前的指令,例如:
「grep -E -w '(smtp|pop3|imap|pop3s|imaps)' /etc/services」
「netstat -a | grep -E -w '(smtp|pop3|imap|pop3s|imaps)'」
下圖是已經啟動 dovecot 後的情況,較需注意到的是 sendmail 聆聽的 25 埠只聽 localhost。

溫馨提示:安裝 dovecot 套件使用指令「yum -y install dovecot」啟動 dovecot 使用指令「/etc/init.d/dovecot start」

磁碟狀態

要使 sendmail 聆聽所有介面的話,就要改設定檔 sendmail.cf 將特定一行的『127.0.0.1』改成『0.0.0.0』,事實上 sendmail 建議修改 sendmail.mc 檔後透過 make 指令呼叫 m4 來產生 sendmail.cf 檔案(RHEL5 需要安裝 sendmail-cf 套件)操作範例如下:

指令「yum -y install sendmail-cf」用來安裝 sendmail-cf 套件
指令「cd /etc/mail」切換目錄至 /etc/mail(待會要在這輸入 make restart 指令)
修改 sendmail.mc 檔案這行『DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl』將原先 127.0.0.1 改成 0.0.0.0
指令「make restart」會產生新的 sendmail.cf 並重新啟動 sendmail
指令「netstat -na | grep -w 25」會發現 sendmail 聆聽的 25 埠已經改成所有介面 IP

磁碟狀態

Mail Server 設定防火牆若以文字模式來做的話,就編輯『/etc/sysconfig/iptables』仿 ssh 埠使用 TCP 傳輸方式的那一行,複製貼上將 Mail Server 相關的那幾個埠號(25、110、143、993、995)輸入進去,重新啟動 firewall 即可(使用指令「/etc/init.d/iptables restart」重新啟動 firewall)

磁碟狀態

測試 Mail Server 設定防火牆以文字模式通常會使用 telnet 來觀察 Server 是否有回應,例如指令「telnet 172.18.0.136 25」針對 SMTP 的 25 埠來做連線,收信的部份使用 mutt 會更方便,例:指令「mutt -f pop://foo@172.18.0.136/」

溫馨提示:mutt -f 指向到的通訊協定可以是以下這些 pop、imap、pops、imaps 也可以是本機的郵件檔案(例:mail -f /var/spool/mail/foo)。

磁碟狀態

Samba、telnet、圖形遠端遙控服務設定 firewall

在 firewall 設定介面中,還剩下四個服務是比較知名的,其中 FTP 與 NFS 因為其運作原理的關係,防火牆設定上會比較繁瑣,也就留到最後兩個單元來談,其他像是 Samba、telnet 以及圖形遠端遙控的 vnc 與 XDMCP 較單純,列表如下:

  伺服軟件名稱 啟停相關 scripts 使用埠號 客戶端程式
Samba samba /etc/init.d/smb restart 137,138(UDP)
139,445(TCP)
smbclient
telnet telnet-server chkconfig xinetd on
chkconfig telnet on
/etc/init.d/xinetd restart
23(TCP) telnet
vnc vnc-server vncserver 從5901(TCP)開始
從5801(TCP)開始
vncviewer
套件名稱 vnc
XDMCP gdm 使用 gdmsetup 設定 177(UDP) tsclient(Xnest)

Samba 的安裝以及啟動相信大家不陌生,所使用的埠號用關鍵字『netbios』以及『microsoft-ds』查詢 /etc/services 檔案內容即可,至於應用程式用到哪幾個埠號查詢方式,若以 Samba 為例的話:使用指令「netstat -nap | grep mbd」即可(其中 netstat 指令 -p 選項是關鍵),有關 Samba 設定 firewall 的部份使用圖形介面來調整應可輕鬆搞定。

磁碟狀態

關於 telnet 服務其實已經被 sshd 所取代,若是一定要用 telnet daemon 的話就將套件 telnet-server 裝起來,至於啟動的部份因為 telnetd 預設是透過 xinetd 呼叫,所以 xinetd 也要一併啟用才行,另外附帶一提的是,預設為安全性的因素 telnet 無法使用 root 直接登入。

磁碟狀態

關於遠端圖形介面的 vnc 連線設定,筆者曾於 NetAdmin 第八期介紹「Xen 虛擬機器」中附帶提到其使用方法,開啟防火牆的部份則幾乎與 Windows 系統相差無幾(Windows 開 5800/5900、Linux 開 5801/5901 起跳),除了 vnc 之外 X Window 可使用 gdmsetup(用在 Gnome's Display Manager)來設定啟用遠端圖形化登入,防火牆則是開啟 UDP 177 埠。

磁碟狀態

在 Linux 的遠端圖形介面客戶端軟體為 tsclient(Terminal Server Client),此軟體說穿了只是一個前端介面,在其「通訊協定」欄位下拉選單中,可以看到像是 XDMCP 呼叫基礎程式 Xnest 連接 X Window;RDP 通訊呼叫 rdesktop 程式主要是連接 Windows 主機;以及 VNC 呼叫 vncviewer 連接 vncserver。

通訊方式 應用的作業系統平台 Linux 客戶端軟體 所使用的通訊協定完整名稱
RDP 主要是 Windows 使用 rdesktop Remote Desktop Protocol
VNC Windows 與 Linux 皆可使用 vncviewer VNC 專屬通訊協定
XDMCP 主要是 Linux 使用 Xnest X Display Manager Control Protocol

磁碟狀態

溫馨提示:使用 Linux Desktop 來管理遠端圖形介面 Linux(VNC、XDMCP)或 Windows(VNC、RDP)抑或是遠端文字模式管理 Linux(ssh、telnet)都相當地方便。

FTP Server 設定 firewall

早期 FTP Server 設定 firewall 的難度主要在於 FTP 通訊方式較特殊,除了預設使用 TCP 21 埠傳輸基本的命令之外,傳輸資料所使用的 TCP 20 埠很有可能因為 FTP 的 Passive mode 而變成 1024~65535 之間的任何一個埠號,倘若因此而開啟 1024~65535 整個區段埠又稍嫌有點不夠安全。

Passive mode off
(Active mode on)
使用埠 20 來傳輸資料
Client「主動」使用 Server 埠 20 來傳輸資料
Passive mode on
(Active mode off)
使用 1024~65535 的某一個埠來傳輸資料
Client「被動」使用 Server 所提供的 1024~65535 某一個埠來傳資料

較合理的方式是限制 FTP Server Passive mode 所使用的埠號變成一個較短的區段(例如 34500~34600 埠),緊接著設定防火牆開啟這個範圍的埠(以及原本就應該開啟的 20、21 埠)即可,接下來就以 RHEL 預設 vsftpd 為例來介紹如何設定。

溫馨提示:ftp Client 通常可以決定使用 Active mode 還是 Passive mode 傳輸資料(使用 passive 指令切換);ftp Server 也通常可決定是否開啟 Passive mode 以及限制所使用的埠區段。

在 vsftpd 設定檔案 /etc/vsftpd/vsftpd.conf 新增兩行關鍵參數 pasv_min_port=34500、pasv_max_port=34600 就可以將 Passive mode 所使用的埠號固定在這個範圍(34500~34600 埠),別忘記重新啟動 vsftpd 來使得變更的設定生效。

接下來使用指令「iptables -I INPUT 1 -p tcp -m multiport --dports 20,21,34500:34600 -j ACCEPT」來開啟該開的埠號。

指令解說:「-I INPUT 1」插入(Insert)編號一號的規則;「-m multiport --dports 20,21,34500:34600」啟用 multiport 功能並開啟 20,21,34500 至 34600 埠。

磁碟狀態

至於新的 Linux 在這部份的設定則更加地簡單,只要開啟 ftp 21 埠並配合一個名為 ip_conntrack_ftp 核心模組載入,搭配原來預設防火牆規則內「ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED」這條規則即可(重點在於 RELATED,ESTABLISHED)。

RHEL 使用圖形介面「system-config-securitylevel」來設定 ftp 開啟後,於 /etc/sysconfig/iptables-config 內有一行『IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"』造成能夠載入 ip_conntrack_ftp 核心模組,配合原來基礎的防火牆規則就可以達到 ftp Server 設定 firewall 目的。

磁碟狀態

NFS Server 設定 firewall

因為 NFS 是以 sun(昇陽公司)rpc 開放規格為基礎,基礎底層程式是 portmap 她通常使用 111 埠(固定),其他以 rpc 為基礎來運行的 nfsd、mountd、statd、lockd 與 rquotad 這些 daemon 除了 nfsd 固定於埠 2049 外,其他 daemon 所使用的埠號會隨機取得導致不固定,所以要設定 NFS Server 的 firewall 就先要將這些 daemon 所使用的埠號固定下來,這樣防火牆的設定會比較簡單也比較安全。

portmap 使用埠 111 固定 /etc/init.d/portmap
nfsd 使用埠 2049 固定 主要啟停這個 /etc/init.d/nfs
建議順手啟停 /etc/init.d/nfslock
mountd,statd,lockd,rquotad 使用埠不固定 同上

啟用 NFS Server 對於熟悉 Linux 管理的讀者朋友們應該不陌生,首先編輯 /etc/exports 檔案範例內容「/home *(ro,sync)」接著使用指令「/etc/init.d/nfs restart」重新啟動 NFS Server 即可。

溫馨提示:除了 /etc/init.d/nfs 建議也啟停 /etc/init.d/nfslock 這個 scripts 相關 daemon。

磁碟狀態

利用「rpcinfo -p」了解這些 daemon 所使用到的埠號,其中 portmapper 固定在 111、nfs 固定在 2049 其餘的則是會動態取得埠號。

磁碟狀態

接下來配合 RHEL 內建的 scripts 建立一個檔案名為 nfs 放置在 /etc/sysconfig/ 目錄下,內容為

MOUNTD_PORT="5005"
STATD_PORT="5006"
LOCKD_TCPPORT="5007"
LOCKD_UDPPORT="5007"
RQUOTAD_PORT="5008"

設定好之後記得重新啟動 NFS Server(指令 /etc/init.d/nfs restart 以及 /etc/init.d/nfslock restart),這樣 nfs 程式所使用的相關埠號就固定住了,可以再度利用「rpcinfo -p」指令來觀察定住後所使用的埠號。

磁碟狀態

溫馨提示:若要詳細了解為何設定 /etc/sysconfig/nfs 可以固定住這些 daemon 用到的埠,可使用指令「grep PORT /etc/init.d/nfs*」、「grep sysconfig /etc/init.d/nfs*」觀察輸出結果(需要有 bash scripts 閱讀能力的底子)

當埠號定住完成後,就到了設定防火牆檔案「/etc/sysconfig/iptables」請配合當初定下來的埠號,筆者範例中定住的埠為 5005~5008 加上原本就應該開放的 111 與 2049 如下圖,請注意到 TCP/UDP 需要都開才會正常,記得重新啟動 firewall 並測試看看是否正常存取 NFS Server。

磁碟狀態

測試期間小插曲

筆者測試期間發現使用「system-config-securitylevel」這個工具程式時,並不會優先讀取我們修改的 /etc/sysconfig/iptables 防火牆設定檔案,經查詢後發現這個設定工具是讀取『她自己』的設定檔案位於 /etc/sysconfig/system-config-securitylevel 如下圖,所以在此提醒讀者朋友,若手動修改了 /etc/sysconfig/itpables 這個檔案之後,後續使用「system-config-securitylevel」工具程式時要注意別被工具程式的舊設定覆蓋您先前重要的設定喔!

磁碟狀態

arrow
arrow
    創作者介紹
    創作者 Johnson峰 的頭像
    Johnson峰

    Johnson峰的部落格

    Johnson峰 發表在 痞客邦 留言(0) 人氣()