linux system security

244
Linux 系統 安全設定

Upload: kenny-chen

Post on 06-Jul-2015

630 views

Category:

Internet


9 download

DESCRIPTION

Some security configuration in Linux system, includes system monitoring, pam, xinetd, tcpwrapper, sudo, ssh, and iptables.

TRANSCRIPT

Linux系統安全設定

•安全簡介•系統安全稽查•PAM 安全設定•Super Daemon (xinetd)•TCP Wrapper (tcpd)•Sudo 配置•SSH 安全連線•防火牆設定

安全簡介

• 終極系統安全• 系統安全等級• 安全重點所在

終極系統安全

•所謂的安全就是限制資源的分配

•Linux 系統的資源皆以檔案的形式存在

•Linux 系統安全就是限制使用者對檔案的存取

•只要有使用者的系統就會有漏洞(人,往往是影響系統安全的最大因素)

終極系統安全

•絕對安全的系統就是沒有人使用的系統,但這樣系統是不存在的,也沒存在的意義

•因此,系統安全只是相對的對資源存取行為進行過濾

•系統安全之水桶理論

終極系統安全

系統安全等級

•系統的安全等級主要分兩個層次:

–實體安全

–網路安全

系統安全等級

•實體安全項目

–系統漏洞修補–Boot Loader 參數保護–BIOS 密碼保護–主機/機櫃保護–機房/門禁保護–社交工程防範

系統安全等級

•網路安全項目

–系統/服務漏洞修補–社交工程防範–防火牆防護–DMZ 緩衝區隔–入侵偵測系統( IDS)預警–服務過濾機制–安全驗證機制

系統安全等級

安全重點所在

•系統安全威脅常見來自網路

•可以運用的過濾機制很多

安全重點所在

– 外部安全設施

安全重點所在

外圍防火牆

內部防火牆

System

DMZ+ IDS

– 系統安全機制

安全重點所在

外圍防火牆

內部防火牆

本機防火牆

xinetd

tcpd

PAM

System

DMZ+ IDS

Daemon ACL

– 單點過濾

– 全部通過

– 逐層把關

– 縱深防禦

安全重點所在

外圍防火牆

內部防火牆

本機防火牆

xinetd

tcpd

PAM

System

DMZ+ IDS

Daemon ACL

• 問題:

–公共開放否?

安全重點所在

• 問題:

–公共開放否?

–若然,所有防禦機制都必須解除!

安全重點所在

•重點:

真正的戰場在系統!

安全重點所在

- 是否需要開放連線?- 開放給哪些對象?- 所開放的服務是否安全?- 服務行程的存取範圍有多大?- 一旦行程被破解,危害程度如何?- 系統是否能及時偵測入侵行為?- 系統是否有足夠機制抵禦入侵?- 是否有良好的災後復原策略?- 如何避免問題的再次發生?

安全重點所在

系統安全稽查

•系統負載查詢•網路連線稽查•重要檔案稽查

系統負載查詢

•查詢指令:–uptime–top–vmstat–iostat–sar–last–lastlog

系統負載查詢

•uptime 命令

系統負載查詢

•資訊分析 :–系統時間–開機時間–登入人數– 系統負載

• 過去 1、 5、 15 分鐘平均負載• 提交工作剛好被 CPU 接收為 1• 提交工作超過 CPU 接收大於 1• 提交工作低於 CPU 接收小於 1

系統負載查詢

•top 命令

系統負載查詢

•資訊分析 :–uptime 命令結果–行程統計–CPU分配–記憶體分配–SWAP記憶體分配– 行程排行榜

• PID• USER• NI• %CPU• %MEM• COMMAND

系統負載查詢

•命令操作 :– 預設 3 秒更新一次,按 Space 可以馬上更新–預設以%CPU排列,按 F可以選擇其他欄位– 可用 k 傳送信號– 可用 r 調整 NI– 更多操作說明可按 h– 離開按 q

系統負載查詢

•vmstat 命令

系統負載查詢

•資訊分析 :–行程狀態–記憶體分配–SWAP讀寫–IO讀寫–系統操作–CPU分配

系統負載查詢

•iostat 命令

系統負載查詢

•資訊分析 :–CPU分配–設備讀寫統計 (毫秒 )

• await: IO等待時間• svctm: IO處理時間

系統負載查詢

•sar 命令– 必須先由 root 執行如下命令:

cp /etc/sysstat/sysstat.cron /etc/cron.d/

系統負載查詢

•資訊分析 :

–使用者程序負載–系統程序負載–CPU閒置

系統負載查詢

•last 命令

系統負載查詢

•資訊分析 :

–系統最近紀錄的每一個成功登錄時間– 使用 -x 選項可獲得 runlevel 切換時間–系統會定期輪替掉記錄檔 (/var/log/wtmp)

系統負載查詢

•lastlog 命令

系統負載查詢

•資訊分析 :

–每一個帳號的最後一次登錄時間–系統帳號不應該有登錄記錄

系統負載查詢

網路連線稽查

•查詢指令:–netstat–nmap

網路連線稽查

•netstat 命令

網路連線稽查

•資訊分析:– 本機 socket– 遠端 socket–連線狀態

• LISTEN:本機服務• ESTABLISHED:已建立連線• TIME_WAIT:即將關閉連線

–行程

網路連線稽查

•nmap 命令

網路連線稽查

•資訊分析 :–Port/類別–服務狀態–服務名稱–版本號碼

網路連線稽查

重要檔案稽查

•主要稽查檔案:

–執行檔與函式庫

–帶 SUID/SGID之執行檔• 檔案擁有者為 root則任何人運行皆為 root• 倘若被植入惡意程式碼將危及整個系統

重要檔案稽查

•查詢指令:

–find–diff

重要檔案稽查

•find 命令

重要檔案稽查

•資訊分析:

–找出所有帶 SUID/SGID 的檔案– 並由 ls -l 列出基本資訊–(用md5sum更佳,但較為耗時 )

重要檔案稽查

• diff 命令

重要檔案稽查

•資訊分析:

– 前後用 find 產生不同的記錄– 再用 diff 來比較前後記錄即可得知差異的檔案

重要檔案稽查

PAM 安全設定

•PAM 運作方式•時間限制•名單限制•登錄限制

PAM 運作方式

•PAM 全稱:–Pluggable Authentication Modules

•除了做身份驗證,還有很多安全控制模組•需要身份驗證的程式,可自行開發模組• 也可以集中交由 PAM 來進行• 只要支援 PAM 的模組,都可給程式共享

PAM 運作方式

PAM 運作方式

App AppApp

PAM

Module ModuleModule

Config Files

時間限制

•PAM 模組名稱:–pam_time.so

•模組功能:–限制服務僅在指定日期與時間或終端上提供–可針對個別使用者進行限制:

• 名稱• 時間• 星期

時間限制

•模組設定檔:–/etc/security/time.conf

•設定語法:services;ttys;users;times

•Example:login ; tty* & !ttyp* ; !root ; !Al0000-2400

時間限制

•實作範例:

–/etc/pam.d/common-account account required pam_time.so

–/etc/security/time.conflogin;tty*;geeko;Wk0900-1800

login;tty*;kenny;Wk0900-1800

時間限制

名單限制

•PAM 模組名稱:–pam_listfile.so

•模組功能:–限制服務僅向檔案所列名單提供 (或拒絕 )

名單限制

•設定語法:item=[tty|user|rhost|ruser|group|shell]sense=[allow|deny] file=/path/filenameonerr=[succeed|fail][apply=[user|@group]][quiet]

•Example:auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed

名單限制

•實作範例:

–/etc/pam.d/sshd auth required pam_listfile.so item=user

sense=allow file=/etc/sshusers onerr=fail

名單限制

登錄限制

•PAM 模組名稱:–pam_tally.so

•模組功能:–紀錄失敗登錄的次數,若成功登錄則歸零– 可供 faillog 工具來限制登錄

登錄限制

•設定語法:pam_tally.so [options]

•常見選項:onerr=[fail|succeed]file=/path/to/countermagic_rootper_user

•Example:auth required pam_tally.so per_user

登錄限制

•實作範例:

–/etc/pam.d/common-auth auth required pam_tally.so per_user

–failog命令:• faillog• faillog [-u user] -m <n>• faillong -u user -r

登錄限制

•PAM 模組名稱:–pam_limit.so

•模組功能:–設定使用者可用的資源極限– 其中 maxlogins 可限制使用者最高登錄次數

登錄限制

•設定檔案:/etc/security/limits.conf

•設定語法:user - maxlogins <n>

•Example:geeko - maxlogins 5

登錄限制

Super Daemon (xinetd)

•xinetd 的功能•設定檔格式•來源限制•時間限制•連線限制•簡易服務配置

xinetd 的功能

• 網路服務程式需要先行載入並且監聽相應的port

•不管是否有服務請求到達,服務程式都駐守在系統負載中:

–損耗更多的系統資源–系統效能變差–系統穩定度變低–系統安全性更糟糕

xinetd 的功能

•有別於獨立運行的網路服務, xinetd 僅在服務請求到達的時候才調用服務程式

•當服務連線結束時, xinetd 也會同時卸載服務程式

xinetd 的功能

•因此, xinetd 可視為後端服務程式的調度員,提供更彈性的資源負載:

–更佳的系統效能–更安全的系統服務–更穩定的系統運行

• 然而,長時間頻繁存取的服務則不適用xinetd 的方式來啟動

xinetd 的功能

•此外, xinetd 也能對服務連線提供更多的存取限制:

–限制來源–限制時間–限制連線

xinetd 的功能

xinetd 的功能

設定檔格式

•主設定檔:–/etc/xinetd.conf

•設定語法:defaults{

key = valuekey += valuekey -= value

}

設定檔格式

•Example:

設定檔格式

•服務設定檔:–/etc/xinetd.d/*

•個別服務均可使用各自的服務配置:

– 若服務檔沒有則使用 defaults– 若跟 defaults 衝突則以服務檔優先

• 服務名稱必須在 /etc/services 經過定義

設定檔格式

•Example:

設定檔格式

來源限制

•限制設定項目:

–only_from• 只允許特定連線

–no_access• 拒絕特定連線

– 兩者可混用,重疊範圍以 no_access 為依

來源限制

•來源格式:

– 單一 IP : n.n.n.n– 多個 IP : n.n.n.{n,n,n,…}–一個網路: n.n.n.0 或 n.n.n.n/mask–單一主機: xxx.xxx.com– 單一 Domain: .xxx.com

來源限制

•Example:

來源限制

時間限制

•限制設定項目:

access_times

時間限制

•時間格式:–hh:mm-hh:mm

•取值範圍:–hh: 00-23–mm: 00-59

時間限制

•Example :

時間限制

連線限制

•設定限制項目:

–instances• 同一時間內單一服務所能承載的最多連線數目

–cps• 第一個參數為一秒內只能所能承載的新建連線數目• 第二個參數為新連線數目超過第一參數時,暫停多少秒停止接受新建連線(不影響現有連線)

連線限制

•Example:

連線限制

簡易服務配置

•功能說明:

– 不需要獨立開發 socket 服務程式– 透過 xinetd 來運行簡單的 script

簡易服務配置

• 步驟一,建立 script:

vi /usr/local/bin/my_service

簡易服務配置

• 步驟二,定義 service port:

vi /etc/services

簡易服務配置

• 步驟三,配置 xinetd 服務檔:

vi /etc/xinetd.d/my_service

簡易服務配置

• 步驟四,重新啟動 xinetd:

/etc/init.d/xinetd restart

簡易服務配置

•步驟五,測試:

簡易服務配置

TCP Wrapper (tcpd)

•tcpd 的使用時機•設定檔格式•服務限制•觸發其他指令

tcpd 的使用時機

•網路服務程式在決定是否接收新建連線之前 ,可先交由 tcpd 檢查:

–接收該連線–拒絕該連線–運行額外的程式

tcpd 的使用時機

• 藉由 tcpd 的過慮,可為系統提供更完整的安全防護:

–集中配置–集中記錄 (syslog)– 服務程序需支援 libwrap.so

tcpd 的使用時機

tcpd 的使用時機

設定檔格式

• tcpd 參考的設定檔有兩個:

–/etc/hosts.allow定義允許通過的連線

–/etc/hosts.deny定義拒絕通過的連線

設定檔格式

• 設定檔的參考順序:

– 先參考 hosts.allow 再參考 hosts.deny– 規則參考以 first-match-first 為原則

• 符合 hosts.allow 規則就接受連線• 不符合 hosts.allow 但符合 hosts.deny 則拒絕• 若皆不符合預設為接受連線

設定檔格式

設定檔格式

• hosts.allow 與 hosts.deny 的規則個時是相同的:

– 放在 hosts.allow 則是接受連線– 放在 hosts.deny 則是拒絕連線

設定檔格式

• 規則格式:daemon_list : client_list [: options]

–daemon_list 格式:• 運行服務的程式名稱,如 sshd, in.telnetd• wildcard : ALL

–client_list 格式:• 單一 IP : 10.0.0.1• 一個 network : 10.0.0.0/24, 10.0.0.• 單一主機: www.example.com• 一個 domain : .example.com• WILDCARD

設定檔格式

• 常用 client_list 之 wildcards:–ALL

• 所有來源–LOCAL

• 於 /etc/hosts “解釋到的不帶 .”的主機名稱–KNOWN

• 透過 DNS 或 /etc/hosts “解釋到的帶 .”的主機名稱

–UNKNOWN• 不能解釋到主機名稱的來源

–PARANOID• 可以解釋到主機名稱,但從該主機再查到的 IP 根

源 IP 不一致

設定檔格式

服務限制

•tcpd 可採用的限制方式有兩種:

–除非指定開放否則全部限制–除非指限制放否則全部開放

服務限制

• 規則範例一:– 只開放本機及指定網路連線 telnet 服務:

vi /etc/hosts.allow

vi /etc/hosts.deny

服務限制

• 規則範例二:– 只開放可查詢得到名稱且 IP 一致的主機連線ftp 服務:

vi /etc/hosts.allow

服務限制

觸發其他指令

• tcpd 常用來觸發命令的選項有兩個:

–twist•該連線完全由指定命令來接管,命令的輸入與輸出將連接至客戶端程式。

•其後不能有其他選項。

–spawn•維持當前連線的情況下以子行程方式運行指定命令

,命令的輸入與輸出將連接到 /dev/null。•其後仍可有其他選項。

觸發其他指令

•規則範例一:– 若從 foo.bar.com 連線列印服務則以 email 通知管理員,其餘的連線一律擋掉

觸發其他指令

•規則範例二:– “允許已定義且不帶 .” 的主機連線 telnet 服務,其餘的連線一律擋掉,且傳回拒絕信息

觸發其他指令

•規則範例三:– 來自特定網路的 rsync 連線專用客製化的程式,其餘的連線維持正常

觸發其他指令

Sudo 配置

•sudo 之應用目的•設定語法•限制 sudoers•限制 su

sudo 之應用目的

•過往要把 root權限授權出去有兩種方法:

– 直接把 user ID 設為 0– 把 root 密碼釋放出去

• 直接用 root 登錄• su 切換為 root

sudo 之應用目的

•然而這兩種方法都有致命的不足:

–all or nothing 不能折衷– 無法控制 root 權限之執行–難以追蹤– 容易洩露 root 密碼–容易誤觸危險程式

sudo 之應用目的

•透過 sudo可以有限度的下放 root的權限:

–哪些帳號或群組–在那些機器上–用甚麼身份–執行甚麼命令–甚至只能使用哪些命令參數

sudo 之應用目的

• 而且,透過 sudo 可以不需要把 root 密碼釋放出去:

–執行者輸入自己的密碼• 不超過 5 份鐘閒置則不需要重複輸入密碼

–或是根本不需要輸入密碼

sudo 之應用目的

• 透過 sudo 運行的每一道命令進行記錄:

–logfile–syslog

sudo 之應用目的

•sudo 的使用方法:

–sudo [-u user] command [argument…]

sudo 之應用目的

設定語法

•sudo 的設定檔:

–/etc/sudoers

• 不建議直接用文字編輯器修改• 應該用 visudo 命令來修改

設定語法

•sudoers 設定檔語法欄位:

user host = (run_as) command [argument]

設定語法

–user 欄位格式:

• user• %group• USER_ALIAS

– User_Alias ALIAS_NAME = user1, user2, user3, …

設定語法

–host 欄位格式:

• hostname• IP• network number• +netgroup• HOST_ALIAS

– Host_Alias ALIAS_NAME = host1, host2, host3, …

設定語法

–run_as 欄位格式:

• user• #uid• %group• RUNAS_ALIAS

– Runas_Alias ALIAS_NAME = user1, user2, user3, …

設定語法

–command 欄位格式:

• command• CMND_ALIAS

– Cmnd_Alias ALIAS_NAME = cmnd1, cmnd2, cmnd3, …

設定語法

–Command 格式須知:

• 命令必須使用絕對路徑• 使用 NOPASSWD: 前置標籤可不需要密碼• 加上 ! 前置符號則禁止執行該命令• 若有指定參數則命令與參數之間不得插入任何內容• ”命令與命令之間使用 , ”分隔

設定語法

–Example:

%wheel ALL = (ALL) ALL

peter localhost = /usr/bin/passwd [A-z]*, \ !/usr/bin/passwd root

ALL CDROM = NOPASSWD: /sbin/umount /CDROM, \

/sbin/mount -o nosuid,nodev \

/dev/cd0a /CDROM

設定語法

限制 sudoers

• 在 SuSE Linux 系統上設定 sudoers 需要注意如下設定:

Defaults targetpw # ask for the password of the target user i.e. root

ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!

限制 sudoers

•兩行設定效果為:

– 所有使用者皆可籍由 sudo 執行任何命令– 但需輸入目標帳號的密碼,如此 root 密碼仍需釋放出來

限制 sudoers

•修改建議:

–同時註解掉這兩行:#Defaults targetpw # ask for the password of the

target user i.e. root

#ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!

–然後再個別定義使用者及群組

限制 sudoers

限制 su

• 透過 sudo 可以有限度下放 root 權限

• 但 su 命令則不然:

–root 密碼仍需釋放–不能限制運行的命令及參數– 不能限制哪些帳號可以運行 su– 不能限制用甚麼帳號的身分運行 su

限制 su

• 解決方案 - PAM:

– 使用 pam_wheel.so• 限制哪些人才能執行 su

– 使用 pam_listfile.so• 限制 su 可以切換為哪些帳號

限制 su

•Example1:

–vi /etc/pam.d/su–vi /etc/pam.d/su-l

限制 su

•Example2:

–vi /etc/pam.d/su–vi /etc/pam.d/su-l

限制 su

SSH 安全連線

•SSH 簡介•設定 user key•關閉密碼認證•設定 key 密碼保護•執行遠端圖型界面•封裝非加密連線

SSH 簡介

•SSH 全稱:Secured SHell

• SSH 主要目的:–安全的遠端連線操作–所有傳送的封包均經過加密處理–取代過往不安全的連線

• r 系列( rsh、 rcp、 rlogin、 etc)• telnet• ftp

SSH 簡介

•SSH 主要功能:

–遠端登錄–遠端命令執行–遠端檔案複製–主機身份驗證–帳號身份驗證–X 圖形介面轉送–封裝其他非加密連線

SSH 簡介

•SSH 版本:

–SSH v1• 無使用限制• 加密使用的 Session Key 為 256bit 亂數• Session Key 經過兩把 public key 加密傳送• 攻擊者可以對現有連線注入額外資料

–SSH v2• 商業使用受限制• 加密 key 透過 Diffier-Hellmen 演算法交換• 資訊完整性透過 HMAC 演算法保障

SSH 簡介

•SSH v1 連線流程:1. client 連線 server 端 tcp/222. server 同時把兩把 public key 傳回

– Server Key– Host Key

3. client以 Host Key來比對 known_hosts檔:– 沒發現則詢問加入(需回答 yes)– 若不通過則結束連線

4. client產生 256bit的亂數作為 Session Key 並用兩把 public key 加密後傳回給 server

5. 雙方使用 Session Key來加密所有連線

SSH 簡介

SSH 簡介

•SSH v2 連線流程:1. client 連線 server 端 tcp/222. server 同時把 Host Public Key 傳回3. client以 Host Key來比對 known_hosts檔:

– 沒發現則詢問加入(需回答 yes)– 若不通過則結束連線

4. 雙方用 Diffie-Hellman演算法協商加密 key5. 及後所有連線用加密 key來加密

SSH 簡介

SSH 簡介

•Linux 的 OpenSSH 版本:

– 調用 OpenSSL 函式庫來實作加密–不受商業使用的限制– 兼容官方 SSH 功能:

• v1.5 : SSH1 only• v1.99 : SSH1 & SSH2• v2.0 : SSH2 only

SSH 簡介

• 偵查 OpenSSH 版本:

SSH 簡介

設定 user key

•SSH 帳號驗證可以用 RSA Key 進行:

–免除密碼輸入• 不怕密碼被竊取• 可用於非互動操作

–更精確的身份辨識

設定 user key

•SSH2 支援兩種演算法:

–RSA

–DSA

設定 user key

•User Key 建置步驟:

1. 用 ssh-keygen 產生 key pair– private key : id_rsa– public key : id_rsa.pub

2. 把 public key 複製至 server 端3. 並增加至 server 帳號的

~/.ssh/authorized_keys

設定 user key

• 用 ssh-keygen 產生 key pair

設定 user key

• 把 public key 複製至 server 端:

設定 user key

• 並增加至 server 帳號的~/.ssh/authorized_keys

設定 user key

•測試(不需要密碼)

設定 user key

關閉密碼認證

•SSH 的身份驗證方法:

–User Key• 若 User Key 通過則馬上通過驗證• 若 User Key 不通過則問密碼

–Password• 若使用 PAM 則用 PAM 驗證身份• 若 PAM 不通過或不使用,則使用系統密碼驗證• 假如皆不通過,則拒絕連線

關閉密碼認證

關閉密碼認證

•身份驗證修改:– 禁用密碼,只接受 user key

• 避免密碼遭到攔截• 避免機器人程式猜密碼• 限定被授權主機連線( key 必須事前抄入)• 使用於非互動連線( shell script)

關閉密碼認證

•關閉密碼驗證:

–vi /etc/ssh/sshd_config

–/etc/init.d/sshd restart

關閉密碼認證

•測試:

關閉密碼認證

設定 key 密碼保護

• 在使用 ssh-keygen 產生 RSA/DSA key 的 同時,我們可以為 key 設定一個密碼 (pass

phrase)• 也可以在 key 產生之後重新執行 ssh-keygen -p 重設密碼:

設定 key 密碼保護

•User Key 驗證認 key 不認人的風險:–終端遭到竊用–客戶主機遭破解–Private Key 遭到竊取

•RSA/DSA key 密碼可以降低 private key 被盜用的風險:

–在 Private Key 調用的時候必須額外輸入密碼– 若密碼不對,無法使用 private key

設定 key 密碼保護

• 一旦 RSA/DSA key 被設定, SSH 連線所需 要輸入的密碼不再是遠端帳號的密碼,而是

key 保護密碼:

設定 key 密碼保護

•RSA/DSA key 密碼也同時帶來不便:

–不適用在非互動的連線操作–每次連線均需要輸入密碼

•其不便性可以透過如下命令來改善:

–ssh-agent–ssh-add

設定 key 密碼保護

•ssh-agent 的使用:

– 先用 ssh-agent 載入一個 shell 程式– 再用 ssh-add 載入 private key

• private key 可載入多個• 只有載入 private key 的時候需要輸入密碼• 可以設定 X 系統在登入時同時輸入 key 密碼

–及後所有的連線都不再需要輸入密碼,只到結 束 shell 程式

設定 key 密碼保護

•ssh-agent 使用測試:

設定 key 密碼保護

執行遠端圖型界面

•過往傳統的軟端連線軟體一般都只能運行文字介面的程式

•X系統本身有支援 X Protocol可以運行遠端圖形介面,也可應用 XDMCP登入遠端桌面

–網路資訊以明碼傳輸–安全性不足–身份驗證困難–容易遭受中間人攻擊

執行遠端圖型界面

•SSH server 可以提供 XForwarding 功能:

–所有網路資訊均以加密–更安全可靠的傳輸–可以進行身份驗證–可以抵禦中間人攻擊

執行遠端圖型界面

•SSH server 設定:

–vi /etc/ssh/sshd_config

執行遠端圖型界面

•SSH client 端命令參數: -X

執行遠端圖型界面

封裝非加密連線

•目前很多原本沒有加密服務均已開發出支援加密的版本

–需版本支援–需要額外的設定

封裝非加密連線

•倘若版本不支援加密協定,或是臨時需要加密連線, SSH 可以提供封裝服務,把原本沒

加密的連線封裝到已經加密的 ssh tunnel 中

•原有服務無須做任何修改 , 只需要在 ssh 客戶端執行時增加參數就行

封裝非加密連線

• 方法一, 在本地端開一個 port 然後透過tunnel 連線遠端服務:

–  ssh -L 10110:4.3.2.1:110 4.3.2.1

封裝非加密連線

• 方法二, 在遠端開一個 port 然後透過tunnel 連線回本地端服務:

– ssh -R 10110:1.2.3.4:110 4.3.2.1– GatewayPorts yes

封裝非加密連線

• 方法三, 在本地端開一個 port 然後透過tunnel 連線第三方主機的服務 (離開 tunnel的連線沒有加密 ):

– ssh -L 10110:10.0.0.1:110 4.3.2.1

封裝非加密連線

防火牆設定

•防火牆原理•防火牆設計•iptables 規則設計•iptables 命令語法•iptables 命令範例•設計自己的 iptables script

防火牆原理

•網路連線兩端透過封包 (packet)傳遞資料:

防火牆原理

• 封包基本由 header 與 payload 組成•Packet 則是層層封裝傳遞

防火牆原理

•TCP 封包之 header 內容

防火牆原理

•IP 封包之 header 內容

防火牆原理

•Socket 是連線兩端的封包起止站–Source Socket–Destination Socket

•Socket 由 Address 與 Port 組成

防火牆原理

•NAT 的工作原理– 透過 socket 替換達成 routing

防火牆原理

•防火牆原理– 透過檢查封包 header(or payload) 的內容來決定封包是否能夠通過

防火牆原理

防火牆設計

•防火牆常被部署在對內 (信任 )與對外 (不信任 )網路之間的必經通道之上

防火牆設計

•DMZ 是防火牆部署中常見的設計–主要用來區隔堡壘主機,以降低入侵風險

防火牆設計

•DMZ 之設計是多樣的–安全與成本及難度成正比、與便利成反比

防火牆設計

•Internet 的連線常經過多重的防火牆過濾

防火牆設計

•Internet 的連線常經過多重的防火牆過濾–連線時雙向的–必須全部通過

防火牆設計

iptables 規則設計

•防火牆程式根據規則 (rule)來處理封包–rule by rule–first match–policy

iptables 規則設計

•防火牆規則收集於不同的鏈 (chain)中–chain by chain–all through

iptables 規則設計

•鏈存在於不同的表 (table)中–different table for different job–table by table

iptables 規則設計

•Iptables 內建三個 tables (及常用鏈 ):–filter

• INPUT• FORWARD• OUTPUT

–nat• PREROUTING• POSTROUTING• OUTPUT

–mangle• PREROUTING• OUTPUT• …

iptables 規則設計

•Linux 系統對封包的 routing 處理–To local–To outside

iptables 規則設計

• 封包於 iptables 之穿行–時間–檢查點

iptables 規則設計

•iptables 所介入的處理:–which table–which chain

iptables 規則設計

• 一個非本機封包於 iptables 之處理:

iptables 規則設計

iptables 命令語法

•iptables 命令格式:

iptables [-t table] -CMD CHAIN rule -j TARGET

iptables 命令語法

• 常見 command:–列視規則: -L [CHAIN] [-n]–增加規則: -A CHAIN rule–插入規則: -I CHAIN [ln] rule–替換規則: -R CHAIN ln rule–刪除規則: -D CHAIN <ln | rule>–清空整鏈: -F [CHAIN]–設定原則: -P CHAIN <DROP | ACCEPT>---------------------–建立自定鏈: -N C_CHAIN –刪除自定鏈: -X C_CHAIN

iptables 命令語法

• 常用 iptables 規則內容:

-i interface (only in PREROUTING, INPUT, FORWARD)-o interface (only in POSTROUING, OUTPUT, FORWARD)-s src.addr (can be ip, net/mask, hostname)-d dest.addr (can be ip, net/mask, hostname)-p proto (can be TCP, UDP, ICMP, ALL)

iptables 命令語法

• 常用 iptables 規則內容 (continued):

--sport src:port (only with -p TCP & -p UDP, can be port, port:range)--dport dest:port (only with -p TCP & -p UDP, can be port, port:range)--icmp-type (only with -p ICMP, can be type, type/error_code)

* tips: 規則內容越多,符合之封包越少。反之,則越多

iptables 命令語法

• 常用 iptables 規則內容 (continued):

-j TARGET (depends on table & CHAIN)

ACCEPTDROPSNAT , MASQUERADEDNATREDIRECTRETURN… etc.

iptables 命令語法

• 關於 -m (match) 之應用:

-m state --state <STATE>

• NEW (新建連線 )• ESTABLISHED (已成功建立之連線 )• RELATED (新建連線,但由已建立連線所引發 )• INVALID (非法連線 )

iptables 命令語法

• 關於 -m (match) 之應用 (continued):

-m mac --mac-source <MAC>( 比對封包的來源 MAC 位址,僅限 local subnet。 )

-m limit --limit <nu/unit> [--limit-burst <burst>](比對每一時間單位最大封包數,及觸發限制的數量。 )

-m owner --uid-owner <uid>( 比對本機使用者 id。 )

iptables 命令語法

• 常用 iptables 之 TARGET:

filter TARGET

• ACCEPT: 允許封包通過當前的鏈• DROP: 拒絕封包通過當前的鏈• REJECT: 同 DROP ,但會送回 icmp 通知

iptables 命令語法

• 常用 iptables 之 TARGET(continued):

nat TARGET

• SNAT: 修改 source socket• DNAT: 修改 destination socket• MASQUERADE: 動態修改 source socket

iptables 命令語法

• 常用 iptables 之 TARGET(continued):

others

• REDIRECT: 將連線導至本機行程• RETURN: 結束自定鏈返回原鏈之下一規則

iptables 命令語法

iptables 命令範例

•iptables 命令行範例:

–拒絕新建連線進入本機:

iptables -t filter -A INPUT -m state --state NEW -j DROP

iptables 命令範例

•iptables 命令行範例 (continued):

–允許從外部界面 (eth0) 連至本機之web 連線:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT

iptables 命令範例

•iptables 命令行範例 (continued):

–允許穿過本機之確認連線 (為內部發起之連線 ):

iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

iptables 命令範例

•iptables 命令行範例 (continued):

–將內部 (192.168.1.x) 送至 Internet 的封包作偽裝:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 --sport 1024:65535 -j MASQUERADE

iptables 命令範例

設計自己的 iptables script

• 目前的主流 Linux 版本都會提供工具以幫 忙設定 iptables 防火牆

•也會提供預設的防火牆規則

•基本上使用預設規則就足夠應付常規性的使用

•但如果管理員需要客製化自己的防火規則, 則可撰寫自己的 shell script

設計自己的 iptables script

•Example 1:– 單純作 Desktop 用途

iptables -F

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

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -j DROP

iptables -P OUTPUT ACCEPT

設計自己的 iptables script

•Example 2:– 單純作 Web Server 用途

iptables -F

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

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -j DROP

iptables -P OUTPUT ACCEPT

設計自己的 iptables script

•Example 3:– 單純作 router 用途

iptables -F

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

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -j DROP

iptables -P OUTPUT ACCEPT

設計自己的 iptables script

•Example 3:– 單純作 router 用途 (continued)

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -s 11.22.33.112/29 -j ACCEPT

iptables -A FORWARD -d 11.22.33.113 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -j DROP

echo 1 > /proc/sys/net/ipv4/ip_forward

設計自己的 iptables script

•Example 4:– 單純作 nat 用途

iptables -F

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

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p icmp -j ACCEPT

iptables -A INPUT -j DROP

iptables -P OUTPUT ACCEPT

設計自己的 iptables script

•Example 4:– 單純作 nat 用途 (continued)

iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.0.1

echo 1 > /proc/sys/net/ipv4/ip_forward

設計自己的 iptables script