下面介绍的是Linux的安全设置,网络防火墙(iptables、NAT、layer7、diff、patch、SELinux)
一、防火墙
1、防火墙基础
(1)、防火墙
防火墙,是一种隔离工具,工作于主机和网络边缘。对于经过防火墙的报文,根据预先安排好的规则进行检测,如果能够匹配,则按照特定规进行处理。
(2)、防火墙分类
防火墙分为两类,软件防火墙、硬件防火墙。软件防火墙有iptables、netfilter,硬件防火墙有PIX、ASA。
同时,防火墙还可以按类别分,分为主机防火墙、网络防火墙。
(3)、iptables
iptables,是专门为netfilter编写规则的用户空间工具,非交互式命令工具。
iptables,包括chain和table两部分,具体解释如下:
chain:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING。----------5类
table:、filter、nat(修改源地址、目的地址、端口号)、mangle(修改封装格式)、raw
table表的优先级:raw(高)、mangle、nat、filter
raw表包含链:PREROUTING,OUTPUT ----------直入直出
mangle表包含链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING ---------经过主机、路由
nat表包含链:PREROUTING,OUTPUT,POSTROUTING,INPUT ----------------经过主机
filter表包含链:INPUT,FORWARD,OUTPUT ----------经过路由
iptables数据报文的流向:
流入本机访问某进程:PREROUTING --> INPUT ------------------入主机
本机进程发送出去:PREROUTING --> OUTPUT --> POSTROUTING ----------出主机
经由本机转发:PREROUTING --> FORWARD --> POSTROUTING -----------经过路由
2、iptables命令 -------------对于报文,判断匹配条件(基本匹配、扩展匹配),然后进行处理动作(ACCEPT、DROP、REJECT)
格式(规则):iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]
targetname:----------------目标
ACCEPT -------------接受,允许
DROP -------------丢弃,拒绝
REJECT ------------弹回,拒绝
LOG -----------仅仅是开启内核对匹配的数据包做额外的日志记录
SNAT
DNAT
MASQUERADE
MARK
常用选项:
-t table:指定选择功能表,可以选择的有raw、mangle、nat、filter,默认的是filter表。
--set -----------------记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
--update ------------------是指每次建立连接都更新列表
--seconds -----------------必须与--rcheck或者--update同时使用,几秒
--hitcount ----------------必须与--rcheck或者--update同时使用,几次
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
COMMAND:---------------链的操作命令、规则的操作命令、查看规则的命令
-P -------------定义指定链的【默认策略】(ACCEPT、DROP)
-N ------------【新建】一条自定义的规则链
-X ------------【删除】被内建链【引用次数为0】的自定义链
-F ------------【清除】指定链上的【所有规则】
-E ------------【重命名】被内建链引用次数为0的自定义链
-----------------------------------------------------------
-A -----------------追加,在指定的链的尾部追加一条规则
-I [#] -------------插入,在指定的位置插入一条规则,省略了数字表示将规则插入到链的第一条
-D [#] -------------删除,删除指定的规则
-R -----------------替换,用指定的规则去替换目标链中的原有规则
-Z -----------------重置规则计数器,将指定表指定链上的规则的计数器置0
-----------------------------------------------------------
-L -------------列出指定表指定链上的所有规则
-n -------------规则数字化(主机名、端口号)
-v -------------详细显示
-x -------------精确的显示计数器的结果
--line-numbers --------------------显示规则链中的规则编号
基本匹配条件:
-s -------------源IP地址,是否匹配
-d -------------目标IP地址,是否匹配
-p -------------封装报文协议,是否匹配(tcp、udp、ip、icmp、arp)
-i -------------数据报文【入站】的接口,是否匹配
-o -------------数据报文【出站】的接口,是否匹配
例:
# 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
扩展匹配条件(7种)----------multiport扩展、iprange扩展、string扩展、time扩展、connlimit扩展、limit扩展、state扩展
(1)、multiport扩展 ----------离散或连续的方式【定义多个端口】匹配条件
常用选项:
-m multiport --sports port
-m multiport --dports port
-m multiport --ports 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地址范围】指明连续的多个地址的匹配条件
-m iprange --src-range from[-to]
-m iprange --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扩展 -------------对报文中的应用层数据做【字符串匹配】检测
-m string --algo {bm|kmp} --------------选择处理字符串的算法
-m string --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扩展 ---------------根据报文【到达的时间】与指定的【时间范围】进行匹配度检测
-m time --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
-m time --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
-m time --timestart hh:mm[:ss] --------------------timestart 09:00:00
-m time --timestop hh:mm[:ss] ----------------------timestop 17:00:00
-m time --monthdays day[,day...]
-m time --weekdays day[,day...] ----------------------weekdays Sat,Sun
例:
# 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并发连接数】的匹配
-m connlimit --connlimit-upto n ------------------连接数数量小于等于n,此时规则应设置为允许
-m connlimit --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扩展 -------------------基于【收发报文的速率】进行匹配
-m limit --limit rate[/second|/minute|/hour|/day]
-m limit --limit-burst number
例:
# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT
(7)、state扩展 --------------状态检测(基于连接追踪机制)
格式:-m state --state *
INVALID --------------无效状态(无法识别的状态)
ESTABLISHED --------------连接态(已建立连接的状态)
NEW ------------------新连接态(尚未建立连接的状态)
RELATED ------------关联态(与其他已建立的连接相关联的状态)
UNTRACKED -----------未追踪的连接
/proc/net/nf_conntrack ----------------追踪到的【连接保存】的位置,追踪FTP协议的模块
/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 --------------------默认的规则或最后一条规则拒绝所有主机访问
3、网络防火墙 -------------------filter表FORWARD链规则设置、nat表相关链规则设置
(1)、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
(2)、自定义链:
自定义链的配置如下:
例:
# 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
在主链上【引用】自定义链:
# iptables -I FORWARD 4 -p udp -j udp_match
更改自定义链的名称:-----------自定义链不能被引用
# iptables -E old_chain_name new_chain_name
例:
# iptables -E udp_match udp
删除自定义链:---------------引用计数为0的链、自定义链上必须为空
# iptables -X udp
4、NAT表 -------------SNAT、DNAT
NAT表功能(两个):网络地址转换(NAT)、端口映射(NAPT)
网络地址转换NAT(两类):SNAT(内访外,静态地址转换、地址伪装)、DNAT(外访内,地址转换、端口映射)
(1)、SNAT ----------内访外,静态地址转换、地址伪装
格式:--to-source [ipaddr[-ipaddr]][:port[-port]]
例:
# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50
(2)、MASQUERADE ------------相当于替代
格式:--to-ports port[-port]
例:
# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE
(3)、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
注意:使用iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077 做端口重定向的时候,主机上的真正的80端口不能被httpd监听,否则就会有错误。
(4)、REDIRECT -------------端口重定向
格式:--to-ports port[-port]
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077
(5)、LOG -------------------仅仅是开启内核对匹配的数据包做额外的日志记录
格式:
--log-level level
--log-prefix prefix
--log-ip-options
5、NAT表中,规则的保存和重载
(1)、CentOS 7保存和重载
/etc/sysconfig/iptables -------------------规则保存位置
# iptables-save > /PATH/TO/SOME_RULE_FILE
# iptables-restore < /PATH/FROM/SOME_RULE_FILE
(2)、CentOS 6保存和重载
/etc/sysconfig/iptables -----------------默认规则保存位置
# iptables-save > /PATH/TO/SOME_RULE_FILE
# iptables-restore < /PATH/FROM/SOME_RULE_FILE
# service iptables save
# service iptables restore|restart
二、layer7扩展模块 ----------------------应用层,iptables实现七层访问过滤
文本操作工具:diff、patch
1、diff命令 -----------比较两个文本文件的差异
格式:diff
diff的三种格式:正常格式、上下文格式、合并格式
(1)、正常格式的diff
# diff file1 file2 --------------------结果 3 部分
显示结果中,【第一行】是一个提示,用来说明变动位置。
第一行分为三个部分:
# ------------表示file1的第 # 行有变化
c -------------表示变动的模式是【内容改变change】
a -------------代表增加addition
d -------------代表删除deletion
(2)、上下文格式的diff
常用选项:
-c ---------------context
# diff -c f1 f2 --------------结果 4 部分
显示结果中的四部分如下:
第一部分:-----------两行,显示两个文件的基本情况,*表变动前,-表变动后。
第二部分:-----------15个星号,将文件的基本情况与变动内容分割开。
第三部分:-----------显示变动【前】的文件,即file1。
第四部分:-----------显示变动【后】的文件,即file2。
注:文件内容的每一行最前面,还有一个标记位。
空 ------------表示该行无变化
! -------------表示该行有改动
- -------------表示该行被删除
+ -------------表示该行为新增
(3)、合并格式的diff -----------------将f1和f2的上下文合并在一起显示
常用选项:
-u -------------unified(合并)
# diff -u f1 f2 -----------------上下文各显示3行
显示结果中的三部分如下:
第一部分: -----------文件的基本信息,-表变动前的文件,+表变动后的文件。
第二部分: -----------【变动】的位置用【两个@】作为起首和结束。
第三部分: -----------变动的具体内容。
注:文件内容的每一行最前面,还有一个标记位。
空 ------------表示该行无变化
! -------------表示该行有改动
- -------------表示该行被删除
+ -------------表示该行为新增
2、patch命令 --------------------支持多种diff输出文件格式,可以忽略文件中的冗余信息
格式:patch [options] [originalfile] [patchfile]
常用选项:
-p --------------使用源文件名的【前缀目录】信息
-p0/-p 0 -------------使用全部的路径信息
-p1 ----------------忽略第一个"/"以前的目录,其余类似。
例:
/usr/src/linux-2.4.15/Makefile文件,提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。
3、实现layer7操作步骤,如下:-------------------9步
(1)、获取并编译内核
# useradd mockbuild
# rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
# cd rpmbuild/SOURCES
# tar linux-2.6.32-*.tar.gz -C /usr/src
# cd /usr/src
# ln -sv
(2)、给内核打补丁
# tar xf netfilter-layer7-v2.23.tar.bz2
# cd /usr/src/linux
# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
# cp /boot/config-* .config
# make menuconfig
启用layer7模块步骤:
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
“layer7” match support
(3)、编译并安装内核
# make
# make modules_install
# make install
(4)、重启系统,启用新内核
(5)、编译iptables
# tar xf iptables-1.4.20.tar.gz
# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
# cp /etc/rc.d/init.d/iptales /root
# cp /etc/sysconfig/iptables-config /root
# rpm -e iptables iptables-ipv6 --nodeps
# ./configure --prefix=/usr --with-ksource=/usr/src/linux
# make && make install
# cp /root/iptables /etc/rc.d/init.d
# cp /root/iptables-config /etc/sysconfig
(6)、为layer7模块提供其所识别的协议的【特征码】
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
(7)、使用layer7模块
设置ACCT参数,装载nf_conntrack模块。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax
(8)、编译内核:
# make menuconfig
# make -j #
# make modules_install
# make install
(9)、清理内核源码树
4、抵御对22端口发起的DOS*** -------------解决方法
利用iptables的【recent模块】来抵御对22端口发起的DOS***,建立一个列表,保存有所有访问过指定的服务的客户端IP。
# iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
注:SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
知识点:
(1)、利用connlimit模块将单IP的并发设置为3。会误杀使用NAT上网的用户,可以根据实际情况增大该值。
(2)、利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制【五分钟】后即可恢复访问。
(3)、--set --name SSH -----------------------记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
(4)、记录日志:
使用:
# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
也可使用:
# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
(5)、iptables的记录:/proc/net/xt_recent/SSH
三、SELinux
1、操作系统的【安全级别】:(4个)
1、D ---------最低
2、C:C1、C2
3、B:B1、B2、B3(B3最高)
4、A:A1、A2
2、selinxu【访问控制机制】:
DAC ---------------自主访问控制(针对用户设定)
MAC ---------------强制访问控制(不针对用户)
3、selinux的两种【工作级别】:strict、targeted(默认)
strict ------------------每个文件都受selinux严格管控
targeted ----------------部分文件受selinux管控(默认级别)
4、selinux的【工作模式】:enforcing、permissive、disabled
# setenforce 0 ------------permissive
# setenforce 1 ------------enforcing
# getenforce -----------查看工作级别
使工作模式永久生效:修改配置文件/etc/sysconfig/selinux
SELINUX=enforcing
5、文件的安全标签
(1)、安全标签的查看
# ls --context|-Z [file...] -------------文件的
# ps auxZ -------------进程的
(2)、chcon命令 ----------------更改文件安全标签
格式:chcon [options]... CONTEXT FILE...
常用选项:
-t type ---------类型
-R ------------递归修改文件
--reference=FILE --------------设置相同的安全上下文
适用:目标页面文件的类型与httpd进程的域不相符合时
(3)、restorecon命令 -------------还原安全上下文默认值
常用选项:
-R -----------递归还原文件
6、Linux布尔型规则:
(1)、getsebool命令
常用选项:
-a -------------显示所有已经生效的布尔型规则
(2)、setsebool命令
常用选项:
-P --------写入策略文件,使更改永久生效
例1:
ftp的匿名用户【上传功能】:
# setsebool -P ftpd_full_access=1
# setsebool -P ftpd_anon_write=1
例2:
samba用户访问自己的家目录:
# setsebool -P samba_enable_home_dirs=1
(3)、semanage命令
# semanage port -a -t http_port_t -p tcp 8077
注:需安装policycoreutils-python