Linux安全設置:python
防火牆:linux
安全隔離工具;算法
工做於主機或網絡的邊緣,對於經由防火牆的數據報文根據預先定義的規則(識別條件)進行檢測,對於可以被規則匹配到的報文可以採起某種預先定義好的處理機制予以處理的一套組件;vim
軟件防火牆:安全
應用軟件處理邏輯而運行通用硬件實現的防火牆;服務器
Windows Defender網絡
iptables/netfilter併發
硬件防火牆:app
在硬件級別能實現部分防火牆功能;另外一部分功能依然要基於軟件實現;框架
Cisco PIX,ASA
主機防火牆:其安全服務範圍僅限於當前主機;
網絡防火牆:其安全服務範圍爲當前局域網;
Linux中的實現:
iptables/netfilter:實現主機防火牆兼網絡防火牆之功能;
netfilter:位於Linux內核中的防火牆組件;防火功能實現的主體;
iptables:專門爲netfilter編寫規則的用戶空間中的應用程序工具;
hook function:
hook_prerouting()
hook_input()
hook_output()
hook_forward()
hook_postrouting()
iptables:
chain:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
table:
filter:過濾,防火牆;
nat:用於修改報文的源地址或目的地址,以及端口號;
地址轉換
地址假裝
mangle:拆解報文並對封裝格式進行修改,而後再從新封裝報文;
流量控制
數據標籤
raw:關閉nat表上啓用的鏈接追蹤的機制;
各表的優先級次序(從高到低):
raw --> mangle --> nat --> filter
各表包含哪些鏈:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING,INPUT
filter:INPUT,FORWARD,OUTPUT
注意:在CentOS 7中的nat表包含INPUT鏈,在此以前的其餘發行版本的iptables中,nat表則不包含INPUT鏈;
數據報文的流向:
流入本機訪問某進程的數據報文:
PREROUTING --> INPUT
由本機某進程發送出去的數據報文:
PREROUTING --> OUTPUT --> POSTROUTING
經由本機轉發的數據報文:
PREROUTING --> FORWARD --> POSTROUTING
iptables/netfilter:
netfilter:位於內核空間中的tcp/ip協議棧的報文處理框架;
iptables:用戶空間中的用於編寫netfilter規則的命令行工具;
非交互式命令行工具,一次只能編寫一條規則送往netfilter執行;
netfilter的規則匹配順序:首項匹配;
CentOS 6-:iptables命令編寫規則;
CentOS 7:firewall-cmd命令編寫規則;iptables命令編寫規則;
systemctl disable firewalld.service
systemctl stop firewalld.service
iptables命令:
規則:
根據指定的條件來嘗試匹配每一個流經本機的報文,一旦匹配成功,就會有規則後面指明的處理動做進行預期處理;
簡單來講,規則就是:匹配條件 + 處理動做;
匹配條件:
基本匹配條件:
簡單的檢查IP、TCP、UDP等報文的首部中某特定屬性並進行匹配的機制;
擴展匹配條件:
須要藉助於擴展的功能模塊進行匹配的機制;
處理動做:
基本動做:ACCEPT,DROP,REJECT
擴展動做:須要藉助於擴展模塊才能進行的處理動做;
添加規則的時候,須要實現考慮的問題:
1.報文的流經路徑,以判斷將規則添加至哪一個鏈上;
2.肯定這次規則匹配實現的功能,以判斷將規則添加至哪一個表;
3.要肯定匹配條件,以用於匹配數據報文;
iptables命令的格式:
iptables/ip6tables — administration tool for IPv4/IPv6 packet filtering and NAT
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
規則的通用編寫格式:
iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]
說明:
-t table:指定選擇功能表,能夠選擇的有raw,mangle,nat,filter,默認的是filter表;
COMMAND:
鏈的操做命令:
-P:policy,策略,定義指定鏈的默認策略;通常有兩種選擇,即:ACCEPT或DROP;
-N:new chain,新建一條自定義的規則鏈;只有被內建鏈上的規則調用才能使自定義規則鏈上的規則生效;-j chain_name
-X:drop chain,刪除被內建鏈引用次數爲0的自定義鏈;
-F:flush,清除指定鏈上的全部規則;
-E:重命名被內建鏈引用次數爲0的自定義鏈;
規則的操做命令:
-A:append,追加,在指定的鏈的尾部追加一條規則;
-I [#]:insert,插入,在指定的位置插入一條規則,省略了數字表示將規則插入到鏈的第一條;
-D [#]:delete,刪除,刪除指定的規則
-R:replace,替換,用指定的規則去替換目標鏈中的原有規則;不能僅修改規則中的某一部分,而是整條規則徹底替換;
查看規則的命令:
-L:list,列出指定表指定鏈上的全部規則;
-n:numeric,將規則中的信息數字化顯示,主要指:主機名和端口號;
-v:verbose,顯示詳細格式的信息,還有-vv,-vvv;
-x:exactly,精確的顯示計數器的結果;
--line-numbers:顯示規則鏈中的規則編號;
每條規則都有兩個計數器:
1.匹配的報文的個數;
2.匹配的報文的總的字節數;
重置規則計數器(將計數器計數歸零):
-Z:zero,將指定表指定鏈上的規則的計數器置0;
chain
1.內建鏈:
2.自定義鏈:
匹配條件:
基本匹配條件:
默認狀況下,多個條件之間是邏輯"與"的關係;
!:指對匹配的條件取反;有除了...之意;
[!] -s, --source address[/mask][,...]
檢查報文中的源IP地址是否符合此條件指定的地址或範圍;
[!] -d, --destination address[/mask][,...]
檢查報文中的目標IP地址是否符合此條件指定的地址或範圍;
[!] -p, --protocol protocol
檢查封裝報文的協議是否符合此條件指定的協議;
protocol:tcp, udp, ip, icmp, arp, ...
只要是TCP/IP協議棧中,傳輸層和網絡層的協議都可;
tcp:
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
指明這次匹配的源端口或目的端口;
[!] --tcp-flags mask comp
mask:要檢查的標誌位的列表,各標誌位之間使用逗號分隔;
comp:必須置1的標誌位列表,其他的在mask列表中的標誌位必須爲0;
TCP協議首部中的標誌位:SYN,FIN,ACK,RST,PSH,URG
如:--tcp-flags SYN,ACK,FIN,RST SYN 至關於 --syn
udp:
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
icmp:
[!] --icmp-type {type[/code]|typename}
8: echo-request
0: echo-reply
[!] -i, --in-interface name
檢查數據報文入站的接口是否對應此條件中指定的接口;
[!] -o, --out-interface name
檢查數據報文出站的接口是否對應此條件中指定的接口;
注意:在INPUT鏈上指定出站接口沒有意義;在OUTPUT鏈上指定入站接口沒有意義;
規則定義注意事項:
1.規則的匹配按照順序由上至下,規則的編寫順序:
1)同一類規則,匹配範圍最小的放在最前面;
2)非同一類規則,匹配頻率越高的放在最前面;
3)設置最後一條規則或默認策略爲拒絕全部主機訪問;
2.儘量減小規則的數量,能不寫的就不寫,能合併的就合併;規則精簡;
3.規則備份;
基本匹配條件示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.1,172.16.72.101 -j ACCEPT
iptables -P INPUT DROP (注意:最好是在鏈最後添加"拒絕全部主機訪問"的規則)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.72.101 -j ACCEPT
iptables -I INPUT -s 172.16.0.1 -d 172.16.72.1 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s 172.16.0.0/16 -d 172.16.72.101 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 2 -s 172.16.69.1 -p icmp --icmp-type 8 -j ACCEPT
iptables -I INPUT 3 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT
查看iptables的幫助文檔:
CentOS 6-:man iptables
CentOS 7:
man iptables
man iptables-extensions
擴展匹配條件:
隱式擴展:
-p tcp
顯示擴展:
1.multiport擴展:
以離散或連續的方式定義多個端口匹配條件:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
21,22,23,80,1000:2000
示例:
~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT
2.iprange擴展:
以連續的IP地址範圍指明連續的多個地址的匹配條件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
172.16.50.1-172.16.72.254
示例:
~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT
3.string擴展:
對報文中的應用層數據作字符串匹配檢測;
--algo {bm|kmp}:選擇處理字符串的算法;
[!] --string pattern:指明要檢查匹配的字符串;
示例:
~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP
4.time擴展:
根據報文到達的時間與指定的時間範圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
示例:
~]# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT
5.connlimit擴展:
根據每一個客戶端IP作併發鏈接數的匹配;
--connlimit-upto n:鏈接數數量小於等於n,此時規則應設置爲容許;
--connlimit-above n:鏈接數數量大於n,此時規則應設置爲拒絕;
示例:
~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
6.limit擴展:
基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
示例:
~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT
7.state擴展:
狀態檢測:基於鏈接追蹤機制實現;conntrack
狀態:
INVALID:沒法識別的狀態;無效狀態;
ESTABLISHED:已創建鏈接的狀態;鏈接態;
NEW:還沒有創建鏈接的狀態,新鏈接態;
RELATED:與其餘已創建的鏈接相關聯的狀態;關聯態或衍生態;
UNTRACKED:未追蹤的鏈接;
追蹤到的鏈接保存的位置:
/proc/net/nf_conntrack
可以被追蹤到的最大鏈接數的定義:
/proc/sys/net/nf_conntrack_max
注意:此最大鏈接數的數值,建議必要時能夠調整到足夠大;
不一樣協議的鏈接追蹤的超時時間:
/proc/sys/net/netfilter/*timeout
示例:
~]# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
`]# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
注意:默認的規則或最後一條規則拒絕全部主機訪問;
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
放行FTP被動模式的數據鏈接:
1.裝載追蹤FTP協議的模塊:
# modprobe nf_conntrack_ftp
也能夠編輯vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
目標:
ACCEPT:接受,容許;
DROP:丟棄,拒絕;
REJECT:彈回,拒絕;
LOG
SNAT
DNAT
MASQUERADE
MARK
自定義規則鏈
回顧:
iptables/netfilter
prerouting
input
forward
output
postrouting
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
table:
raw
mangle
nat
filter
iptables工具:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j target [per-target-options]]
COMMAND:
鏈:-P, -F, -N, -X, -E
規則:-A, -I, -R, -D, -Z
查看:-L, -v, -n, --line-numbers, -x
回顧:
基本匹配條件:
-s -d
-i -o
-p
擴展匹配條件
隱式擴展:
-p {tcp|udp|icmp|ip...} [-m tcp|udp|icmp]
tcp: --sport, --dport, --tcp-flags, --syn === --tcp-flags SYN,RST,ACK,FIN SYN
udp: --sport, --dport
icmp: --icmp-type {8|0}
顯示擴展:
multiport:--sports, --dports, --ports
iprange: --src-range, --dst-range
time:
string: --string, --algo {bm|kmp}
connlimit:
limit:
state: --state {NEW|ESTABLISHED|RELATED|INVALID|UNTRACKED}
state: conntrack
/proc/sys/net/nf_conntrack_max
/proc/net/nf_conntrack:鏈接追蹤模版
iptables/netfilter (3)
網絡防火牆:
filter表中的FORWARD鏈規則設置;
nat表中的相關鏈的規則設置;
自定義鏈;
在FORWARD鏈上定義規則,要注意如下幾個問題:
1.對於經由FORWARD鏈的數據,在作訪問控制時要注意數據的流向;即,源地址和目的地址,源端口和目的端口;
2.若是能夠啓用鏈接追蹤機制,建議將雙方向的狀態爲ESTABLISHED數據直接放行;且將此規則放置於鏈的第一條;
3.必須在鏈的最後設置默認拒絕全部數據的規則,能夠設置默認策略,也能夠設置拒絕規則;
FORWARD鏈配置示例:
~]# iptables -A FORWARD -j DROP
~]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -I FORWARD 2 -d 192.168.100.2 -p tcp -m multiport --dports 21:23,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -I FORWARD 3 -d 192.168.100.2 -p udp --dport 53 -m state --state NEW -j ACCEPT
~]# iptables -I FORWARD 4 -s 192.168.100.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
自定義鏈:
在主鏈上引用自定義鏈:
~]# iptables -I FORWARD 4 -p udp -j udp_match
自定義鏈的配置示例:
~]# iptables -N udp_match
~]# iptables -A udp_match -j RETURN
~]# iptables -I udp_match -d 192.168.100.2 -p udp --dport 53 -j ACCEPT
~]# iptables -I udp_match 2 -d 192.168.100.2 -p udp --dport 137 -j ACCEPT
~]# iptables -I udp_match 3 -d 192.168.100.2 -p udp --dport 138 -j ACCEPT
更改自定義鏈的名稱:
注意:要更名的自定義鏈不能被其餘鏈引用;(CentOS 7智能更改?)
~]# iptables -E old_chain_name new_chain_name
示例:
~]# iptables -E udp_match udp
刪除自定義鏈:
注意:
1.要刪除的自定義鏈必須是引用計數爲0的鏈;即不能被任何其餘鏈引用連接;
2.要刪除的自定義鏈上必須爲空,即沒有任何規則;
~]# iptables -X udp
nat表:
功能:
1.NAT,網絡地址轉換;
1) SNAT:讓內部網絡中的主機訪問外部網絡;在路由以後完成地址轉換,將此類規則配置在POSTROUTING鏈上;
a.靜態地址轉換
b.地址假裝
2) DNAT:讓外部網絡中的主機訪問內部網絡中的服務器上的各服務;在路由以前完成地址轉換,將此類規則配置在PREROUTING鏈上;
地址轉換 + 端口映射
2.NAPT,端口轉換或端口映射
SNAT:
--to-source [ipaddr[-ipaddr]][:port[-port]]
注意:在RHEL系或CentOS系操做系統上,SNAT中指定ipaddr必須爲當前主機已經配置的IP地址;
示例:
~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50
MASQUERADE
--to-ports port[-port]
示例:
~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE
DNAT:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
示例:
~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -j DNAT --to-destination 192.168.100.2
~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8077
REDIRECT:端口重定向
--to-ports port[-port]
~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077
LOG:
僅僅是開啓內核對匹配的數據包作額外的日誌記錄;
--log-level level
--log-prefix prefix
--log-ip-options
規則的保存和重載:
CentOS 7:
建議:爲了兼容CentOS 6,將規則保存至/etc/sysconfig/iptables文件中;
iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE
service iptables save
默認會將當前生效的全部規則直接送往/etc/sysconfig/iptables文件中保存;
service iptables restore|restart
直接將/etc/sysconfig/iptables中保存的規則載入;
SELinux:
SELinux:Secure Enhanced Linux,NSA
工做於Linux內核中;
RHEL4.0,測試性的加入了SELinux組件;
RHEL5.0,必定要安裝,能夠在安裝時將其功能關閉;
RHEL6.0,隨操做系統安裝而安裝,隨操做系統啓動而啓動;
操做系統有安全級別的概念:
D
C:C1,C2
B:B1,B2,B3
A:
訪問控制機制:
DAC(Discretionary Access Control):自主訪問控制;
基於爲文件或數據賦予某個特定用戶或組的訪問權限的方式,實現訪問控制;
基於rwx權限限制用戶對文件的訪問;
MAC(Mandatory Access Control):強制訪問控制;
對於文件或數據的訪問權限不去針對用戶來設定,當某個用戶發起某個進程以後,該進程是否可以操縱數據或文件,取決於進程和文件是否爲相同類型;
SELinux有兩種工做級別:
strict:對於每一個文件都要嚴格規定其類型,對於每一個進程都有特定的域,進程的域和文件的類型必需要嚴格匹配,才能使進程訪問此文件;
targeted:僅有限個進程受到SELinux的管控;在RHEL繫系統中爲默認級別;
只監控那些容易被***而且會對系統形成安全隱患的進程;
Sandbox:
在Linux系統中,可以完成真實操做的實體,是進程;
subject:主體
action,operation:動做,操做
object:客體
subject:進程
action,operation:open, close, read, write, modify, delete, chmod, chown, ...
object:文件,進程,套接字,連接,...
SELinux爲每一個文件提供了安全標籤,也一樣爲進程提供了安全標籤;這些稱爲SELinux的安全上下文,secure context;
user-identify:role:domain|type:sencitivity
user-identify:SELinux的用戶身份標識,跟文件系統的user不同;
role:角色
domain|type:域(進程),類型(文件)
sencitivity:敏感度,s0
SELinux策略庫:
規則:哪一個域能以哪一種方式訪問哪一種或哪些類型內的文件;
SELinux幾種工做模式:
enforcing - SELinux security policy is enforced.
permissive - SELinux prints warnings instead of enforcing.
disabled - No SELinux policy is loaded.
凡是從enforcing或Permissive模式切換值disabled模式,或者從disabled模式切換至enforcing或Permissive模式,都必需要通過操做系統從新引導才能生效;
enforcing到Permissive之間的模式轉換可使用setenforce命令來完成;
setenforce {0|1}
0:Permissive
1:Enforcing
可使用getenforce命令來查看當前SELinux的工做模式;
注意:使用setenforce命令修改的模式不會永久生效,若是想要使SELinux的工做模式永久生效, 須要修改/etc/sysconfig/selinux文件中的SELINUX=enforcing
文件安全標籤的查看方式:
ls --context|-Z [file...]
進程的安全標籤的查看方式:
ps auxZ
更換文件的安全標籤:
chcon
chcon [options]... CONTEXT FILE...
-t type
-R:遞歸修改目錄中的全部文件
--reference=FILE:參考FILE的安全上下文,爲目標文件設置相同的安全上下文;
使用場景:
使用httpd建立虛擬主機以後,目標頁面文件的類型與httpd進程的域不相符合,將虛擬主機服務器根目錄中的全部文件修改成httpd_sys_content_t便可;
可使用restorecon命令還原某文件或目錄的安全上下文爲默認值;
restorecon
-R:遞歸
布爾型規則:
getsebool
-a:顯示全部已經生效的布爾型規則;
setsebool
-P:寫入策略文件,使更改永久生效;
使用場景:支持二進制策略修改的系統服務
ftp的匿名用戶上傳功能:
~]# setsebool -P ftpd_full_access=1
~]# setsebool -P ftpd_anon_write=1
samba用戶訪問本身的家目錄:
~]# setsebool -P samba_enable_home_dirs=1
semanage:
須要經過安裝policycoreutils-python獲取該應用程序
semanage port -a -t http_port_t -p tcp 8077