伺服器防火牆設定一網打盡

鄭海山dump發表於2019-02-25

防火牆是伺服器防護的第一道關卡,防火牆設定得好不會讓你飛起來,但是至少不會讓你跌的太慘,有太多的問題其實只要一個簡單的防火牆即可規避。當然傳統意義的防火牆只能控制埠的開啟和關閉,埠開啟以後上面服務的漏洞和更復雜的HTTP類似的更多的安全問題這些防火牆無法避免。

是否配置防火牆是一個最基本的安全意識,是是否有貫徹最小許可權原則的體現。管理一臺伺服器,首先要看防火牆開放情況,有些購買的裝置本身無法設定防火牆,就需要上一層交換機或者防火牆協助防護。防火牆設定是越靠近越好,規則越細越好,縱深防禦路上資料中心和網際網路邊界上的較寬的防火牆規則也有存在的必要。

## 防火牆配置的多個途徑

  • GUI:透過GUI介面編輯防火牆,好處是簡單,不需要懂太多的防火牆知識,有驗證,效果跟visudo一樣。缺點就是編輯速度慢,觀察的時候不是太直觀。

  • CLI:設定速度快,有一定的驗證,需要熟悉防火牆語法。

  • 配置檔案:直接修改配置檔案是速度最快的方法,可以進入DevOps自動化部署流程,缺點是直接修改配置檔案沒有驗證。

對於以上幾種配置途徑,各有優缺點,GUI降低了管理員的能力要求,但是也會帶來一些麻煩,如果介面做得不好,對於切換規則和查錯速度沒有直接命令或者操作log來的快速。如果對防火牆規則不是太熟悉,GUI配置後生成的規則是學習最好的材料。如果可能,最後應當做成配置檔案或者bat、sh等命令列集合,保證冪等,可重複執行,會大大降低配置和切換的工作量。

## 失效的防火牆

防火牆配置很簡單,但是防火牆失效的原因也很多:

  • 一條過寬的規則隱藏在幾十條粒度不同的防火牆規則內

  • 防火牆被乙方或者其他人為了除錯等原因關閉而沒有再開啟

  • 防火牆本身規則不瞭解,沒有設定預設DROP或者忽略了IPv6協議

  • 配置檔案格式錯誤導致服務無法啟動或者應用了舊的規則

  • 應用了錯誤的情景模式,比如Windows規則配置的“公用網路”,但是某次啟動後應用了“專用網路”。

  • 多次根據不同重保規則切換防火牆導致規則錯亂,遺漏或多餘。

  • 實時生效和永續性生效的區別,有些規則啟動後就消失了。

所以驗證防火牆是否正確不是去閱讀規則,而是應當檢視放行日誌,採用nmap或者其他埠掃描工具定期掃描,如果寫過程式就知道,這是類似TDD的做法,首先寫一堆防火牆檢測規則AssertTrue/AssertFalse,然後再配置防火牆,直到所有所有測試透過。

## 防火牆配置步驟

所以建議的設定防火牆步驟是

  • 通讀防火牆文件,熟悉所有設定

  • reset防火牆配置,排除干擾

  • 使用GUI或者CLI配置,並觀察生成的配置檔案,作為模板

  • 精確識別伺服器需要開放的埠和開放的範圍

  • 根據模板修改,合併到自動化部署流程內

  • 定期使用nmap掃描確認

  • 配合業務的查錯

防火牆涉及到出和入,一般出我們不會限制,入也會涉及到狀態,比如調整系統時間的NTPD,為了規避時間的跳躍修正同步系統時間,跟ntpdate不同的是,他需要雙向開放防火牆。還有對於允許單播對多播或廣播響應,一個通常的錯誤有時候在於應用(類似VMWare vSAN)選擇了錯誤的多播地址而導致資訊洩露。這裡其實我也不是太明白,等明白了以後再說。

## 突然接手一臺沒有防火牆配置的伺服器

如果你突然接手一臺沒有配置防火牆規則的伺服器,比較暴力的做法是直接全部幹掉,等業務運維人員折騰很久後跳起來來找你。或者考慮友好性,首先應當使用tcpdump收集幾天的現網流量通訊情況,再配置一個較大的規則,保證業務的正常執行,再慢慢根據業務的執行情況和阻斷日誌收縮到最終的細的規則。

## 應用申明埠協議規則

一個有修養的應用,應當有對需要的埠和協議進行宣告的文件,並且這些宣告可以直接複製進入防火牆的配置內,UFW有applications.d,firewalld也有services,最不濟也應當有死的說明文件。就類似Android開發程式的許可權申明,或者SELinux,SELinux也是跟防火牆的命運一樣,處於經常被乙方關閉的狀態,實際上去匹配SELinux規則沒有那麼複雜,他跟防火牆一樣,也有阻斷Log,一個應用應當主動向SELinux申請最小需要的資源,包括埠開放,檔案讀寫路徑等,對其他人快速瞭解應用結構也是一個非常好的途徑。沒有開啟SELinux的原因就是懶,對安全沒有敬畏之心。

## 防火牆配置例項

Windows客戶端的防火牆比較複雜,“允許應用透過 Windows Defender 防火牆進行通訊”的條目過多導致審查工作量太大。如果一個程式需要對外通訊,會彈出UAC類似的介面讓我們選擇是否允許,一般的選擇都是允許,但是這個允許動作實際上開放範圍比較大,比如我最近重灌系統就發現,Windows Subsystem for Linux的SSHD、syncthing、Mouse without Borders等應用以應用程式而不是埠建立規則的許可權開放過大,而且解除安裝一個應用後防火牆規則不一定會自動刪除,這些需要手動調整。所以這裡不談客戶端,只說伺服器,包括Windows、Ubuntu ufw、CentOS6 iptables/ip6tables、CentOS7 firewalld等。

在下面的例項裡,都假定管理員IP 192.168.1.100 需要訪問伺服器所有埠,某個其他伺服器IP 192.168.1.200 要訪問 1433/tcp 埠,伺服器對外開放 80/443 埠。

## Windows 2k3 GUI

Windows 2k3早已經過了EOL,理論上不應當使用它,但是現實裡還是有大量內網還在使用,Windows 2k3沒有防火牆,只有控制皮膚裡面帶的“本地安全策略”的“IP安全策略”可以達到同樣的效果。關於GUI如何配置這裡不再細說,可自行Google。

## Windows 2k3 CLI

參考我2005年寫過的,,將以下命令存成.bat,重複執行。

REM =================開始咯================

REM =================冪等的關鍵================

netsh ipsec static ^

delete policy name=Haishion


netsh ipsec static ^

add policy name=Haishion


REM 新增2個動作,禁止和允許

netsh ipsec static ^

add filteraction name=Perm action=permit

netsh ipsec static ^

add filteraction name=Block action=block


REM 首先幹掉所有訪問

netsh ipsec static ^

add filterlist name=AllAccess

netsh ipsec static ^

add filter filterlist=AllAccess srcaddr=Me dstaddr=Any

netsh ipsec static ^

add rule name=BlockAllAccess policy=Haishion filterlist=AllAccess filteraction=Block


REM 開放管理員192.168.1.100無限制訪問

netsh ipsec static ^

add filterlist name=UnLimitedIP

netsh ipsec static ^

add filter filterlist=UnLimitedIP srcaddr=192.168.1.100 dstaddr=Me

netsh ipsec static ^

add rule name=AllowUnLimitedIP policy=Haishion filterlist=UnLimitedIP filteraction=Permit


REM 開放192.168.1.200可以訪問1433埠

netsh ipsec static ^

add filterlist name=SomeIPSomePort

netsh ipsec static ^

add filter filterlist=SomeIPSomePort srcaddr=192.168.1.200 dstaddr=Me dstport=1433 protocol=TCP

netsh ipsec static ^

add rule name=AllowSomeIPSomePort policy=Haishion filterlist=SomeIPSomePort filteraction=Permit


REM 開放80,443埠

netsh ipsec static ^

add filterlist name=OpenSomePort

netsh ipsec static ^

add filter filterlist=OpenSomePort srcaddr=Any dstaddr=Me dstport=80 protocol=TCP

netsh ipsec static ^

add filter filterlist=OpenSomePort srcaddr=Any dstaddr=Me dstport=443 protocol=TCP

netsh ipsec static ^

add rule name=AllowOpenSomePort policy=Haishion filterlist=OpenSomePort filteraction=Permit

## Windows 2k8以上 GUI

首先建議“還原預設設定”

然後進入“允許程式或功能透過 Windows 防火牆”。對每個進行設定。

接著開啟“高階設定”,點選“入站規則”,然後“按配置檔案篩選”,“按狀態篩選”,進行調整。

## Windows 2k8以上 CLI

netsh advfirewall reset

netsh advfirewall firewall delete rule name=all


netsh advfirewall set allprofiles state on

netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound


netsh advfirewall firewall add rule name="Trust Admin" dir=in protocol=tcp remoteip=192.168.1.100 action=allow


netsh advfirewall firewall add rule name="Trust web to 1433" dir=in protocol=tcp remoteip=192.168.1.200 localport=1433 action=allow


netsh advfirewall firewall add rule name="Open Port" dir=in protocol=tcp localport=80,443 action=allow

## Ubuntu ufw CLI

ufw reset

ufw enable

ufw default deny


ufw allow from 192.168.1.100

ufw allow proto tcp to any port 1433 from 192.168.1.200


ufw allow 80/tcp

ufw allow 443/tcp

## Ubuntu ufw 配置檔案

/etc/ufw/user.rules

/etc/ufw/user6.rules

這裡面的規則建議根據以上CLI生成後儲存成模板進入自動化部署,由於內容較多,這裡不再列出。

## CentOS6 iptables/ip6tables GUI

system-config-firewall-tui

## CentOS6 iptables/ip6tables CLI

iptables -F

iptables -P INPUT DROP

具體規則可參考下面的配置檔案,前面加上iptables即可

iptables -L

service iptables save

繼續對ip6tables操作

## CentOS6 iptables/ip6tables 配置檔案

/etc/sysconfig/iptables

/etc/sysconfig/ip6tables


# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

# custom begin

-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.100 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.1.200 --dport 1433 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

# custom end

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

## CentOS7 firewalld CLI

firewall-cmd --state

firewall-cmd --get-default-zone


firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.100 accept'


firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.200 port port=1433 protocol=tcp accept'


firewall-cmd --enable service=http

firewall-cmd --add-port=443/tcp


firewall-cmd --reload


firewall-cmd --list-all

## CentOS7 firewalld 配置檔案

/etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

<short>Public</short>

<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>

<rule family="ipv4">

<source address="192.168.1.100"/>

<accept/>

</rule>

<rule family="ipv4">

<source address="192.168.1.200"/>

<port protocol="tcp" port="1433"/>

<accept/>

</rule>

<port protocol="tcp" port="80"/>

<port protocol="tcp" port="443"/>

</zone>

## 最後

重啟,確認服務正常,配置正常,nmap定期掃描。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558018/viewspace-2636947/,如需轉載,請註明出處,否則將追究法律責任。

相關文章