安全設置

Linux安全設置:

防火牆:

安全隔離工具;

工作於主機或網絡的邊緣,對於經由防火牆的數據報文根據預先定義的規則(識別條件)進行檢測,對於能夠被規則匹配到的報文能夠採取某種預先定義好的處理機制予以處理的一套組件;


軟件防火牆:

應用軟件處理邏輯而運行通用硬件實現的防火牆;


Windows Defender

iptables/netfilter


硬件防火牆:

在硬件級別能實現部分防火牆功能;另一部分功能依然要基於軟件實現;


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章