Linux系统的防火墙功能是由内核实现的
- 2.0 版内核中,包过滤机制是ipfw,管理工具是ipfwadm
- 2.2 版内核中,包过滤机制是ipchain,管理工具是ipchains
- 2.4 版及以后的内核中,包过滤机制是netfilter,管理工具是iptables
- 3.10版内核中,包过滤机制是firewalld,管理工具是firewall-cmd
- “firewall-cmd”命令其实还是在调用iptables,因此我们有必要先了解一下iptables
不同内核的发行版Linux,防火墙也不同
- CentOS 5.X ~ 6.X,内核是2.4 ~ 2.6,是netfilter
- CentOS 7.X,内核为3.10,是firewalld
netfilter
- 位于Linux内核中的包过滤功能体系
- 称为Linux防火墙的“内核态”
iptables
- 位于/sbin/iptables,用来管理防火墙规则的工具
- 称为Linux防火墙的“用户态”
- iptables的四表五链规则
- 规则写在链中,链包含在表中
- 规则表,容纳各种规则链,实现防火墙的不同功能
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)
- 规则链,容纳各种防火墙规则,决定处理数据包的不同时机
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- POSTROUTING:在进行路由选择后处理数据包
- PREROUTING:在进行路由选择前处理数据包
- 结构示意图:
- 规则表之间的顺序
- Raw → mangle → nat → filter
- 规则链之间的顺序
- 入站:PREROUTING → INPUT
- 入站的目的地是明确的,即当前主机。
- 出站:OUTPUT → POSTROUTING
- 出站的源地址是明确的,即当前主机。
- 转发:PREROUTING → FORWARD → POSTROUTING
- 当防火墙实现路由转发功能时,即数据流穿越防火墙时,为转发。
- 入站:PREROUTING → INPUT
- 规则链内的匹配顺序
- 按顺序依次检查,匹配即停止(LOG策略例外)
- 若找不到相匹配的规则,则按该链的默认策略处理
- 匹配规则示意图:
- 实验环境
- 在虚拟机设置中启用两块网卡eth1(NAT)和eth2(仅主机)
- 配置ip地址
- 防火墙端
- vi /etc/udev/70-persistent-net.rules
- 复制eth1和eth2的mac地址
- vi /etc/sysconfig/network-scrpts/ifcfg-eth1
- 用于连接外网
- 粘贴eth1的mac地址
- static协议
- IPADDR=172.16.8.100
- MASKNET=255.255.255.0
- GATEWAY=172.16.8.2 -这个应该是宿主机的IP或网关
- DNS1=114.114.114.114
- vi /etc/sysconfig/network-scrpts/ifcfg-eth2
- 用于连接内网
- 粘贴eth2的mac地址
- static协议
- IPADDR=192.168.11.11
- MASKNET=255.255.255.0
- 无网关和DNS
- vi /etc/sysconfig/network
- 修改主机名:www.test.com
- vi /etc/hosts
- 172.16.8.100 test www.test.com
- reboot
- vi /etc/udev/70-persistent-net.rules
- 客户端(用于后面的NAT转发)
- 仅主机模式
- IP:192.168.11.3
- 默认网关地址::192.168.11.11
- 防火墙端
- iptables的语法构成
- iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
- 数据包的常见控制类型
- ACCEPT:允许通过
- DROP:直接丢弃,不给出任何回应
- REJECT:拒绝通过,必要时会给出提示
- LOG:记录日志信息,然后传给下一条规则继续匹配
- 注意事项
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内的所有链
- 除非设置链的默认策略,否则必须指定匹配条件
- 选项、链名、控制类型使用大写字母,其余均为小写
- 数据包的常见控制类型
- 命令实例
- 添加新的规则
- -A:在链的末尾追加一条规则
- -I:在链的开头(或指定序号)插入一条规则
- 在Filter表INPUT链中追加一条允许TCP协议通过的规则
- iptables -t filter -A INPUT -p tcp -j ACCEPT
- 在Filter表INPUT链中插入一条允许UDP协议通过的规则
- iptables -I INPUT -p udp -j ACCEPT
- 在Filter表INPUT链第2条位置插入一条允许ICMP协议通过的规则
- iptables -I INPUT 2 -p icmp -j ACCEPT
- 查看规则列表
- -L:列出所有的规则条目
- -n:以数字形式显示地址、端口等信息
- -v:以更详细的方式显示规则信息
- --line-numbers:查看规则时,显示规则的序号
- iptables -n -L INPUT
- 以数字形式查看Filter表INPUT链规则;-n与-L,也可以合写为-nL
- iptables -L INPUT --line-numbers
- 查看Filter表INPUT链规则,并显示规则序号
- 删除、清空规则
- -D:删除链内指定序号(或内容)的一条规则
- -F:清空所有的规则
- 删除Filter表INPUT链中第3条规则
- iptables -D INPUT 3
- 清空规则表
- iptables -F
- iptables -t nat -F
- iptables -t mangle -F
- iptables -t raw -F
- 设置默认策略
- -P:为指定的链设置默认规则
- 默认策略只能是DROP或ACCEPT,2选1
- 设置Filter表中FORWARD规则链的默认策略为DROP
- iptables -t filter -P FORWARD DROP
- 设置Filter表中OUTPUT规则链的默认策略为ACCEPT
- iptables -P OUTPUT ACCEPT
- 添加新的规则
- iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
- 规则的匹配条件
- 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
- 协议匹配:-p 协议名
- 地址匹配:-s 源地址、-d 目的地址
- 接口匹配:-i 入站网卡、-o 出站网卡
- 隐含匹配, 要求以特定的协议匹配作为前提;包括端口、TCP标记、ICMP类型等条件。
- 端口匹配:--sport 源端口、--dport 目的端口
- TCP标记匹配:--tcp-flags 检查范围 被设置的标记
- ICMP类型匹配:--icmp-type ICMP类型
- 显式匹配, 要求以“-m 扩展模块”的形式明确指出类型;包括多端口、MAC地址、IP范围、数据包状态等条件。
- 多端口匹配:-m multiport --sports(dports),源(目的)端口列表
- IP范围匹配:-m iprange --src-range,IP范围
- MAC地址匹配:-m mac --mac-source,MAC地址
- 状态匹配:-m state --state,连接状态
- 通用匹配应用
- iptables -I INPUT -p icmp -j DROP
- iptables -A FORWARD -p ! icmp -j ACCEPT
- “!”号表示取反,版本差异,不同版本的Linux命令写法会有出入
- iptables -A FORWARD -s 192.168.1.11 -j REJECT
- 拒绝来自192.168.1.11的连接
- iptables -I INPUT -s 10.20.30.0/24 -j DROP
- iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
- 指定从eth1网卡进入的源地址为192.168.0.0/16统统pass
- iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
- iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
- 隐含匹配应用
- iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
- 允许该网段进行dns查询
- iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
- iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
- 拒绝带以上标记的TCP包
- iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
- 不带SYN标记的统统接收
- iptables -A INPUT -p icmp --icmp-type 8 -j DROP
- 不允许来自别人的ping
- iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
- iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
- iptables -A INPUT -p icmp -j DROP
- ICMP协议类型8为请求,类型3为不可达,类型0为回显。
- iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
- 显式匹配应用
- iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT
- iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
- iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
- iptables -I INPUT -p tcp -m multiport --dports 80 -j ACCEPT
- iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
- ESTABLISHED,表示已建立的链接,两台机器正在通信。
- RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
- 通用匹配, 可直接使用,不依赖于其他条件或扩展;包括网络协议、IP地址、网络接口等条件。
iptables实现NAT功能
- SNAT,源地址转换,即实现内网主机穿过防火墙访问互联网。
- 局域网各主机正确设置IP地址/子网掩码
- 仅主机模式
- IP:192.168.11.3
- 默认网关地址::192.168.11.11
- Linux网关需要支持IP路由转发
- iptables -F
- echo "1" > /proc/sys/net/ipv4/ip_forward
- 或通过vi /etc/sysctl.conf编辑
- sysctl -p 查看当前状态
- 至此该Linux开启了路由转发功能
- 编写SNAT转换规则
- iptables -t nat -D POSTROUTING 1
- iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j SNAT --to-source 172.16.8.100
- POSTROUTING:路由选择后处理。
- -s X.X.X.X/X:内网源地址。
- -o eth1:外网接口。
- --to-source X.X.X.X:外网接口地址,转换后的新的源地址。
- MASQUERADE —— 地址伪装
- 适用于外网IP地址非固定的情况,如ADSL拨号上网(eth1网卡IP变化)
- iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth1 -j MASQUERADE
- 局域网各主机正确设置IP地址/子网掩码
- DNAT,修改数据包的目标地址或端口号
- 实现内网服务器通过防火墙发布到互联网
- 局域网的Web服务器能够访问Internet
- 网关的外网IP地址有正确的DNS解析记录
- Linux网关支持IP路由转发
- echo "1" > /proc/sys/net/ipv4/ip_forward
- 编写DNAT转换规则
- iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
- PREROUTING:DNAT使用PREROUTING链,路由选择前处理
- -i eth1:外网接口。
- -d X.X.X.X/X:公网目标地址,来自互联网的访问目标。
- --to-destination X.X.X.X:内网IP地址,内网要发布的服务器。
- 可以使用XAMPP自动部署web环境
- 默认是80端口,其它端口的转发需要指定
- 在浏览器输入172.16.8.100测试
- iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.10
- 在DNAT规则中以“IP:Port”的形式指定目标地址与端口
- iptables -t nat -A PREROUTING -i eth1 -d 172.16.8.100 -p tcp --dport 2346 -j DNAT --to-destination 192.168.11.10:22
iptables系统服务与脚本
- 脚本位置:/etc/init.d/iptables
- 规则文件位置:/etc/sysconfig/iptables
- service iptables start|restart|stop|save…
- 配置防火墙脚本
- 编写防火墙脚本→开机时自动执行该脚本
- 脚本执行指令写入/etc/rc.d/rc.local
- vim ipfw.sh
#!/bin/bash WAN_IF="eth1" WAN_IP="172.16.8.100" LAN_IF="eth2" LAN_IP="192.168.11.11" LAN_NET="192.168.11.0/24" LAN_WWW_IP="192.168.11.10" IPT="/sbin/iptables" MOD="/sbin/modprobe" CTL="/sbin/sysctl"
- 加载必要的系统模块,在ipfw.sh中追加
$MOD ip_tables $MOD ip_conntrack $MOD ipt_REJECT $MOD ipt_LOG $MOD ipt_iprange $MOD xt_tcpudp $MOD xt_state $MOD xt_multiport $MOD xt_mac $MOD ip_nat_ftp $MOD ip_conntrack_ftp
- 调整/proc参数, Linux内核控制及调优,在ipfw.sh中追加
$CTL -w net.ipv4.ip_forward=1 $CTL -w net.ipv4.ip_default_ttl=128 $CTL -w net.ipv4.icmp_echo_ignore_all=1 $CTL -w net.ipv4.icmp_echo_ignore_broadcasts=1 $CTL -w net.ipv4.tcp_syncookies=1 $CTL -w net.ipv4.tcp_syn_retries=3 $CTL -w net.ipv4.tcp_synack_retries=3 $CTL -w net.ipv4.tcp_fin_timeout=60 $CTL -w net.ipv4.tcp_max_syn_backlog=3200
- 具体的防火墙规则,在ipfw.sh中追加
- 按表、链分别设置规则,包括默认策略
$IPT -t filter -X $IPT -t nat -X $IPT -t filter -F $IPT -t nat -F $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source $WAN_IP $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
- 使用IP地址黑、白名单
-
- 建立IP地址列表文件
- 黑名单、白名单分开保存
- 每行一个IP地址,或网段地址
vim /opt/ipfw.w 192.168.11.0/24 220.121.72.85 …… vim /opt/ipfw.b 218.29.30.131 61.45.135.29 121.113.79.81
-
- 在脚本中调用黑、白名单,在ipfw.sh中追加
- 使用for循环
- 封锁黑名单地址、放开对白名单地址的限制
BLST="/opt/ipfw.b" for i in $(grep -v "^#" $BLST) do $IPT -I INPUT -s $i -j DROP $IPT -I OUTPUT -d $i -j DROP $IPT -I FORWARD -s $i -j DROP $IPT -I FORWARD -d $i -j DROP done WLST="/opt/ipfw.w" for i in $(grep -v "^#" $WLST) do $IPT -I INPUT -s $i -j ACCEPT $IPT -I OUTPUT -d $i -j ACCEPT $IPT -I FORWARD -s $i -j ACCEPT $IPT -I FORWARD -d $i -j ACCEPT done
-
- 开机自动运行脚本
- cp ipfw.sh /opt/
- vi /etc/rc.d/rc.local
- 添加/opt/ipfw.sh
- reboot
- iptables -L 检查配置情况
- iptables -t nat -L
- 编写防火墙脚本→开机时自动执行该脚本
- 防火墙脚本的构成
- 主机型防火墙
- 针对本机进行保护
- 主要针对filter表中的INPUT、OUTPUT链设置规则
- 修改ipfw.sh
#!/bin/bash # 1. 定义基本变量 IPT= "/sbin/iptables" …… # 3.2 定义默认策略 $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT # 3.3 设置filter表中的各种规则 $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ……
- 网络型防火墙
- 针对网络互访进行保护
- 主要针对filter表中的FORWARD链,以及nat表设置规则
- 修改ipfw.sh
#!/bin/bash …… # 4.3 设置nat表中的各种规则 $IPT -t nat -A POSTROUTING -s $LAN_NET -o $WAN_IF -j SNAT --to-source $WAN_IP $IPT -t nat -A PREROUTING -i $WAN_IF -d $WAN_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP # 4.4 设置filter表中的各种规则 $IPT -A FORWARD -d $LAN_NET -i $WAN_IF -m state --state ESTABLISHED,RELATED -j ACCEPT ……
- 主机型防火墙
Firewalld防火墙
- 特点
- FirewallD提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。
- FirewallD支持IPv4、IPv6防火墙设置以及以太网桥接,并且拥有“运行时配置”和“永久配置”选项。
- FirewallD支持允许服务或者应用程序直接添加到防火墙规则中。
- FirewallD动态管理防火墙,不需要重启整个防火墙便可应用更改。
- FirewallD通过D-BUS提供当前激活的防火墙设置信息,也通过D-BUS接受使用PolicyKit认证方式做的更改。
- 系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
- 提供firewall-cmd命令行界面进行管理及配置工作。
- 为libvirt提供接口及界面,在必须的PolicyKit相关权限允许的情况下实现。
- 提供firewall-config图形化配置工具。
- 实现系统全局及用户进程的防火墙规则配置管理。
- 区域
- 通过将网络划分成不同的区域(通常情况下称为zones),制定出不同区域之间的访问控制策略来控制不同信任程度区域之间转发的数据流。
- 传统防火墙都有区域的概念。
- 例:Netscreen防火墙中“Trust”与“Untrust”区域;
- 例:ASA防火墙中“Inside”与“Outside”区域;
- 例:IPCop防火墙中“Red”与“Green”区域。
- 默认区域
- 在配置规则时,不指定区域则被认定为写入到默认区域。
- FirewallD防火墙的默认区域为“public”
- 区域相关命令
- firewall-cmd --get-zones
- 当前支持的区域列表。
- firewall-cmd --get-default-zone public
- 显示默认区域。
- firewall-cmd --get-zones
- 区域规则中的元素
- 防火墙规则就是由这些元素构成
- 预定义的服务
- 服务是端口(和/或)协议组成的;当然,也可能还包括netfilter助手模块以及目标地址(由IPv4或IPv6地址构成)。
- 端口和协议
- 定义了tcp或udp端口,端口可以是一个端口或者一组端口范围。
- ICMP过滤器
- 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
求或错误条件创建的响应。
- 可用于规则的ICMP报文类型;这些报文可以是信息请求,也可以是对信息请
- 伪装
- 将私网地址映射为公网IP地址(多为动态地址);即源地址转换。
- 端口转发
- 转发一个网络端口从一个网络节点到另一个网络节点的规则。
- 接口与源(略)
- 富规则(后面详细介绍)
- FirewallD预定义区域
- 丢弃区域(Drop Zone):任何进入的数据包都将被丢弃。这个类似与我们之前使用iptables -j DROP。
- 阻塞区域(Block Zone):拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过。
- 公共区域(Public Zone):只接受那些被设定的连接。
- 外部区域(External Zone):这个区域相当于路由器启用伪装(masquerading)选项。只有指定的连接会被接受。
- 隔离区域(DMZ Zone):如果想要只允许给定的部分服务能被外部访问,可以在DMZ区域中定义。
- 工作区域(Work Zone):在这个区域,我们只能定义内部网络。
- 家庭区域(Home Zone):这个区域专门用于家庭环境。
- 内部区域(Internal Zone):这个区域和工作区域(Work Zone)
类似,只能通过被选中的连接。 - 信任区域(Trusted Zone):该区域中的接口将被允许所有的网络通信。
- 区域操作命令
- firewall-cmd --set-default-zone=home
- 设置默认区域
- firewall-cmd --get-active-zones home
- 查看当前活跃区域
- firewall-cmd --list-all-zones
- 列出全部区域及特性
… … public (default, active) interfaces: eno16777728 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules: … …
- firewall-cmd --zone=public --list-all -列出某一区域特性
- 根据接口获取区域信息
- firewall-cmd --get-zone-of-interface=eno16777728 public
- 临时将接口增加到区域
- firewall-cmd --zone=public --add-interface=eno16777728
- 临时修改接口所属区域
- firewall-cmd --zone=public --change-interface=eno16777728 success
- 临时从区域中删除一个接口
- firewall-cmd --zone=public --remove-interface=eno16777728 success
- 查询区域中是否包含某接口,未指定区域名,实则为默认区域
- firewall-cmd --zone= --query-interface=eno16777728 Yes
- 查询区域中已启用的服务
- firewall-cmd --zone= --list-services dhcpv6-client ssh
- firewall-cmd --set-default-zone=home
- 防火墙基本操作
- 启动服务
- systemctl enable firewalld.service
- 停止服务
- systemctl stop firewalld.service
- 查看防火墙状态
- systemctl status firewalld.service
- 服务管理
- 显示服务列表
- firewall-cmd --get-services
- 显示当前服务
- firewall-cmd --list-services
- 允许某服务通过,其中选项--permanent,表示为永久配置项
- firewall-cmd --permanent --zone=internal --add-service=http
- 临时开启某服务,选项--timeout,表示临时开启秒数
- firewall-cmd --zone=work --add-service=smtp --timeout=60
- firewall-cmd --reload - 配置规则重新载入
- 从区域移除服务
- firewall-cmd --zone=public --remove-service=ftp
- 显示服务列表
- 端口管理
- 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
- firewall-cmd --zone=public --add-port=443/tcp
- firewall-cmd --zone=public --remove-port=443/tcp
- 端口转发,在external区域实现SNAT伪装
- firewall-cmd --zone=external --add-masquerade
- 端口转发,把public区域的80端口转发到3128端口
- firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=3128
- 端口转发,把external区域的443端口转发到内网172.16.8.201这台主机
- firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.16.8.201
- 移除一个端口转发规则
- firewall-cmd --zone=external --remove-forward-port=port=443:proto=tcp:toport=3128:toaddr=172.16.8.201
- 列表区域中已开启端口与端口转发规则
- firewall-cmd --zone=public --list-ports
- firewall-cmd --zone=external --list-forward-ports
- 打开或关闭端口,打开/关闭“443/tcp”端口在public区域
- 其他命令
- 启用应急模式阻断所有网络连接,以防出现紧急状况
- firewall-cmd --panic-on
- firewall-cmd --panic-off //禁用应急模式
- firewall-cmd --query-panic //查询应急模式
- 获取所有支持的ICMP类型
- firewall-cmd --get-icmptypes
- 阻塞默认区域中的ICMP应答报文
- firewall-cmd --add-icmp-block=echo-reply
- 禁止ICMP应答阻塞
- firewall-cmd --remove-icmp-block=echo-reply/request
- 查询ICMP应答报文的阻塞状态
- firewall-cmd --query-icmp-block=echo-reply
- 通过--direct参数直接将iptables命令参数传递给防火墙
- firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp -- dport 80 -j ACCEPT
- 启用应急模式阻断所有网络连接,以防出现紧急状况
- 富规则(Rich Language-复杂防火墙规则
- 增加、移除、查询规则:
- firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
- 允许源ipv4地址为172.16.8.201的http服务通过默认区域
- firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --timeout=90
- 永久规则
- firewall-cmd --add-rich-rule 'rule family="ipv4" source address="172.16.8.201/24" service name="http" accept' --permanent
- 允许源ipv4地址为172.16.8.201的http服务通过默认区域
- firewall-cmd [--zone=zone] --remove-rich-rule='rule' [--permanent]
- firewall-cmd [--zone=zone] --query-rich-rule='rule '
- firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
- rule参数:
- rule family="ipv4|ipv6"
- source address="address[/mask]" [invert="True"]
- destination address="address[/mask]" [invert="True" ]
- service name="service name"
- port="port value" protocol="tcp|udp"
- icmp-block name="icmptype name"
- masquerade
- forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
- log [prefix="prefix text"] [level="log level"] [limitvalue="rate/duration"] [audit]
- accept | reject [type="reject type"] | drop
- rule例子(结合防火墙图形配置工具来理解以下规则)
- firewall-cmd --add-rich-rule 'rule protocol value="ah" accept'
- firewall-cmd --add-rich-rule 'rule service name="ftp" log limit value="1/m" audit accept'
- firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp"
level="info" limit value="1/m" accept' - firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
- firewall-cmd --add-rich-rule 'rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"'
- firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.3" reject type="icmp-admin-prohibited"'
- firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.2.4" drop'
- 增加、移除、查询规则:
- 在防火墙配置文件中创建自己的服务
- 我们准备添加一个新的服务叫rtmp,使用TCP协议,端口号是9527,步骤如下:
- cd /etc/firewalld/services/
- cp /usr/lib/firewalld/services/nfs.xml ./ //找个模板
- mv nfs.xml rtmp.xml
- vim rtmp.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>RTMP</short> <description>The RTMP protocol Bala Bala ...</description> <port protocol="tcp" port="9527"/> </service>
- firewall-cmd --reload
- 防火墙配置重载
- firewall-cmd --add-service=rtmp
- cat /etc/firewalld/service/rtmp.service
- 启动服务
SeLinux机制
安全增强型Linux(SELinux)开始是由NSA(国家安全局)启动并加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。SELinux提供了一种灵活的强制访问控制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个“用户”、“进程”、“应用”和“文件”的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略将指定如何严格或宽松地进行检查。
SELinux对系统用户(system users)是透明的,只有系统管理员(root)需要考虑
在他的服务器中如何制定严格的策略。策略可以根据需要是严格的或宽松的。
只有同时满足了“标准Linux访问控制”和“SELinux访问控制”时,主体才能
访问客体。
-
Security-Enhanced Linux由以下两部分组成
-
- Kernel SELinux模块(/kernel/security/selinux)
-
- 用户态工具
-
-
DAC和MAC的区别(root用户)
- 未启用SELinux的Linux系统是使用自主访问控制模型(DAC)的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。
- 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。强制访问控制模型(MAC)原本就是为军队开发的。
- SELinux实现了一个更灵活的MAC形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全模型(Multi-Level Security)。DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路。
-
SeLinux的运行机制
- 当一个subject(主体,如: 一个应用)试图访问一个object(客体,如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节写入/var/log/messages。
-
SeLinux伪文件系统
- /sys/fs/selinux/”伪文件系统类似于“/proc/”伪文件系统;它存储了SELinux系统的状态。系统管理员和用户不需要操作这部分(通常借助相关命令修改其状态)
- 可以这样修改
- cd /sys/fs/selinux
- more enforce
- 0 //SELinux处于警告模式
- echo 1 > enforce
- more enforce
- 1 //SELinux改为强制模式
-
SeLinux配置文件
- 目录:/etc/selinux
- “/etc/sysconfig/selinux”是“/etc/selinux/config” 主配置文件的符号链接。
- /etc/sysconfig/selinux中包含如下配置选项:
- 打开或关闭SELinux
- 设置系统执行哪一个策略(policy)
- 设置系统如何执行策略(policy)
- SELINUX=enforcing,定义SELinux运行状态
- Enforcing:SELinux安全策略置于强制模式。
- Permissive:SELinux安全策略置于警告模式。
- Disabled:SELinux完全被禁用。SELinux内核和伪文件系统脱钩,处于未注册状态。
- SELINUXTYPE=targeted,定义SELinux策略模型
- Targeted,类型强制(TE,Type Enforcement)访问控制,基于目标策略进行保护;
- Minimum,Targeted策略模型的修改版本。仅针对选定的过程实施保护;
- MLS,多层次安全保护模型(MLS,Multi-Level Security)。
- 目录:/etc/selinux
-
SeLinux命令工具
- /usr/sbin/setenforce,修改SELinux运行模式
- setenforce 1 //SELinux以强制(enforcing)模式运行
- setenforce 0 //SELinux以警告(permissive)模式运行
- /usr/sbin/getenforce,查看SELinux模式
- /usr/sbin/sestatus -v ,显示系统的详细状态
- /usr/bin/chcon,修改对象(文件)的安全上下文,比如:用户:角色:类型:安全级别
- 用法:
- chcon [选项]... 环境 文件...
- chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
- chcon [选项]... --reference=参考文件 文件...
- chcon [选项]... 环境 文件...
- 参数:
- -h, --no-dereference 影响符号链接文件,而不是引用文件
- --reference=参考文件 使用指定参考文件的安全环境,而非指定值
- -R, --recursive 递归处理所有的文件及子目录
- 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
- -H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
- -L 遍历每一个遇到的通到目录的符号链接
- -P 不遍历任何符号链接(默认)
- 以下选项是在指定了-R选项时被用于设置如何穿越目录结构体系;如果您指定了多于一个选项,那么只有最后一个会生效。
- -v, --verbose 为处理的所有文件显示诊断信息
- -u, --user=用户 设置指定用户的目标安全环境
- -r, --role=角色 设置指定角色的目标安全环境
- -t, --type=类型 设置指定类型的目标安全环境
- -l, --range=范围 设置指定范围的目标安全环境
- --help 显示此帮助信息并退出
- --version 显示版本信息并退出
- 用例
- mkdir -p /var/share/up
- -p表示可以创建不存在的上级目录
- 允许该目录匿名共享
- chcon -R -t public_content_t /var/share
- 允许向该目录上传文件
- chcon -t public_content_rw_t /var/share/up
- mkdir -p /var/share/up
- /usr/sbin/setenforce,修改SELinux运行模式
-
策略与规则管理相关命令
- getsebool命令、setsebool命令、semanage命令
- /usr/sbin/setsebool,用于修改SElinux策略内各项规则的布尔值。
- 语法
- setsebool [-P] 布尔值=[0|1]
- 选项
- -P:直接将设置值写入配置文件,该设置数据将来会生效的。
- 用例:
- 允许vsftpd匿名用户写入权限:
- setsebool -P allow_ftpd_anon_write=1
- 允许ftp用户访问自己的家目录:
- setsebool -P ftp_home_dir 1
- HTTP被允许CGI设置:
- setsebool -P httpd_enable_cgi 1
- 允许用户以HTTP方式访问其个人主页,该设定限仅于用户的家目录主页:
- setsebool -P httpd_enable_homedirs 1
- chcon -R -t httpd_sys_content_t ~user/public_html
- 允许httpd访问终端:
- setsebool -P httpd_tty_comm 1
- 关于named、master更新selinux设定:
- setsebool -P named_write_master_zones 1
- Selinux将本机的NFS共享设置成只读:
- setsebool -P nfs_export_all_ro 1
- SElinux将本机的NFS共享设置成可读可写:
- setsebool -P nfs_export_all_rw 1
- 将远程NFS的家目录共享到本机:
- setsebool -P use_nfs_home_dirs 1
- 将samba服务器共享目录给多个域:
- setsebool -P allow_smbd_anon_write=1
- 允许samba服务器共享家目录:
- setsebool -P samba_enable_home_dirs 1
- 在本机上使用远程samba服务器的家目录:
- setsebool -P use_samba_home_dirs 1
- 允许rsync其他用户写入:
- setsebool -P allow_rsync_anon_write=1
- 允许系统使用kerberos:
- setsebool -P allow_kerberos 1
- 允许vsftpd匿名用户写入权限:
- 语法
- /usr/sbin/getsebool,用来查询SElinux策略内各项规则的布尔值。
- 语法
- getsebool [-a] [布尔值条款]
- 选项
- -a:列出当前系统所有布尔值条款设置值。
- 语法
- /usr/sbin/semanage,用来查询与修改SELinux默认目录的安全上下文。
- 语法
- semanage {login|user|port|interface|fcontext|translation} -l
- semanage fcontext -{a|d|m} [-frst] file_spec
- 选项
- -l:查询。
- fcontext:主要用在安全上下文方面。
- -a:增加,你可以增加一些目录的默认安全上下文类型设置。
- -m:修改。
- -d:删除。
- 用例
- semanage fcontext -l |grep /var/www/html
- 设置/var/share目录的默认安全性本文为public_content_t
- semanage fcontext -a -t public_content_t "/var/share(/.*)?"
- semanage fcontext -l |grep "/var/share"
- 规则其实写在这里
- cat /etc/slinux/targetd/contexts/files/file_contexts.local
- 尝试给其恢复默认值
- restorecon -Rv "/var/share"
- 如果没有默认值,会失败
- 语法
- /usr/sbin/restorecon,用来恢复SELinux文件属性即恢复文件的安全上下文。
- 语法
restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f
filename | pathname...] - 选项
- -i: 忽略不存在的文件。
- -f infilename文件: infilename中记录要处理的文件。
- -e directory: 需要排除的目录。
- -R/-r: 递归处理目录。
- -n: 不改变文件标签。
- -o outfilename: 在文件不正确的情况下保存文件列表到outfilename。
- -v:将过程显示到屏幕上。
- -F:强制恢复文件安全语境
- 用法
假设CentOS安装了apache,网页默认的主目录是/var/www/html,我们经 常遇到这样的问题,在其他目录中创建了一个网页文件,然后用mv移动到网 页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可 能是因为这个文件的SELinux配置信息是继承原来那个目录的,与 /var/www/html目录不同,使用mv移动的时候,这个SELinux配置信息也一 起移动过来了,从而导致无法打开页面,具体请看下面的实例: cd echo "Hello" >index.html ll -Z //可以查看安全上下文关系 mv index.html /var/www/html/ systemctl start httpd.service 使用浏览器访问测试 作如下操作,恢复index.html的安全上下文,再用浏览器访问 cd /var/www/html/ ls -Z .. restorecon -R /var/www/html/
- 语法
-
安全上下文
- 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,
类型标识符
是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),“域”和“域类型”意思都一样,我们不必苛刻地去区分或避免使用术语域;通常,我们认为域、域类型、主体类型和进程类型都是同义的,即都是安全上下文中的TYPE
。 - SELinux对系统中的许多命令做了修改,通过添加一个“-Z”选项显示客体和主体的安全上下文。
- 主体:系统根据PAM子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文;
- 客体文件的Security Context规则如下:
- rpm包安装的:会根据rpm包内记录来生成安全上下文;
- 手动创建的文件:会根据policy中的规定来设置安全上下文;
- cp:会重新生成安全上下文;
- mv:安全上下文则不变。
- 安全上下文相关的选项:-Z
- 安全上下文的格式
- 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
- 安全上下文中的用户和角色标识符对类型强制访问控制策略没什么影响;
- 对于进程,用户和角色标识符显得更有意义,因为它们把控制类型和用户标识符联合,这样就会与Linux用户账号关联起来;
- 对于客体,用户和角色标识符几乎很少使用,为了规范管理,客体的角色常常是object_r,客体的用户常常是创建客体的进程的用户标识符,它们在访问控制上没什么作用
- 标准Linux安全(DAC)中的用户ID和SELinux安全上下文(MAC)中的用户标识符分别用于标准(DAC)的和安全增强(MAC)的访问控制机制;两者之间的任何一个相互关联都是通过登陆进程按照规范严格规定的,而不是通过SELinux策略直接强制实施的。
- USER
- user identity:类似Linux系统中的UID,提供身份识别,用来记录身份,安全上下文的一部分;
- 几种常见的 user:
- user_u :普通用户登录系统后的预设;
- system_u :开机过程中系统进程的预设;
- unconfined_u:自由,非限制用户标识,系统预设;
- root :root登录后的预设;
- 在 targeted policy中users不是很重要;
- 在strict policy中比较重要,所有预设的SELinux Users都是以“_u”结尾的,root除外。
- ROLE
- 文件、目录和设备的role:通常是object_r;
- 程序的role:通常是system_r;
- 用户的role:
- 用户的role,类似系统中的GID,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;
- targeted policy为system_r;
- strict policy为sysadm_r、staff_r、user_r;
- 使用基于RBAC(Roles Based Access Control)的strict(新版已淘汰)和mls策略中,用来存储角色信息。
- TYPE
- type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
- 当一个类型与执行中的进程相关联时,其type也称为domain;
- type是SElinux security context中最重要的部位,是SELinux类型强制执行安全模型的核心,预设值以_t结尾;
- LEVEL和CATEGORY:定义层次和分类,只用于MLS策略中;
- LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
- CATEGORY:代表分类,目前已经定义的分类为c0-c1023
- 在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯管道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文
- 安全上下文是一个简单的、一致的访问控制属性,在SELinux中,
-
SELinux和标准Linux的访问控制属性的对比
- 在SELinux中,访问控制属性总是安全上下文(用户:角色:类型)形式,所有客体和主体都有一个关联的安全上下文。需要特别指出的是,因为SELinux的主要访问控制特性是类型强制,安全上下文中的类型标识符决定了访问权。
- 注意:SELinux是在标准Linux访问控制基础之上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须同时满足才能访问一个客体;
- 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
那么我们也不能写该文件。
- 例如:如果我们对某个文件有SELinux写入权限,但我们没有该文件的w权限,
- 标准Linux基于用户和组ID进行访问控制
- 系统中每个文件、目录、网络端口等都被指定一个安全上下文,策略(policy)则给出各安全上下文之间的作用规则。
- SELinux根据策略(policy)及安全上下文(security context)规则来决定存取行为是否可执行
- 主体(Subject)主体:系统进程,比如/usr/sbin/httpd;
- 客体(Object)客体:被存取的项目,比如文件、目录、套接字接口等
-
类型强制(TE)访问控制
- Type Enforcement(TE),在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用/组ID是什么;所以在SELinux中,没有默认的超级用户。
- SELinux通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
- 源类型(Source type(s)),通常是尝试访问的进程的域类型
- 目标类型(Target type(s)),被进程访问的客体的类型
- 客体类别(Object class(es)),指定允许访问的客体的类别
- 许可(Permission(s)),允许源类型访问客体类型的具体权限
- 举个例子:
- allow user_t bin_t : file {read execute getattr};
- 允许主体user_t访问客体bin_t,访问的类别为file(至于其它类别,想都别想),能够行使的权限有读、执行、获取属性。
- allow user_t bin_t : file {read execute getattr};
-
基于角色的访问控制(RBAC)
- Role Base Access Control(RBAC)是一种权限与角色相关联的通用访问控制安全模型,用户通过成为适当角色的成员而得到这些角色的权限,从而较为方便的实现不同人员的权限分配。不同于细粒度的能力划分,RBAC更像是一种能力的集合体,由一种管理需求设计角色,然后为角色分配细粒度的能力,使得角色成为与人员较为对等的映射关系。
- 在RBAC模型中,人员可以应需求切换角色,角色可以应调整进行修改其拥有的能力。对比MAC,管理模式更加人性化,更加适合应用于实际的人员管理。
- SELinux中的RBAC主要通过其安全上下文的role字段实现。
-
SeLinux中的多级安全
- MLS(Multi-Level Security)多级安全是BLP(Bell-La-Padula)模型在SELinux中的体现。
- MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。
- 为了支持MLS,安全上下文被扩展了,包括了安全级别。
- 在SELinux下的Type Enforcement(TE)是一个更加灵活和更具表现力的安全策略,在许多情况下,TE比MLS更适合。在一些场景中,MLS是仍然是必须的。如:一个文件服务器上存有混合分类的数据,且客户以不同的许可连接此服务器这将导致在一个简单的系统中,需要大量的安全 级别来强制隔离所有数据。这种场景就适合应用MLS。
- MLS安全上下文至少必须有一个安全级别(它由敏感度和范畴组成),但可以包括两个安全级别。