Please enable Javascript to view the contents

SELinux 和 iptables

 ·  ☕ 6 分钟

最近操作服务器时,遇到了一些不同清楚的概率,查找了一些资料,整理如下。

1. BLP 安全模型

该模型将信息系统中的实体分为两部分:

  • 主体(Subject),实时操作的,如用户和进程
  • 客体(Object),被操作的对象,如文件和数据库等。

对主体和客体来说,有两种最重要的安全控制方法:

  • DAC(Discretionary Access Control,自主访问控制)。DAC 机制就是指对象的拥有者可以任意修改或授予此对象相应的权限。从主体和客体的角度来说,就是主体对其拥有的客体,有权决定自己和其他主体对该客体应具有怎样的访问权限。

  • MAC(Mandatory Access Control,强制访问控制)。MAC 机制是指系统不再允许对象的拥有者随意修改或授予此对象相应的权限,而是通过强制的方式为每个对象一一授予权限,SELinux 即采用这种机制。该机制主要通过安全级来实现。

2. SELinux

NSA(美国国家安全局)发现大部分操作系统都是以 DAC 机制为安全认证基础的。由于 DAC 机制的设计,很不利于系统安全,NSA 便一直致力于开发一套更安全的 MAC 操作系统安全认证机制。

SELinux 正是为解决这类问题而设计。在 SELinux 下,root 账号采用强制访问控制机制。同时,限制用户和程序(主体)使用最低权限做足以完成任务的工作,极大地提升了 Linux系统的安全性。

在启用了 SELinux 的 Linux 操作系统中,某个对象需要执行某个操作时,先通过 DAC 机制的检测,再由 SELinux 定制的安全策略来检测。

举例来说,系统上的 Apache 被发现存在一个漏洞,使得某远程用户可以访问系统上的敏感文件(比如, /etc/passwd )。此时可以绕开 DAC 检测机制,但对于 /etc/passwd 的访问会被 SELinux 阻止。 SELinux 可以显著降低 0-day 安全漏洞的影响。

2.1 获取 SELinux 运行状态

1
getenforce

可能返回结果有三种:

  • Disabled 表示 SELinux 被禁用
  • Permissive 表示仅记录安全警告但不阻止可疑行为
  • Enforcing 表示记录警告且阻止可疑行为

2.2 改变 SELinux 运行状态

1
setenforce [1 | 0 ]
  • 0 表示 Permissive,
  • 1 指代 Enforcing

此命令只在当次开机生效,重启后失效。

3. Netfilter

Netfilter 是 Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的安全框架,提供了一整套的 hook 函数的管理机制。它具有如下功能:

  • 网络地址转换(Network Address Translate)
  • 数据包内容修改
  • 数据包过滤的防火墙

4. iptables

iptables 是对 Netfilter 进行设置的工具,用户通过 iptables,将用户的安全设定执行到对应的防火墙 Netfilter 中。

它有五个钩子(Hook)去控制包的流动:

  • INPUT:进入本机
  • OUTPUT:本机输出
  • FORWARD:转发
  • PREROUTING:输入控制
  • POSTROUTING:输出控制

4.1 使用方法

关于添加/除去/编辑规则的命令的一般语法如下:

1
iptables [-t table] command [match] [target]

一条 iptables 规则包含如下 4 个基本元素:

  • 表,有三种可用的表选项:filter、nat 和 mangle。
    • filter 表用于一般的信息包过滤
    • nat 表用于要转发的信息包
    • mangle 表用于信息包及其头内进行更改
  • 命令
    • -A 或 –append 该命令将一条规则附加到链的末尾
    • -D 或 –delete 通过用 -D 指定要匹配的规则或者指定规则在链中的位置编号,该命令从链中删除该规则
    • -P 或 –policy 该命令设置链的默认目标,即策略。所有与链中任何规则都不匹配的信息包都将被强制使用此链的策略
    • -N 或 –new-chain 用命令中所指定的名称创建一个新链
    • -F 或 –flush 如果指定链名,该命令删除链中的所有规则,如果未指定链名,该命令删除所有链中的所有规则。此参数用于快速清除
    • -L 或 –list 列出指定链中的所有规则
    • -R 或 –replace 替换指定链中一条匹配的规则
    • -X 或 –delete-chain 删除指定用户的的定义链,若没有指定链,则删除所有的用户链
    • -C 或 –check 检查数据包是否与指定链的规则相匹配
    • -Z 或 –zero 将指定链中所有规则的 byte 计数器清零
  • 匹配
    • -p 或 –protocol 该通用协议匹配用于检查某些特定协议。协议示例有 TCP、UDP、ICMP、用逗号分隔的任何这三种协议的组合列表以及 ALL(用于所有协议)。ALL 是默认匹配。可以使用!符号表示不与该项匹配
    • -s 或 –source 该源匹配用于根据信息包的源IP地址来与它们匹配。该匹配还允许对某一范围内的IP地址进行匹配,可以使用!符号,表示不与该项匹配。默认源匹配与所有 IP 地址匹配
    • -d 或 –destination 该目的地匹配用于根据信息包的目的地 IP 地址来与它们匹配。该匹配还允许对某一范围内 IP 地址进行匹配,可以使用!符号表示不与该项匹配
    • –sport 指定匹配规则的源端口或端口范围
    • –dport 指定匹配规则的目的端口或端口范围
      -i 匹配单独的网络接口或某种类型的接口设置过滤规则
  • 目标
    • ACCEPT 当信息包与具有 ACCEPT 目标的规则完全匹配时,会被接受(允许它前往目的地)
    • DROP 当信息包与具有 DROP 目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为 -j DROP
    • REJECT 该目标的工作方式与 DROP 目标相同,但它比 DROP 好。和 DROP 不同,REJECT 不会在服务器和客户机上留下死套接字。另外,REJECT 将错误消息发回给信息包的发送方。该目标被指定为 -j REJECT
    • RETURN 在规则中设置的 RETURN 目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如 INPUT 之类的主链,则使用该链的默认策略处理信息包。它被指定为 -jump RETURN
    • LOG 表示将包的有关信息记录入日志
    • TOS 表示改写数据包的 TOS 值

4.2 常用命令

1
2
3
4
5
6
7
8
#先检查是否安装了iptables
service iptables status
#安装iptables
yum install -y iptables
#升级iptables
yum update iptables
#安装iptables-services
yum install iptables-services

CentOS 7 默认使用 firewalld 来管理 Netfilter 子系统,不过底层调用的命令仍然是 iptables 等。

1
2
3
4
#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
iptables -P FORWARD DROP
1
2
3
4
# 保存配置
service iptables save
# 重启服务
systemctl restart iptables.service

4.3 删除规则

语法:

1
iptables -D chain rulenum [options]
  • chain 指的是 INPUT、FORWARD 之类
  • rulenum 指的是规则的编号

例如,先使用 iptables -L INPUT 查看规则列表,然后执行 iptables -D INPUT 3 删除第三条规则。

5. 参考


微信公众号
作者
微信公众号