Linux system security
-
Upload
kenny-chen -
Category
Internet
-
view
628 -
download
9
description
Transcript of Linux system security
•所謂的安全就是限制資源的分配
•Linux 系統的資源皆以檔案的形式存在
•Linux 系統安全就是限制使用者對檔案的存取
•只要有使用者的系統就會有漏洞(人,往往是影響系統安全的最大因素)
終極系統安全
- 是否需要開放連線?- 開放給哪些對象?- 所開放的服務是否安全?- 服務行程的存取範圍有多大?- 一旦行程被破解,危害程度如何?- 系統是否能及時偵測入侵行為?- 系統是否有足夠機制抵禦入侵?- 是否有良好的災後復原策略?- 如何避免問題的再次發生?
安全重點所在
•資訊分析 :–系統時間–開機時間–登入人數– 系統負載
• 過去 1、 5、 15 分鐘平均負載• 提交工作剛好被 CPU 接收為 1• 提交工作超過 CPU 接收大於 1• 提交工作低於 CPU 接收小於 1
系統負載查詢
•命令操作 :– 預設 3 秒更新一次,按 Space 可以馬上更新–預設以%CPU排列,按 F可以選擇其他欄位– 可用 k 傳送信號– 可用 r 調整 NI– 更多操作說明可按 h– 離開按 q
系統負載查詢
•PAM 全稱:–Pluggable Authentication Modules
•除了做身份驗證,還有很多安全控制模組•需要身份驗證的程式,可自行開發模組• 也可以集中交由 PAM 來進行• 只要支援 PAM 的模組,都可給程式共享
PAM 運作方式
•模組設定檔:–/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
時間限制
•設定語法: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_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
登錄限制
•因此, xinetd 可視為後端服務程式的調度員,提供更彈性的資源負載:
–更佳的系統效能–更安全的系統服務–更穩定的系統運行
• 然而,長時間頻繁存取的服務則不適用xinetd 的方式來啟動
xinetd 的功能
•服務設定檔:–/etc/xinetd.d/*
•個別服務均可使用各自的服務配置:
– 若服務檔沒有則使用 defaults– 若跟 defaults 衝突則以服務檔優先
• 服務名稱必須在 /etc/services 經過定義
設定檔格式
•來源格式:
– 單一 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
來源限制
•設定限制項目:
–instances• 同一時間內單一服務所能承載的最多連線數目
–cps• 第一個參數為一秒內只能所能承載的新建連線數目• 第二個參數為新連線數目超過第一參數時,暫停多少秒停止接受新建連線(不影響現有連線)
連線限制
• 設定檔的參考順序:
– 先參考 hosts.allow 再參考 hosts.deny– 規則參考以 first-match-first 為原則
• 符合 hosts.allow 規則就接受連線• 不符合 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 常用來觸發命令的選項有兩個:
–twist•該連線完全由指定命令來接管,命令的輸入與輸出將連接至客戶端程式。
•其後不能有其他選項。
–spawn•維持當前連線的情況下以子行程方式運行指定命令
,命令的輸入與輸出將連接到 /dev/null。•其後仍可有其他選項。
觸發其他指令
–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 格式須知:
• 命令必須使用絕對路徑• 使用 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
設定語法
• 在 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
•修改建議:
–同時註解掉這兩行:#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 權限
• 但 su 命令則不然:
–root 密碼仍需釋放–不能限制運行的命令及參數– 不能限制哪些帳號可以運行 su– 不能限制用甚麼帳號的身分運行 su
限制 su
•SSH 全稱:Secured SHell
• SSH 主要目的:–安全的遠端連線操作–所有傳送的封包均經過加密處理–取代過往不安全的連線
• r 系列( rsh、 rcp、 rlogin、 etc)• telnet• ftp
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 v2 連線流程:1. client 連線 server 端 tcp/222. server 同時把 Host Public Key 傳回3. client以 Host Key來比對 known_hosts檔:
– 沒發現則詢問加入(需回答 yes)– 若不通過則結束連線
4. 雙方用 Diffie-Hellman演算法協商加密 key5. 及後所有連線用加密 key來加密
SSH 簡介
•Linux 的 OpenSSH 版本:
– 調用 OpenSSL 函式庫來實作加密–不受商業使用的限制– 兼容官方 SSH 功能:
• v1.5 : SSH1 only• v1.99 : SSH1 & SSH2• v2.0 : SSH2 only
SSH 簡介
•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 的身份驗證方法:
–User Key• 若 User Key 通過則馬上通過驗證• 若 User Key 不通過則問密碼
–Password• 若使用 PAM 則用 PAM 驗證身份• 若 PAM 不通過或不使用,則使用系統密碼驗證• 假如皆不通過,則拒絕連線
關閉密碼認證
•身份驗證修改:– 禁用密碼,只接受 user key
• 避免密碼遭到攔截• 避免機器人程式猜密碼• 限定被授權主機連線( key 必須事前抄入)• 使用於非互動連線( shell script)
關閉密碼認證
• 在使用 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 密碼保護
•ssh-agent 的使用:
– 先用 ssh-agent 載入一個 shell 程式– 再用 ssh-add 載入 private key
• private key 可載入多個• 只有載入 private key 的時候需要輸入密碼• 可以設定 X 系統在登入時同時輸入 key 密碼
–及後所有的連線都不再需要輸入密碼,只到結 束 shell 程式
設定 key 密碼保護
•過往傳統的軟端連線軟體一般都只能運行文字介面的程式
•X系統本身有支援 X Protocol可以運行遠端圖形介面,也可應用 XDMCP登入遠端桌面
–網路資訊以明碼傳輸–安全性不足–身份驗證困難–容易遭受中間人攻擊
執行遠端圖型界面
•倘若版本不支援加密協定,或是臨時需要加密連線, SSH 可以提供封裝服務,把原本沒
加密的連線封裝到已經加密的 ssh tunnel 中
•原有服務無須做任何修改 , 只需要在 ssh 客戶端執行時增加參數就行
封裝非加密連線
• 方法二, 在遠端開一個 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 內建三個 tables (及常用鏈 ):–filter
• INPUT• FORWARD• OUTPUT
–nat• PREROUTING• POSTROUTING• OUTPUT
–mangle• PREROUTING• OUTPUT• …
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 -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 命令範例
• 目前的主流 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