作者:禅与计算机程序设计艺术
1.简介
安全一直是网络安全领域里非常重要的一个主题。随着互联网的普及和信息化程度的提升,越来越多的人倾向于把自己的隐私放在首位。无论是个人还是企业,都在忙于保障自己的网络、系统和数据不被泄露、篡改等安全风险。但是,作为一个网络安全从业者,除了保证自身业务运行正常外,更需要关注一些网络安全的方面,包括网络攻击、病毒侵入、网络钓鱼、网站钓鱼、社会工程攻击等。因此,掌握网络安全防护的技术知识对于一名合格的网络安全从业者至关重要。
网络安全防护可以说是一个综合性的课题。从网络硬件设备的安装、配置、维护到应用层面的访问控制、流量控制、日志审计、安全运维、安全响应等等,涉及到了众多的安全技术、工具和流程,是一个复杂而庞大的系统。目前国内关于网络安全防护的技术总结及分享文章较少。因此,本系列文章旨在整理和总结网络安全防护相关的技术和方法论,帮助读者快速了解网络安全防护的技术要点和架构,并运用这些知识解决实际问题,提高工作效率和质量。
本文将以安全从业者的视角,分享一些网络安全防护的关键技术和原理。首先,作者会从网络拓扑结构、传输协议、攻击载荷和安全检测四个方面对网络攻击进行介绍。接下来,介绍了基于Web应用的跨站脚本攻击(XSS)、SQL注入攻击、命令执行漏洞攻击、DoS攻击、CSRF攻击、Web缓存投毒等常见的网络攻击类型和应对策略。最后,作者详细阐述了Web应用防火墙(WAF)、反垃圾邮件服务、DDOS防护等技术和工具,并分析它们的优缺点以及如何利用它们实现网络安全防护。
2.网络拓扑结构
网络安全中最基础的问题之一就是网络拓扑结构。网络拓扑结构简单来说就是指连接在一起的一组路由器、交换机和其它网络设备。它决定了数据包在整个网络中的传输路径。网络拓扑结构的设计对网络安全的影响尤其大。比如,如果某个路由器配置错误或遭受攻击,那么它之后的所有路由器都可能成为攻击的目标。同样,如果某个网络设备允许未经授权的数据流经,那么这个设备也可能成为攻击的对象。为了提高网络的安全性,就必须充分地了解网络拓扑结构,并且制定相应的网络安全策略。下面通过几个典型场景,介绍网络拓扑结构的设计要素。
拓扑一览表
网络拓扑结构一般可以分成如下几种类型:星形、环形、总线型、混合型。如下图所示,图中显示了四种典型的网络拓扑结构:星形、环形、总线型、混合型。
星形拓扑结构
星形拓扑结构是最简单的一种拓扑结构。它由一个中心节点(称作中心局域网)和外围的分布式节点构成。中心局域网主要负责数据的传输和处理,外围的分布式节点则提供计算能力和存储空间。这种结构的特点是中心节点承担了绝大部分的通信功能,而外围的节点之间仅相互传递数据包。如下图所示:
由于中心节点的作用,星形结构容易出现单点故障,从而导致整个网络瘫痪。如果中心节点损坏或受到攻击,就会造成大面积的数据丢失,无法完成任务。因此,这种拓扑结构通常只适用于小型的本地网络,而非规模化的网络环境。
环形拓扑结构
环形拓扑结构又称环状结构。这种结构只有一个中心节点,所有连接到这个节点的路由器直接相连,形成一个环。如下图所示:
这种结构能够有效地防止单点故障,但也会带来另一个问题——性能瓶颈。当一个数据包到达某个环上的一台路由器时,该数据包将沿着环一直传输,直到它到达目的地。这意味着如果攻击者劫持了一个环上的数据包,他就可以截获并重放它,直到达到中心节点。因此,环形结构适用于中等规模的局域网,不能突破瓶颈。
总线型拓扑结构
总线型拓扑结构是指采用多条物理链路互联的方式构造网络拓扑。如下图所示:
这种结构的特点是各个节点之间通过不同的链路相连,数据包可以在任何两个节点间流动。总线型拓扑结构比环形结构更加稳健,因为一条链路出现故障时不会影响整个网络。不过,它也存在一些问题。例如,两端设备如果存在延迟,那么可能会导致网络拥塞甚至丢包。另外,当网络规模过大时,管理和维护成本也随之增长。总线型拓ож结构只能应用于小型的区域网络。
混合型拓扑结构
混合型拓扑结构既有星形结构的中心化特性,又有环形结构的无中心特性。这两种特征共同构成了一个混合型的网络拓扑。如下图所示:
这种结构兼顾了环形结构和星形结构的优点。如果某个环出现故障,那么通过其他连接着环的节点可以进行通信;中心节点也可以提供关键的通信服务。这种混合型拓扑结构可以有效地减轻网络整体的风险。但是,缺点也很明显。由于存在多个中心节点,因此管理和维护起来比较麻烦,且存在性能瓶颈。
拓扑配置方法
网络拓扑结构的选择会直接影响到网络安全的水平。下面介绍几种拓扑配置的方法,供大家参考。
全互连路由器模型
全互连路由器模型是目前应用最广泛的网络拓扑结构。它将每个局域网的所有路由器连接在一起,形成一个整体。这种模型的优点是逻辑上比较简单,部署方便,适合于小型网络。如下图所示:
这种结构的缺点是容易出现瓶颈,即网络容量的限制。如果某台路由器的处理能力超过了其他路由器的处理能力,那么它的流量就会被阻塞。所以,如果需要处理更大量的流量,那么就需要增加更多的路由器。全互连路由器模型适合于中等规模的局域网。
一主多从路由器模型
一主多从路由器模型是另一种拓扑结构。它将中心路由器和外围的分布式节点分开,分别作为主路由器和从路由器。主路由器负责处理所有用户请求,将它们转发给从路由器。从路由器主要用来承担计算和存储功能,向主路由器转发用户请求,然后再返回响应。如下图所示:
这种模型的优点是降低了中心节点的压力,同时也降低了网络拥堵的风险。但是,缺点也很明显,即对主路由器的需求比较大,它需要承担大量的流量,从而导致网络负载不均衡。而且,由于存在多个路由器,因此网络结构比较复杂。因此,一主多从路由器模型只适合于大型网络。
树型拓扑结构
树型拓扑结构是指根据业务逻辑将不同子网划分成不同的子树,再将各子树连接起来组成一个整体。如下图所示:
这种拓扑结构能够最大限度地减少网络风险,并且还具有高度的可伸缩性。可以根据业务特点配置路由策略,使得各个子树之间互不干扰。但是,它也存在一些缺陷。例如,子树间需要通过中央路由器进行通信,这可能导致网络负载不均衡。另外,如果某个子树出现故障,则其他子树也会受到影响。
传输协议
网络传输协议是指计算机之间如何通信,以及采用何种协议。常用的协议有TCP/IP协议、OSI协议、VLAN协议、BGP协议等。下面介绍一下TCP/IP协议。
TCP/IP协议
TCP/IP协议是传输控制协议/互联网协议簇的简称。它是Internet上使用最广泛的协议。它分成五层,每一层都有不同的功能。第一层负责网络层,第二层负责互联层,第三层负责传输层,第四层负责应用层,第五层负责表示层。如下图所示:
数据报协议
数据报协议(Datagram Protocol)是一种无连接的协议,发送方无需事先建立连接,直接就可以将数据报发送出去。接收方收到数据报后立即回复确认信息,没有建立连接过程。如今互联网的应用基本都采用的是面向无连接的协议,如UDP协议。
流式协议
流式协议(Stream Protocol)是一种面向连接的协议,在发送方和接收方之间必须建立连接,才能通信。在连接建立之后,就可以按序收发数据。流式协议可以实现点对点的通信,适用于视频、音频、文件传输等实时的应用。
TCP协议
TCP协议(Transmission Control Protocol)是一种可靠、面向连接的传输层协议。它的工作模式是面向字节流,也就是说,一次发送一个数据单位。TCP协议提供可靠的服务。
UDP协议
UDP协议(User Datagram Protocol)是一种不可靠的传输层协议,它的工作模式是面向数据报,也就是说,一次发送多个数据单元。它提供尽最大努力交付的数据grams,但不保证可靠交付。UDP协议常用于数据广播、实时应用和聊天室等。
3.网络攻击类型和原理
网络攻击类型主要分为以下四种:
- 攻击载荷(Attack Payloads):针对特定应用或协议的恶意代码和数据包,这些代码和数据包会嵌入到正常的业务数据包中发送,以达到攻击目的。
- 身份验证绕过(Authentication Bypass):攻击者通过非法手段获取登录凭据,从而绕过身份认证系统。
- 服务拒绝(Denial of Service):利用过多的资源消耗、内存占用等因素拒绝正常用户的访问或服务。
- 恶意代理(Malware Proxies):利用中间人攻击方式,将恶意代码安装到客户端系统中,以获得超级管理员权限。
下面介绍一下常见的网络攻击类型和原理。
XSS攻击
XSS(Cross Site Scripting)攻击是一种跨站 scripting 的攻击方式。XSS 攻击是指攻击者在网页上插入恶意 JavaScript 脚本,当其他用户浏览网页时,攻击者的 malicious script 会被植入到网页上,当其他用户访问页面时,他们的浏览器会执行 malicious script,从而盗取用户信息或者执行一些恶意操作。XSS 攻击能够获取用户的敏感信息,进一步威胁他人的个人信息安全。下面介绍一下 XSS 的攻击原理和防范措施。
攻击原理
XSS 攻击的攻击原理很简单,就是通过恶意代码将用户输入的信息 (Cookie、HTTP 请求头等) 传送到其他用户的浏览器上。如下图所示:
假设攻击者欺骗了用户点击链接,链接指向了一个恶意网站 http://www.victim.com 。这个网站提供了包含恶意脚本的网页,当用户打开此链接时,浏览器会自动加载恶意脚本,脚本的行为类似于窃取用户 Cookie 或表单数据,并发送到攻击者的服务器上。如下图所示:
XSS 攻击的预防措施主要有三个方面:
- 在输出 HTML 中编码用户输入的内容,避免代码注入;
- 使用 HttpOnly 属性设置 Cookie,禁止前端 JavaScript 操作 Cookie;
- 对用户提交的表单数据进行校验,过滤危险字符;
防范措施
防范 XSS 攻击的关键是识别、过滤、清除、隔离。下面列举几个常用的 XSS 攻击防范策略:
使用 HttpOnly 属性设置 Cookie
HttpOnly 属性是 HTTP/1.1 规范引入的属性,目的是为了防止恶意 JavaScript 代码窃取用户 Cookie,该属性只允许服务器访问 Cookie,禁止客户端 JavaScript 访问。在设置 Cookie 时,应该在 Set-Cookie 中添加 HttpOnly 属性,以便确保 Cookie 只能通过服务器端脚本访问。
添加验证码
通过验证码机制验证用户的输入是否合法,过滤掉恶意代码的注入,从而抵御 XSS 攻击。验证码一般是通过数字、字母、中文等方式产生的,看起来十分难以破译。验证码会严格限制字符集和长度,也能有效防止脚本冒充用户。
使用 Content Security Policy (CSP)
CSP 是一种网络安全策略,通过定义白名单来指定哪些外部资源可以加载、执行,可以有效防止 XSS 攻击。可以通过设置 CSP 来禁止那些没经过审核的代码运行。
SQL注入攻击
SQL 注入攻击,也称为 SQL Injection ,是一种恶意攻击方式,通过插入恶意 SQL 指令或者 SQL 命令参数,进一步侵犯数据库的完整性。其利用了 SQL 语言结构的缺陷,通过“植入”恶意指令的方式,绕过数据库的输入验证,最终导致恶意 SQL 指令被执行,篡改或查询数据库内的数据。SQL 注入攻击属于应用层的攻击范畴。
下面介绍一下 SQL 注入攻击的攻击原理和防范措施。
攻击原理
SQL 注入攻击的攻击原理是通过注入恶意 SQL 语句,以达到恶意攻击数据库的目的。如下图所示:
攻击者通过提交恶意的 SQL 查询语句到后台服务器,服务器执行 SQL 查询时,解析出恶意指令,然后执行该指令,导致任意的 SQL 操作。如下图所示:
SQL 注入攻击常见的利用手法有:
- 获取数据库内敏感信息
- 修改数据库数据
- 执行非法操作
- 绕过访问控制
- 利用弱口令导致获取账户权限
防范措施
SQL 注入攻击的防范措施主要有以下几点:
参数化查询
将动态生成的 SQL 语句的参数化,在 SQL 编译时绑定变量而不是在运行时绑定变量,这样可以有效防止 SQL 注入攻击。参数化查询可以有效减少 SQL 注入攻击的风险。例如:
SELECT * FROM users WHERE id =?
使用黑名单过滤 SQL 关键字
不要将特殊符号用作 SQL 关键字,例如:WHERE、ORDER BY、GROUP BY 等。
使用 Web 应用框架提供的安全措施
如 Java 的 JDBC 和 Hibernate,都提供了参数化查询和数据库连接池等安全措施,可以有效防止 SQL 注入攻击。
检查用户输入的有效性
为了防止 SQL 注入攻击,检查用户输入的数据是否有效,过滤掉 SQL 注入语句。
命令执行漏洞
命令执行漏洞,也称为 Command Execution Vulnerability,是指攻击者可以控制服务器执行恶意命令的漏洞。这类漏洞通常发生在应用程序允许用户输入执行命令的参数,当攻击者控制好输入参数后,可以输入执行恶意命令。
下面介绍一下命令执行漏洞的攻击原理和防范措施。
攻击原理
命令执行漏洞的攻击原理是攻击者能够控制服务器执行恶意命令的原因。如下图所示:
攻击者可以使用诸如 PHP shell、Perl shell、Python shell、Ruby shell、nc、wget、curl 等程序,在服务器端执行系统命令。攻击者可以控制恶意命令的参数和命令的输出结果,攻击成功后,他将获得服务器的控制权。
防范措施
命令执行漏洞的防范措施主要有以下几点:
对用户输入的参数进行合法性检查
对用户输入的参数进行合法性检查,过滤掉不合法的参数。例如,PHP 中的 $_GET/$_POST/$_REQUEST 等全局变量是用来获取 URL 传入参数的,在执行过程中容易受到攻击,需要注意。
使用白名单过滤执行命令
根据应用场景,设置白名单过滤执行命令的输入参数,对于非白名单内的输入参数,不允许执行系统命令。
使用进程隔离技术
当启动新的程序时,使用进程隔离技术,如 chroot() 函数、命名空间、cgroup 等,可以有效防止恶意程序在服务器端直接获取控制权。