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