防火牆:iptables、ufw、TCP_Wrappers、SELinux/AppArmor

防火牆:iptables、ufw、TCP_Wrappers、SELinux/AppArmor

網路封包進入主機的流程

防火牆簡介

預設的 Linux 防火牆就有兩個機制,這兩個機制都是獨立存在的。

  • 第一層是封包過濾式的 netfilter 防火牆 ,使用iptables 這個程式。
  • 另一個則是透過軟體控管的 TCP Wrappers 防火牆。

第一層防火牆:封包過濾 IP Filtering 或 Net Filter

就是 iptables 這個軟體所提供的防火牆功能。為何稱為封包過濾呢?因為他主要是分析 TCP/IP 的封包表頭來進行過濾的機制,主要分析的是 OSI 的第二、三、四層,主要控制的就是 MAC, IP, ICMP, TCP 與 UDP 的埠口與狀態 (SYN, ACK...) 等。

第二層防火牆:TCP Wrappers

這個功能也是針對 TCP 的 Header 進行再次的分析,同樣你可以設定一些機制來抵制某些 IP 或 Port ,好讓來源端的封包被丟棄或通過檢驗。

服務 (daemon) 的基本功能:

防火牆主要管理的是 MAC, IP, Port 等封包表頭方面的資訊,如果想要控管某些目錄可以進入, 某些目錄則無法使用的功能,那就得要透過權限以及伺服器軟體提供的相關功能了。

舉例來說,你可以在 httpd.conf 這個設定檔之內規範某些 IP 來源不能使用 httpd 這個服務來取得主機的資料, 那麼即使該 IP 通過前面兩層的過濾,他依舊無法取得主機的資源喔!

如果 httpd 這支程式本來就有問題的話,那麼 client 端將可直接利用 httpd 軟體的漏洞來入侵主機,而不需要取得主機內 root 的密碼!因此, 要小心這些啟動在網際網路上面的軟體喔!

SELinux(AppArmor) 對網路服務的細部權限控制:

簡單的說,SELinux 可以針對網路服務的權限來設定一些規則 (policy) ,讓程序能夠進行的功能有限, 因此即使使用者的檔案權限設定錯誤,以及程序有問題時,該程序能夠進行的動作還是被限制的,即使該程序使用的是 root 的權限也一樣。舉例來說,前一個步驟的 httpd 真的被 cracker 攻擊而讓對方取得 root 的使用權,由於 httpd 已經被 SELinux 控制在 /var/www/html 裡面,且能夠進行的功能已經被規範住了,因此 cracker 就無法使用該程序來進行系統的進一步破壞囉。現在這個 SELinux 一定要開啟喔!

AppArmor 是作為 SELinux 的替代品出現的,因為對 SELinux 的批評者認為它難以讓管理員設定和維護,在Ubuntu中,預設為AppArmor。

檔案系統權限:

最終網路封包其實是要向主機要求檔案系統的資料啦。 我們這裡假設你要使用 httpd 這支程式來取得系統的檔案資料,但 httpd 預設是由一個系統帳號名稱為 httpd 來啟動的,所以:你的網頁資料的權限當然就是要讓 httpd 這支程式可以讀取才行啊!如果你前面三關的設定都 OK ,最終權限設定錯誤,使用者依舊無法瀏覽你的網頁資料的。

良好的分析log登錄檔

方便管理者在未來的錯誤查詢與入侵偵測,良好的分析登錄檔的習慣是一定要建立的,尤其是 /var/log/messages 與 /var/log/secure 這些個檔案。

第一層防火牆:封包過濾  iptables、ufw

iptables 有點複雜 (請參考 : 有關 iptables的使用),Ubuntu 預設的防火牆 ufw  其實夠用的。這裡整理一些常用的 ufw 設定。

ufw 防火牆設置

ufw 的全名是 Uncomplicated Firewall,意思是不複雜的防火牆。它的指令不但好記,寫好的規則也淺顯易懂,不會像 iptables 的裹腳布又臭又長。

大部分的 Ubuntu 系統應該都已經裝好 ufw。如果你是 Debian,或是什麼特別瘦身版的 Ubuntu 的話,可以透過以下指令安裝:

  • $sudo apt install ufw

開啟/關閉/重設防火牆-ufw

每次開機都會自動載入和啟用的,要注意的是,如果沒有特別的設定的話,ufw 在啟用後,預設是會關閉所有的連入要求的哩。

如果你是用 SSH 連線,別忘了要先 allow 自己的 SSH 連線。

  • $sudo ufw enable # 啟用防火牆
  • $sudo ufw disable # 停用防火牆

如果你把規則改爛了,想要重新來過的話,可以重設:

  • $sudo ufw reset

防火牆預設規則

如果你想要規則嚴一點,可以預設封鎖所有通訊埠,再選擇性打開幾個 port;你也可以預設開放所有 port,然後再封鎖幾個 port。預設允許/封鎖的指令如下:

  • $sudo ufw default allow      #預設允許所有通訊埠
  • $sudo ufw default deny       #預設封鎖所有通訊埠

預設封鎖所有通訊埠,開啟預設提供服務的Port:

  • sudo ufw allow 20        # ftp-data
  • sudo ufw allow 21        # ftp
  • sudo ufw allow 22        # ssh
  • sudo ufw allow 80        # www
  • sudo ufw allow 22/tcp    #開啟 TCP 埠號 22 對外連線
開啟 TCP 埠號 80 及 443 對外連線, 可以直接用 http 及 https
  • sudo ufw allow http
  • sudo ufw allow https

允許/封鎖通訊埠(port)

如果你要允許 SSH port 的話,可以這樣下:

  • $sudo ufw allow ssh

或是

  • $sudo ufw allow 22

也可以允許或封鎖其他的 port:

  • $sudo ufw allow 80      # 允許 80
  • $sudo ufw allow 443      # 允許 443
  • $sudo ufw deny 3389      # 封鎖 3389
  • $sudo ufw deny 21       # 封鎖 21

甚至可以一次允許一個範圍的 port:

  • $sudo ufw allow 6000:6007/tcp # 允許 TCP 6000~6007
  • $sudo ufw allow 6000:6007/udp # 允許 UDP 6000~6007

來自特定 IP 的規則

上面的規則是針對所有 IP,如果你想要針對某些 IP 可以不受控管,你也可以這樣設定:

  • $sudo ufw allow from 192.168.11.10       # 允許 192.168.11.10 的所有連線
  • $sudo ufw allow from 192.168.11.0/24     # 允許 192.168.11.1~192.168.11.255 的所有連線
  • $sudo ufw deny from 192.168.11.4      # 封鎖 192.168.11.4 的所有連線

如果你只是不想讓某個小明偷偷連到你的 SSH Port,你也可以針對他封鎖:

  • $sudo ufw deny from 192.168.11.7 to any port 22

查看目前設了什麼規則

列出服務使用埠號詳情

  • $sudo ufw app list

推薦使用這個指令來看目前設了什麼規則:

  • $sudo ufw status
  • $sudo ufw status numbered     //(這個指令會幫你把規則前面加上編號)
  • $udo ufw status verbose

如果你突然不喜歡某個規則了,可以直接刪除它:

  • $sudo ufw delete 3

那個規則就不見囉!

ufw 是否自動啟動

 編輯檔案 /etc/ufw/ufw.conf 

  • # set to yes to start on boot
  • ENABLED=yes        /* yes 為開啟,反之 no 則未開啟 */

ufw 規則儲存

  • /var/lib/ufw/user.rules

啟用日誌記錄

如果想知道防火牆到底有沒有用或是規則有沒有達到效果的話,可以用下面的指令來啟用日誌功能,在啟用後,ufw 會把記錄寫到 /var/log/ufw.log 日誌檔。

  • $sudo ufw logging on

第二層防火牆:TCP Wrappers

由 tcpd 所控制,攔截 inet.d.conf 的內容,只能過濾 application layer。
但也因此可以過濾範圍擴至 host name。
常見支援之服務: telnet、ssh、sendmail、ftp、pop3。

主要是2個設定檔

  • /etc/hosts.deny , 設定服務阻擋的來源 IP
    • 預設就全部服務都不提供了! 僅對 hosts.allow 中的設定對象開放
      • ALL: ALL : deny
  • /etc/hosts.allow 設定服務允許通過的來源 IP
    • # 針對某個 IP 開放全部服務
      • ALL: 221.169.40.120/32 : allow
    • # 開放 ssh 服務 給特定網段
      • sshd: 140.137.0.0/16 : allow

判定順序

  • /etc/hosts.allow: 通過
  • /etc/hosts.deny: 擋掉
  • 兩個檔案規則都不符合: 通過

規則格式 ( hosts.allow, hosts.deny 通用 )

多個來源可用空格做區別。

網域表示法不支援遮罩 bit 數值表示( ex: 192.168.1.0/24 要用 /255.255.255.0)

{ 服務名稱 }: {IP, hostname, 網域}

範例1 : 本機全部的服務都接受, rsync 接受網域 192.168.1.0/24 與 10.0.0.100 其餘皆拒絕

  • /etc/hosts.allow
    • ALL: 127.0.0.1
    • rsync: 192.168.1.0/255.255.255.0 10.0.0.100
  • /etc/hosts.deny
    • rsync: ALL

範例2 : 僅允許10.1.1.1、10.1.1.2的機器telnet、ftp,其他服務皆拒絕

  • /etc/hosts.deny
    • ALL: ALL : deny
  • /etc/hosts.allow
    • in.telnetd: 10.1.1.1 10.1.1.2 : allow
    • in.ftpd: 10.1.1.1 10.1.1.2 : allow

優點與限制

簡單好設定( hosts.allow / deny )。
可以用 hostname 設定。

 限制

作用在 application layer 無法往下過濾
支援限定的服務

 iptables 與 tcp wrapper 的作用 layer




參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • Ubuntu,Linux,Security,

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組