• Linux之安全最佳做法(未完成)


    一、前言

    一直跟Linux打交道,但是凡事多扰,一直未专门针对系统安全做过针对性总结,基于此,本文将记录总结一些Linux 安全配置过程中的常用实践,最后梳理成为安全最佳实践。

    在这里插入图片描述
    Linux以其稳定,高并发,甚至免费等特点,经过多年的应用发展,如今,互联网很多的应用已在 Linux 操作系统上使用,国内BAT等互联网巨头也已建设成千上万台服务器,分布全国的数据及灾备中心,95%以上使用的都是Linux系统。而随着Linux大规模的应用带来的安全问题也越来越多,下面是一些给安全人员带来巨大挑战的知名漏洞:

    Struts2 远程代码执行漏洞通告(CVE-2017-5638);
    Linux 内核提权漏洞(Dirty Cow) (CVE-2016-5195);
    ElasticSearch 远程执行代码安全漏洞(CVE-2014-3120);
    Bash 远程执行命令漏洞(Bash破壳) (CVE-2014-6271);
    Nginx 远程执行代码安全漏洞(CVE-2014-0088);
    MongoDB 匿名登录漏洞;
    心脏流血漏洞;
    Linux内核漏洞:“Phoenix Talon”(高危:CVE-2017-8890、CVE-2017-9075、CVE-2017-9076、CVE-2017-9077,影响几乎所有Linux kernel 2.5.69 - Linux kernel 4.11的内核版本,Linux 4.12-rc1中被修复);

    二、防火墙配置

    Linux防火墙是由Netfilter组件/安全框架提供的,Netfilter工作在内核空间,Netfilter是Linux操作系统核心层内部的一个数据包处理模块,集成在linux内核中,Netfilter 是Linux2.4.x之后集成进的新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,可提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈可无缝契合,允许对数据报进行过滤、地址转换、处理等操作,而Linux终端通过软件包iptables提供的命令行工具,工作在用户空间,用来与用户交互已管理编写规则,之后这些规则被送往netfilter,告诉内核如何去处理通过Netfilter信息包,更多参看Netfilter官网文档

    在这里插入图片描述

    在Linux 7 版开始引入了新的前端管理工具,即firewall,程序包:firewalld和firewalld-config,命令行工具:firewall-cmd 命令行工具和firewall-config 图形工具;

    CentOS 8 中,引入Nftables;它在2013年末合并到Linux内核中,自2014年以来已在内核3.13中可用。它重用了netfilter框架的许多部分,例如连接跟踪和NAT功能。它还保留了命名法和基本iptables设计的几个部分,例如表,链和规则。就像iptables一样,表充当链的容器,并且链包含单独的规则,这些规则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链。nftables添加了一个名为nft的新工具,该工具替代了iptables,arptables和ebtables中的所有其他工具。从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时评估的那些部分。检查:rpm -qi nftables;systemctl status nftables.service ;因此,centos8中支持3种防火墙: iptables、firewalld和nftables。Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则,由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上;从 Linux kernel 4.2 版以后,Netfilter 在prerouting 前加了一个 ingress 勾子函数。可以使用这个新的入口挂钩来过滤来自第2层的流量,这个新挂钩比预路由要早,基本上是 tc 命令(流量控制工具)的替代品。

    在这里插入图片描述

    防火墙按网络协议可划分为:

    网络层防火墙:OSI模型下四层,又称为包过滤防火墙
    应用层防火墙/代理服务器:代理网关,OSI模型七层

    2.1、包过滤防火墙Iptables

    ● Linux 防火墙的过滤框架:
    在这里插入图片描述
    在这里插入图片描述

    ● iptables四表:

    filter(实现实现数据过滤,内核模块:iptables_filter):三个链:INPUT,OUTPUT,FORWARD
    nat (实现实现网络地址转换,三个链,内核模块:iptable_nat):PREROUTING,OUTPUT,POSTROUTING
    mangle(为数据打标记,五个链,修改数据包的服务类型、TTL、并且可以配置路由实现QOS;内核模块:iptable_mangle):INPUT,FORWARD,OUTPUT,PREROUTING,POSTROUTING;拆解报文 做出修改 并重新封装
    raw(数据跟踪的,两个链)PREROUTING,OUTPUT;关闭nat表上启用的连接追踪机制,决定数据包是否被状态跟踪机制处理

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    1)添加规则

    iptables -A 链名 -p 协议 --dport 端口号 -j ACCEPT        //端口对外开放
    iptables -A 链名 -p 协议 --dport 端口号 -j DROP          //拒绝端口对外开放
    iptables -A 链名 -p 协议 --dport 端口号 -j REJECT        //拒绝端口对外开放,响应时间短
    iptables -A 链名 -s IP/网段 -p 协议 --dport 端口号 -j ACCEPT        //开放固定IP或者网段对端口的访问权限
    #修改规则
    iptables -R INPUT 7 -d 192.168.10.1 -p icmp --icmp-type 0 -j ACCEPT  #修改规则7可ping
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)查看规则

    iptables [-t filter] -NV [chain_name] --line-number    //查看指定链规则信息,不写链名查看全部规则
    
    • 1

    参数说明:

    -t:指定包经过安全过滤器要匹配的规则集/链表;filter默认可忽略,nat,mangle,raw,security(用于强制访问控制(MAC)网络规则;强制访问控制由Linux安全模块(如SELinux)实现。安全表被调用在筛选表之后,允许筛选表中的任意任意访问控制(DAC)规则在MAC之前生效规则。该表提供了以下内置链:INPUT(用于进入盒子本身的数据包)、OUTPUT(用于更改路由之前本地生成的分组)和FORWARD(用于改变通过盒子路由的分组)。)
    -A(append):在规则链末尾追加安全规则;
    -C(check):检查所选链中是否存在与规范匹配的规则。
    -R(replace):替换指定规则链中的某条规则,需指定规则号,从1开始;
    -Z(zero):置零指定规则链里规则中记录的包和字节数
    -N(new-chain):用户自定义新的规则链
    -X(delete-chain):删除规则链,前提该链中的规则需空,且不能被其他规则链引用
    -P(policy):对内建规则链配置策略规则
    -E:重命名规则链
    -m(match):一条规则先匹配match规则,如果匹配再匹配后面的参数,否则阻断
    -g(goto):定义跳转到继续处理的其他规则链
    -I:选项添加的防火墙规则则会默认插入到链中作为第一条规则
    使用“!”可以将条件取反
    3)删除规则

    iptables -F [chain_name]   //清空指定链规则,链名不写则清空所有链规则
    iptables [-t filter] -X [chain_name] //不写链名时,则清空指定表下自定义链,默认filter表,删除前需要清空规则
    iptables -D INPUT 3
    
    • 1
    • 2
    • 3

    4)规则导出导入

    iptables-save > /opt/iptables 		//保存至指定路径 后期可以使用保存文件恢复配置信息
    iptables-restore < /opt/iptables  //使用保存文件恢复配置信息
    #持久保存规则
    #CentOS 7,8
    iptables-save  >  /PATH/TO/SOME_RULES_FILE
    #CentOS 6,将规则覆盖保存至/etc/sysconfig/iptables文件中
    service  iptables  save
    yum install iptables-services
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5)修改配置文件

    vi /etc/sysconfig/iptables  #如下所示
    
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT    //允许80端口通过防火墙
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT	//允许3306端口通过防火墙
    -A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT		//允许21端口通过防火墙
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 443  -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    -A INPUT -m state --state ESTABLISHED,RELATED -jACCEPT  //允许所有已建立连接的、RELATED主动建立连接的 流量通过防火墙INPUT链,进允许进入;注意:iptables内有个名称为ip_conntrack_ftp的helper,可以针对连入与连外目的
    port为21 的 ftp协定命令沟通进行拦截,执行modprobe ip_conntrack_ftp ports=21,30000,就是允许ftp服务分别在port 21与30000上,让ip_conntrack_ftp 这个ftp helper 能够正常提供 ftp 用户端使用passive mode存取而不会产生问题。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    #临时加载
    modprobe  ip_tables
    modprobe  iptable_filter
    modprobe  iptable_nat
    modprobe  ip_conntrack
    modprobe  ip_conntrack_ftp
    modprobe  ip_nat_ftp
    modprobe  ipt_state
    
    #永久加载
    cat >> /etc/rc.local <<EOF
    modprobe  ip_tables
    modprobe  iptable_filter
    modprobe  iptable_nat
    modprobe  ip_conntrack
    modprobe  ip_conntrack_ftp
    modprobe  ip_nat_ftp
    modprobe  ipt_state
    EOF
    
    lsmod|egrep 'filter|nat|ipt'
    
    cat /etc/sysctl.conf
    
    net.ipv4.icmp_echo_ignore_all = 1
    
    sysctl -p  # 刷新
    
    • 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

    6)iptables 模块

    1、multiport 多端口管理:-m multiport、–sports port1,port2,port3、–dports port1,port2,port3

    iptables -I INPUT -s 192.168.10.1 -d 192.168.10.3 -p tcp -m multiport --dports 446,6379,22 -j ACCEPT
    
    • 1

    2、iprange 使用:

    -m iprange --src-range IP1[-IP2](连续写多个连续的源ip) --dst-range IP1[-IP2](连续写多个连续的目的ip)

    iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.10 -d 192.168.10.1-10 -p tcp --dport 80 -j ACCEPT
    
    • 1

    3、state 状态:用与参考连接的状态进行数据过滤

    -m state --state <状态> 决定什么样状态接收,什么样状态拒绝,比如有些常用服务,ssh,ftp等,根据端口放行比较麻烦,使用-m state --state模块就简单很多,state状态:

    NEW状态:针对某个服务的首次访问,已经或将启动新的连接
    ESTABLISHED状态:已建立的连接,1、某服务的后续所有访问状态;2、表示服务器的响应数据;这样就不用每条都写OUTPUT的规则了,有一条ESTABLISHED就能全部能出去(响应)OUTPUT
    RELATED状态:相关联的连接,正在启动的新连接,给ftp用的。比如ftp服务器,只有命令连接完成,才能进行建立数据连接
    INVALID状态:无效的连接,非法或无法识别的

    iptables -I OUTPUT -s 192.168.10.1 -m state --state ESTABLISHED -j ACCEPT
    iptables -I INPUT -d 192.168.10.3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT  #保证首次访问和后续的所有访问都可以正常
    iptables -I INPUT -d 192.168.10.3 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    
    • 1
    • 2
    • 3

    7)最佳实践

    注意:

    1.修改之前先导出备份一份
    2.修改的时候小心别把自己关在外面
    3.可以现在定时任务里添加一条定时清空的规则,等测试没问题再取消定时任务
    4、注意iptables -F不会对默认规则生效,当默认规则设置了拒绝所有,又执行了清除规则的语句-F
    那就意味着,所有的请求全部都拒绝了,务必小心;可在测试规则之前,先写个定时任务,每隔5分钟重启一次iptables

    #设置默认的 chain 策略
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    
    iptables -I INPUT -p icmp -j REJECT  //禁ping
    iptables -A FORWARD -p ! icmp -j ACCEPT //转发除ICMP协议以外的所有数据包
    iptables -A FORWARD -s 192.168.1.11 -j REJECT  
    iptables -A FORWARD -s 192.168.2.0/24 -j ACCEPT  //拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.2.0/24网段的数据
    iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP  
    iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP  //丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
    iptables -I INPUT -s 10.20.30.0/24 -j DROP
    iptables -I FORWARD -s 10.20.30.0/24 -j DROP  //封堵网段(192.168.1.0/24)
    at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1  //两小时后解封
    iptables -A INPUT -p tcp --dport 22 -s 179.1.0/16 -j ACCEPT  //只允许管理员从179.1.0.0/16使用SSH远程登录防火墙主机
    iptables -A INPUT -p tcp --dport 22 -j DROP
    iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT  //允许本机开放从TCP端口20-1024提供的应用服务,分别加INPUT和OUTPUT2条
    iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
    iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT  //允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
    iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
    iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP  //禁止外部主机ping本网
    iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
    iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
    
    iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP //使用“-m mac –mac-source”来表示数据包的源MAC地址
    iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT  //开放本机多个端口,用“-m multiport –dport”来指定目的端口及范围
    iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP //禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包
    iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP  //禁止转发与正常TCP连接无关的非syn请求数据包,“-m state”表示数据包的连接状态,“NEW”表示与任何连接无关的,后续新的
    iptables -A INPUT -p tcp -m state --state NEW -j DROP
    iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT  //拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包,“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等
    iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT  //非连续多端口
    iptables -I INPUT -d 192.168.2.100 -p tcp -m multiport --dport  22,80 -j ACCEPT
    
    iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
    iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT  //放行外部主机发往本机的应答数据包
    iptables -P INPUT DROP
    iptables -A INPUT -s$BLOCK_THIS_IP-j DROP  //阻止某个特定的 IP 地址,配置文件里写BLOCK_THIS_IP
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    【Android】点击按钮播放音乐,再次点击停止播放
    zynqmp 设备树中断号描述在芯片中的对应
    【读书笔记】信息架构:超越Web设计-第一章
    【NLP】预训练模型——GPT1
    CentOS-7-x86_64经典版本的含义
    8个关于 Promise.then 和 Promise.catch 的面试题,一定要掌握
    UML精简概述
    【狂神说Java】redis入门
    windows10安装其他版本cuda环境
    centos系统下RabbitMQ安装教程
  • 原文地址:https://blog.csdn.net/ximenjianxue/article/details/127818519