写点什么

Linux 系统安全(七):Nginx 安全

2019 年 8 月 23 日

Linux系统安全(七):Nginx 安全

Nginx 是 Web 服务器领域的后起之秀,以其现代软件架构设计所提供的高性能和灵活性而被越来越多的网站所采用,在 2018 年 2 月活跃网站中的使用比例已达到 21.23%(数据来源:Netcraft),是继 Apache 之后的第二大 Web 服务器软件。在该部分,我们重点关注 2 个方面的 Nginx 的安全设置:使用 HTTPS 加密和使用 NAXSI 加固。


使用 HTTPS 加密网站


从 CA 签发机构购买了 SSL 证书后,在 Nginx 上配置 HTTPS 的方法是在配置文件 nginx.conf 中,添加以下配置项:


ssl on;ssl_certificate /opt/cert/server.crt; #指定证书存储位置ssl_certificate_key /opt/cert/server.key; #指定私钥存储位置ssl_session_timeout 5m; #指定SSL会话超时时间ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL协议版本ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#指定SSL加密算法ssl_prefer_server_ciphers on; #指定优先采用服务器端加密算法
复制代码


在配置完成后,使用 nginx -t 检查配置项是否有误。如无报错,则可以通过重启 nginx 进程来使配置文件生效。


使用 NAXSI 加固 Web


NAXSI 是 Nginx 服务器上常见的 Web 应用防火墙。NAXSI 的含义是“Nginx Anti XSS & SQL Injection”(Nginx 防御跨站脚本和 SQL 注入),其官方网站是https://github.com/nbs-system/naxsi。从技术上来说,NAXSI 是 Nginx 的第三方模块,适用于很多类 UNIX 的操作系统平台上。


NAXSI 和 ModSecurity 相比,有如下的不同点:


  • NAXSI 可以通过学习模式建立白名单机制,从而使用默认拒绝的方式来最大化的保障 Web 安全。这通常适用于网站代码和功能不频繁变化的场景,否则极易产生误报。

  • 在黑名单模式下,NAXSI 规则更加简洁,它通过对 HTTP 请求体中出现的所有恶意字符设置分数并求和、达到一定阈值则拒绝请求的方式来实现安全防御;而在 ModSecurity 使用场景下,通常通过设置精细的正则表达式在一条规则中即判断是放行或者禁止。


NAXSI 的核心规则集下载地址是:https://github.com/nbs-system/naxsi/blob/master/naxsi_config/naxsi_core.rules。


我们通过以下规则来熟悉 NAXSI 的原理:


MainRule "str:\"" "msg:double quote" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:8,$XSS:8" id:1001; MainRule "str:0x" "msg:0x, possible hex encoding" "mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie" "s:$SQL:2" id:1002;MainRule "str:'" "msg:simple quote" "mz:ARGS|BODY|URL|$HEADERS_VAR:Cookie" "s:$SQL:4,$XSS:8" id:1013;
复制代码


其中:


  • id 为 1001 的规则表示,如果在请求体(BODY)、统一资源定位符(URL)、请求参数(ARGS)、请求头部(Cookie)任何地方出现了双引号("),那么就把该请求可能是 SQL 注入、跨站脚本攻击的判断分数分别设置为 8

  • id 为 1002 的规则表示,如果在请求体(BODY)、统一资源定位符(URL)、请求参数(ARGS)、请求头部(Cookie)任何地方出现了双引号("),那么就把该请求可能是 SQL 注入判断分数设置为 2

  • id 为 1013 的规则表示,如果在请求体(BODY)、统一资源定位符(URL)、请求参数(ARGS)、请求头部(Cookie)任何地方出现了单引号(’),那么就把该请求可能是 SQL 注入的判断分数设置为 4 并且把跨站脚本攻击的判断分数设置为 8


通过在 Nginx 配置文件中加入以下示例片段即可根据每条规则得出来的分数累加值加以控制,也就是放行或者禁止:


CheckRule "$SQL >= 8" BLOCK;CheckRule "$RFI >= 8" BLOCK;CheckRule "$TRAVERSAL >= 4" BLOCK;CheckRule "$EVADE >= 4" BLOCK;CheckRule "$XSS >= 8" BLOCK;
复制代码


关注 Nginx 漏洞情报


Nginx 漏洞信息会由官方发布,笔者建议 Nginx 管理员重点下相关漏洞。在出现高危漏洞时,及时进行版本升级。


本文内容来自作者图书作品《Linux 系统安全:纵深防御、安全扫描与入侵检测》,点击购买


2019 年 8 月 23 日 09:507513

评论

发布
暂无评论
发现更多内容

架构师训练营第七周作业

王铭铭

解决 Harbor 启动失败故障

FeiLong

Docker Harbor Docker-compose

【数据结构】Java 常用集合类 ArrayDeque

Alex🐒

Java 源码 数据结构

一张PDF了解JDK11 GC调优秘籍-附PDF下载

程序那些事

Java jdk GC 秘籍 JDK11

GoF设计模式 | 工厂方法模式

Peision

Java 23种设计模式

百万并发「零拷贝」技术系列之初探门径

码农神说

Java 架构 零拷贝

Java并行程序基础

独钓寒江雪

Java 高并发 并行

性能优化-架构师体现技术全面性的时刻

LEAF

GoF设计模式 | 单例模式

Peision

Java 后端 23种设计模式

Java的异常处理

Bruce Duan

java异常处理

玩转混合加密 | 精美配图

阿宝哥

安全 加密解密 数据加密

Spring Security入门到实践(一)HTTP Basic在Spring Security中的应用原理浅析

独钓寒江雪

源码分析 spring security

手撕设计模式

Peision

Java 后端 设计模式 23种设计模式

前后端统一结果集封装

Peision

Java json 前后端分离 springboot

为什么 Flink 无法实时写入 MySQL?

Apache Flink

flink

记一次bem命名规范使用优化方案

前端有的玩

Vue npm React bem

JVM 运行时数据区

Alex🐒

JVM 深入理解JVM

写在《SRE生存指南》出版之际

Winfield

DevOps SRE

蚂蚁金服上市了,我不想努力了

YourBatman

IPO 财务自由 蚂蚁金服 财富自由

创业使人成长系列 (5)-申请国家高新企业

石云升

高新企业

前后端分离跨域问题解决方案

Peision

Java 前后端分离 springboot

【译文】创建 Kubernetes manifest 的初学者指南

FeiLong

Kubernetes

并发必备基础知识汇总

独钓寒江雪

并发 基础

vcenter 5.5故障处理

小小文

vcenter

【数据结构】Java 常用集合类 PriorityQueue

Alex🐒

Java 源码 数据结构

专访英特尔唐炯:对旗下产品性能及未来路线图充满信心

飞天鱼2017

职业吐槽与反思(一)

石君

职场 吐槽

架构师训练营第七课总结

曾祥斌

elasticsearch-restful-api笔记

wkq2786130

elasticsearch

jqGrid表格封装和使用方法

Seven_xw1213

Java 前端 封装 jqgrid

C++ 线程安全的单例模式总结

小林coding

c++ 设计模式 单例模式 线程安全

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

Linux系统安全(七):Nginx 安全-InfoQ