防火牆是一個監控傳入和傳出網路流量的網路安全裝置,並依據規則對進出流量做存取控制, 在 linux 中常見的就是 iptables 與 TCP wrapper
iptables 與 tcp wrapper 的關係( iptables –> tcp wrapper –> service )
圖片來源: readhat - TCP Wrappers and xinetd
操作 linux 核心的 netfilter,可以從底層開始過濾更完全
圖片來源: Packet flow in Netfilter and General Networking
參照圖片: 封包進入 kernel 的 dataflow
iptables 設定相對複雜不易於學習,容易對資安或 linux 菜鳥造成心靈創傷
ufw
Uncomplicated Firewall ( ufw )
Ubuntu系統上預設的防火牆套件,規則設定指令簡單易讀
allow
deny
{port_num / service_name}
設定 port
{port_num / service_name}/{tcp/udp}
指定 protocol, 沒加 protocol 預設 udp & tcp 一起
from {ip}
設定 IP
uif
Userfriendly Iptables Frontend,也是一種便於設定的 iptables 界面
由 tcpd 所控制,攔截 inet.d.conf 的內容,只能過濾 application layer
但也因此可以過濾範圍擴至 host name
常見支援之服務: telnet、ssh、sendmail、ftp、pop3
/etc/hosts.allow
設定服務允許通過的來源 IP
/etc/hosts.deny
設定服務阻擋的來源 IP
判定順序
規則格式 ( hosts.allow, hosts.deny 通用 )
Ex:
(規則) 本機全部的服務都接受, rsync 接受網域 192.168.1.0/24 與 10.0.0.100 其餘皆拒絕
/etc/hosts.allow
/etc/hosts.deny
優點
限制
支援服務的條件
/etc/xinetd.d/
裡面的服務libwrap.so
模組的服務libwrap查詢方式
for name in {要查詢服務名稱}; do echo $name;ldd $(which $name) | grep libwrap; done
EX:
通過監測網路流量來偵測惡意攻擊的軟體
當發現有入侵跡象會紀錄並通知系統管理員
Out-of-Band
機器外加於原先的網路架構
此圖 IDS 的實現是透過 switch, router 等設備設定 port mirror 把所有流進的複製一份給 NIDS 做偵測用
好處是當 NIDS 主機掛掉,不會癱瘓整個網路,可以降低風險
常見的 system 入侵徵兆
常見的 network 入侵徵兆
IDS | HIDS - NIDS | Unix | Linux | Windows | MacOS | |
---|---|---|---|---|---|---|
Snort | NIDS | V | V | V | 老牌 IDS,有強大的社群支持 | |
Suricata | NIDS | V | V | V | V | Snort的替代品,可以繼承 Snort 規則 |
Bro | NIDS | V | V | V | 陡峭的學習曲線, 能夠檢測其他入侵檢測工具可能會忽略的異常和模式 | |
OSSEC | HIDS | V | V | V | V | 功能最全面的HIDS, 系統資源的占用非常小 |
Fail2Ban | HIDS | V | V | V | 可以保護電腦伺服器免受蠻力攻擊 |
入侵防禦系統 ( Intrusion Prevention System ),可視為IDS功能的延伸
用以彌補 IDS 功能不足,偵測到入侵會主動防禦
透過偵測流經的網路流量,提供對網路的安全保護,一旦辨識出入侵行為,NIPS 封包到達主機前切斷連線
主機型入侵防禦,用於保護伺服器和主機系統不受入侵行為的攻擊,會將攻擊封包丟棄
Firewall
IDS
IPS
inline
裝置本身也是網路架構的組成分子,除非要支援 pass_through 否則掛掉造成網路癱瘓
P.S. 對比 2.1.2 Out-of-Band
圖片來源: Log Analytics, Log Mining and Anomaly Detection with Deep Learning
rsyslogd 的 syslog 格式
Mmm dd hh:mm:ss
Mmm
是英文的月份縮寫
hh:mm:ss
local time
hh
是 24 小時制,從 00 - 23mm
, ss
從 00 - 59PROCID
process 在系統的 PID
參考資料: RFC5424 - The Syslog Protocol
參考資料: RFC3164
參考資料: Wiki - syslog
參考資料: Linux Logging Basics
參考資料: syslog 詳解
RFC5234 定義的 syslog 所有訊息格式
以常見的 log 檔案做說明
/var/log/syslog/
system log,所有訊息的匯集地
/var/log/cron.log
crontab 排程有沒有實際被進行? 進行過程有沒有發生錯誤?你的 /etc/crontab 是否撰寫正確?
/var/log/auth.log
牽涉到『需要輸入帳號密碼』的軟體,那麼當登入時 (不管登入正確或錯誤) 都會被記錄在此檔案中
/var/log/wtmp
, /var/log/faillog
記錄正確登入系統者的帳號資訊 (wtmp) == 指令 last
錯誤登入時所使用的帳號資訊 (faillog)
/var/log/lastlog
可以記錄系統上面所有的帳號最近一次登入系統時的相關資訊, 對應指令lastlog
/var/log/utmp
當前登入系統的情況, 即指令 who
, w
/var/log/{服務名稱}
不同的網路服務會使用它們自己的 log 檔
在 linux 是以 rsyslog.service
來紀錄 log 檔, 產生的各個資訊的登錄
確定服務開啟
運行中的程式
ps aux |grep rsyslog
服務啟動狀況
systemctl status rsyslog.service
rsyslogd 設定檔
位於/etc/rsyslog.conf
與 /etc/rsyslog.d/*
設定 服務 產生相關資訊哪些 訊息等級 需要紀錄,以及其 對應位置
服務名稱
圖片來源: 鳥哥 - 認識與分析登錄檔
訊息等級
訊息嚴重性 0 - 7, 愈嚴重的等級數值愈小
.
該訊息等級 & 更嚴重的訊息等級(等級數值 <= )
.=
指定的訊息等級(等級數值 =)
.!
嚴重低於這個等級(等級數值 > )
圖片來源: 鳥哥 - 認識與分析登錄檔
語法
ex: /etc/rsyslog.d/50-default.conf
透過字串處理工具過濾 log 內容,並整理成更適合閱讀的格式
awk
以 column 為單位擷取文字,以 ${col_num}
的格式表現
通常會搭配 print
輸出(感覺是類似 echo 就是 awk 中輸出的指令)
cat /var/log/nginx/access.log.1 |awk '{print "IP="$1, "\tRequest="$6$7$8$9}'
Perl
perl -E 'say("hello")
hello
perl -E 'say(100*100)
10000
BT 補充
是非常有彈性的語言(就像是詩)
很多程式語言都有其限制,但 Perl 唯一的限制只來自於使用者的想像力
sed
可以將輸入資料做編輯 ( 新增, 修改, 刪除, 取代 ) 後輸出
{line_num}d
刪掉
{line_num}a {要增加的 txt}
append 在指定行後
{line_num}i {要增加的 txt}
insert 在指定行前
{line_num}c {取代內容}
取代指定行的內容
{line_num}p
列出指定行的內容(建議加入參數 -n
)
沒加-n
加-n
sort
將輸入內容做排序輸出的工具
-o {輸出檔案}
將排序後的資料輸出到檔案
-fu
刪去重複內容(不分大小寫)
-t {分隔符號} -k {欄位號碼}
指定排序欄位
-M
按照英文月份排序
非英語系系統要加上參數LC_ALL=C
合併文件
不排序合併(-m
)
uniq
處理重複的工具
刪去重複後輸出
計算出現次數
又稱為窮舉攻擊(英語:Exhaustive attack),是一種密碼分析的方法,即將密碼進行逐個推算直到找出真正的密碼為止
字典暴力破解:有一個字典檔,裡面包含了一些可能常見的密碼組合,再利用字典檔去進行暴力破解。
純粹暴力破解:嘗試所有組合
常用於破解加密過的密碼雜湊。彩虹表指的是 hash 與 原始值 對照,透過擷取封包或其他途徑取得的密碼 hash 值,對照彩虹表破解密碼
DoS (Denial of Service),為駭客利用大量偽造且無意義的封包,藉以消耗被攻擊者的網路頻寬與系統資源,導致網路癱瘓,無法提供正常的服務。DoS是採一對一的攻擊方式
DDoS ( Distributed Denial of Service ,分散式阻斷服務攻擊)為 DoS 的延伸主要利用分散於不同地方的多部電腦主機,發送大量的偽造封包,進而達到癱瘓網路電腦主機伺服器的目的
DNS DDOS 攻擊
基本洪水攻擊:這種攻擊會送出許多 DNS 請求到 DNS 伺服器上,企圖耗盡這些伺服器的網域名稱解析器,以及快取資料庫資源。
遞迴式洪水攻擊:攻擊者會對 DNS 伺服器,送出並不存在 DNS 快取資料的網域名稱解析請求,增加 DNS 伺服器與網路頻寬的負擔。
DNS反射(reflection)攻擊: 攻擊者偽造成攻擊目標 IP 不斷向 DNS 發出 request,因為 DNS response 相對 request 是大的,如果攻擊目標一次收到大量 DNS server 的回覆封包,造成攻擊目標癱瘓
Fail2ban 是一套以 Python 語言所撰寫的 GPLv2 授權軟體,藉由分析系統紀錄檔,並透過設定過濾條件 (filter) 及動作 (action),當符合我們所設定的過濾條件時,將觸發相對動作來達到自動化反應的效果 (如封鎖來源 IP、寄信通知管理者、查詢來源 IP 資訊等)
可以防止一些常見的服務被攻擊 ex: SSH, ftp, apache
原理
安裝
sudo apt install fail2ban
設定檔結構
jail.conf
設定 filter 與 action 的關聯性, 建議自定義寫在 jail.local
, jail.conf
在系統更新或升級的時候可能會變動filter.d/
存放 filter 的設定檔, filter 定義攻擊篩選條件action.d/
存放 action 的設定檔, action 定義後續執行動作 ex: 「sendmail 寄信通知」、「iptables 阻擋來源位址」、「使用 whois 查詢來源 domain 資訊」/etc/fail2ban/jail.local
重啟 fail2ban
sudo service fail2ban restart
查看運行中的所有 jail
sudo fail2ban-client status
運行結果
在 [sshd]
中沒有對應 action 設定會參照 [DEFAULT]
是使用 iptables 的規則去阻擋入侵, 所以可以在 iptables 的 list 中看到
解除封鎖 IP ( 不小心鎖錯人
sudo fail2ban-client set {jail_nmae} unbanip {要解鎖IP}
TCP 連線時,client 端送 SYN 到伺服器,伺服器會回覆 SYN+ACK,並該 request 放進 Half-Open Queue,此時稱為半連接 ( Half-Open )
該 request 會在 Queue 中直到伺服器收到 ACK 回覆才算完成(establish)
如果伺服器一直沒有收到 ACK,會在超時重傳 SYN+ACK
SYN Flood 則是攻擊者傳送多個 SYN 請求並不給予回覆,直到塞爆 Queue ,導致伺服器無法負荷正常連線,是常見的 DDOS 攻擊
SYN-flood 塞爆 Queue 示意圖
圖片來源 - SYN-floods and SYN-cookies animated
tcp header
圖片來源: NotFalse 技術客 - TCP 三向交握 (Three-way Handshake)
SYN cookies 技術可以在伺服器半連接 ( Half-Open ) 停佇列已滿的情況下仍能處理新的 SYN 請求
SYN cookie 開啟時,SYN request 並不會被放進 Queue 中,而是將相關訊息做成 cookie 塞進 SYN+ACK 封包
SYN cookies 會將來源 IP, Port, timestamp 等與這次握手相關的訊息進行處理成為回覆 SYN+ACK 封包中的 sequence number
在伺服器收到 client 端 ACK 回覆,再取出 ACK_num - 1 還原 sequence num
進行特定比對,成功即完成三項交握。
t
timestamp mod 32 成 5 bitm
SYN Queue 中的 MSS (maximum segment size),會 encode 成 3 bits
IP, port, timestamp相關資訊做 hash 成 24 bit,用於收到 ACK 時驗證收到 ACK 後會做的事情
圖片來源: NotFalse 技術客 - TCP 三向交握 (Three-way Handshake)
將 ACK_num - 1 還成原本的 SYN
開啟 ( 預設已經開啟 )
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
目的:找出攻擊目標提供服務的 port 以進行攻擊
判別方式: 通常會以短時間內每個 port 都戳一次(壞)
透過監聽指定 port 確認是否被惡意 scan,會配合 tcp_wrapper 阻擋惡意 host
/etc/portsentry/portsentry.conf
主設定檔
/etc/portsentry/portsentry.ignore
要忽略的 IP,設定永遠不會被 ban 的 host (每次 restart 會被 rebulid, 參照 ignore.static 動態產生 )
/etc/portsentry/portsentry.ignore.static
static IP ignore,當 restart 的時候,會根據這份檔案設定的子網路( IP/netmask ) 查詢指令 ifconfig -a
動態抓取 IP 並 rebuild 要 portsenty.ignore,所以要設定忽略名單是編輯這份檔案
/etc/default/portsentry
攸關 portsentry 啟動的選項 ex: portsentry -tcp
/etc/init.d/portsentry
Start 或 Stop portsentry deamon 的 script ( 腳本 )
/var/lib/portsentry/portsentry.blocked.tcp
& /var/lib/portsentry/portsentry.blocked.udp
被阻擋的 host 名單 ( daemon reload 後會被清空)
/var/lib/portsentry/portsentry.history
紀錄曾經被 blcok 的 host , 包含 udp 與 tcp
In file /etc/default/portsentry
tcp/udp
stcp / sudp
atcp/audp
advanced tcp
監控 " 所有 " 小於設定值的 port ( 官方建議數值不要大於 1024 )
Advanced tcp mode 的排除不掃的名單
default config 預設不掃的 port 與功用補充
113
特定 TCP 連線的使用者認證 ( ident protocol ),舊的伺服器身分辨識系統
139
netBIOS session service,提供了一個可靠的雙向有序資料給兩個NetBIOS
137
netBIOS name service
138
netBIOS datagram distribution service ( send, recieve, broadcast)
520
routing information protocol for UDP
67
Bootstrap protocol server. Used by DHCP servers to communicate addressing information to remote DHCP clients
指令查詢 port
/etc/service
啟動
service portsentry start
/etc/init.d/portsentry start
查看執行狀況
服務運行狀況 service portsentry status
process 運行狀況 ps -ef | grep -v grep | grep portsentry
(正確開啟時 ps 狀況如下)
注意 VM 網路不可以選擇 NAT
VM scan 本機 port
nmap -p 1-65535 -T4 -A -v -PE -PS22,25,80 -PA21,23,80 {本機IP}
nmap參數說明
-PA
ACK ping
-PS
SYN ping
-PE
Echo ping
防火牆通常會設定阻擋 ICMP ping,所以由外部向內連線的 SYN ping (PS) 會無法通過
而 ACK ping (AP) 會被誤認為回應的 ACK 封包,有時可以通過
但如果有狀態確認 (stateful) 的防火牆會阻擋非預期封包,則該法也會被阻擋
所以通常會採用 PA
PS
PE
一同使用的方式提高機率
T{0-5}
timing template
圖片來源: NMAP.ORG - Timing Templates
VM scan 本機的 port 的結果(沒有開啟 portsentry 防護)
VM scan 本機的 port 的結果(本機開啟 portsentry)
開啟主設定檔啟動 block (將 0 –> 1)
sudo vim +135 /etc/portsentry/portsentry.conf
port scan 會出現在 /var/log/syslog
被 ban 跡象
查看 routing table route -n
/var/lib/portsentry/portsentry.blocked.tcp
/var/lib/portsentry/portsentry.history
/etc/hosts.deny
VM 發出 request 被拒絕 ( ping, ssh, telnet 皆被拒 )
( PS: 先 stop service,設定好再 start )
(reload 後紀錄會不見)排除欲解除 IP 複製一份目前 blocked ip list /var/lib/portsentry/portsentry.blocked.tcp
grep -v {解封 IP} portsentry.blocked.tcp | sudo tee portsentry.blocked.tcp.new
直些編輯 hosts.deny 或 排除欲解除 IP 複製一份目前被 deny 的 host /etc/hosts.deny
grep -v {解封 IP} hosts.deny |sudo tee hosts.deny.new
刪除 routing table 中關於封鎖欲解除 IP 的規則
route del -host {解封 IP} reject