OpenResty 网关测评(Nginx+Lua)
Categories:
4 分钟阅读
定位:OpenResty(Nginx + LuaJIT 可编程网关)三级等保现场测评取证命令单,按 GB/T 22239-2019 安全计算环境控制点分节组织核查命令、判定要点与取证要求。与 Nginx 中间件测评 分工互补:Nginx 篇承担反向代理/负载均衡通用控制点(server/路由/证书管理细节),本文聚焦 OpenResty 特有面——Lua 可编程能力带来的代码审计与出站 TLS 默认值风险。 适用范围:OpenResty 1.21.x / 1.25.x 线(lua-nginx-module v0.10.x);本文命令与指令默认值于 2026-09 对照 nginx 官方文档、lua-nginx-module 官方 README、resty-cli 官方 README 与 openresty.org 安装文档逐条核验(见参考依据节)。 配套文章:Nginx 中间件测评(必联:通用反向代理控制点)、HAProxy 负载均衡器测评、负载均衡设备测评、17、网络设备、安全设备、服务器、数据库和应用系统的加固方案、22、高风险判定指引与加固对照表。
使用说明:
- 本文所有命令均为只读取证命令:
nginx -t/-T仅做语法校验与配置转储(不加载新配置、不 reload),resty仅用于只读探测(如运行时版本打印),不修改配置、不重启服务;确需变更由被测单位运维方在授权下实施。- 每个控制点小节按「对应控制点 → 判定要点 → 取证要求 → 核查命令 → 备注 → 预期证据」编排;命令回显本身即证据,须连同命令行一起截图。
- OpenResty 无内置账户/管理界面体系,身份鉴别等控制点按「主机操作系统账户 + 后端应用」补偿判定;业务 Lua 代码中自建的管理接口按应用层核查。
- 命令不存在或路径不符时(发行版包/源码编译/容器部署差异),先以
nginx -V确认安装形态与 conf 路径,不得据命令缺失直接判不符合。- 示例输出中的地址、域名、路径均为演示值,现场须替换为真实取证结果并对涉及个人信息与内网管理地址的内容脱敏后再入报告。
不适用标识说明:
- 使用
【不适用】明确标记现场可判定为不适用的控制点。- 判定依据采用 GB/T 28448-2019"按测评对象实际功能、是否直接处理数据、是否具备该类安全机制判定"的原则;OpenResty 为网关/接入层组件,终端用户身份鉴别由后端应用承载。
一、基础信息与部署形态
对应控制点:非独立控制点(测评对象确定);组件冗余佐证 GB/T 22239-2019 8.1.1.1(上游负载均衡/双机联动)
判定要点:版本与编译参数记录完整、安装形态与 conf 路径清晰、加载的 Lua 代码清单可获取、与台账一致 → 符合;部分缺失 → 部分符合。
取证要求:
-V回显截图、配置转储、Lua 代码文件清单、部署拓扑。
A. 版本与编译参数
核查命令(只读):
nginx -v # nginx 内核版本(OpenResty 发行包内主程序)
nginx -V # 版本 + 编译器 + 全部 configure 参数(模块清单)
nginx -t # 配置语法校验:检查语法并尝试打开配置引用的文件(不加载运行)
- 备注:OpenResty 安装后主程序位于安装前缀下(官方默认
/usr/local/openresty/,nginx在/usr/local/openresty/nginx/sbin/,bin/下含resty等);源码编译或发行版包部署时以nginx -V输出的--prefix与--conf-path实际路径为准。-t/-V语义见 nginx 官方 Command-line parameters 页。LuaJIT 版本可只读打印(见下),确认与官方兼容性矩阵。 - 预期证据:版本与编译参数截图、与官方发布/漏洞公告对照记录。
示例输出(节选,演示值)
$ nginx -V(节选)
nginx version: openresty/1.21.4.3
built by gcc 9.x.x ...
configure arguments: --prefix=/usr/local/openresty/nginx
--with-http_ssl_module --with-http_stub_status_module
--add-module=.../ngx_lua-0.10.x ...
$ resty -e "print(jit.version)" # LuaJIT 运行时版本(只读打印)
LuaJIT 2.1-20240815
B. 配置全量转储与 Lua 清单
核查命令(只读):
nginx -T # -t 之外另将全部生效配置转储到 stdout(含 include 展开)
- 备注:
-T是后续各节取证的主要入口——从转储中提取listen/server_name/access_log/ssl_*/*_by_lua*各指令实际生效值;转储内容含证书路径与内网地址时脱敏。结合转储提取的*_by_lua_file路径,向运维索取对应 Lua 源文件清单(静态审查,不执行业务代码)。 - 预期证据:
nginx -T导出文件(脱敏)、Lua 文件清单、与版本库/变更记录比对说明。
二、身份鉴别(8.1.4.1)
对应控制点:GB/T 22239-2019 8.1.4.1 a)~c)
判定要点:【不适用】OpenResty 网关层无终端用户账户体系与本地管理账户——按边界说明转由后端应用(业务鉴别)与宿主操作系统(运维登录)承载;若 Lua 代码中实现了管理/调试接口,该接口的认证按应用层核查。
取证要求:边界说明记录;Lua 代码静态审查记录(是否暴露未认证管理路径)。
- 备注:Nginx 篇同口径。网关上常见风险是 Lua 自建的运维接口(如
/admin、/debug)未接认证,在访问控制一节联动核查。
三、访问控制(8.1.4.2)
对应控制点:GB/T 22239-2019 8.1.4.2(账户权限、访问策略、来源限制)
判定要点:对外监听端口/server_name 与业务清单一致、无目录列表暴露、管理/调试路径已限制来源或关闭 → 符合;存在目录列表或未限制的调试接口 → 部分符合/不符合。
取证要求:监听清单(
-T转储)、autoindex 配置核查、管理路径来源限制截图。
核查方法:
- 暴露面:从
nginx -T转提取全部listen/server_name,与被测业务与 DNS 解析对照,发现未登记的虚拟主机/端口记录为部分符合; - 目录列表:官方
autoindex指令默认 off——核查转储中是否显式autoindex on,开启且目录含敏感文件的判定为风险项; - Lua 自建管理路径:在转储与 Lua 源码中检索管理/调试类 location(如
/admin、/status、/dump),核查是否接入认证或 IP 来源限制。
示例输出(节选,演示值)
$ nginx -T | grep -nE "listen|server_name|autoindex|location"(节选)
listen 443 ssl;
server_name demo-app.example.com;
autoindex off; # ← 官方默认即 off;显式 on 须说明理由
location /admin { # ← Lua 自建管理路径,须核查认证与来源限制
content_by_lua_file /usr/local/openresty/lua/admin.lua;
}
四、安全审计(8.1.4.3)
对应控制点:GB/T 22239-2019 8.1.4.3 a)~d)(审计覆盖、日志保护、留存 ≥6 个月、集中外送)
判定要点:access_log 全站启用且格式含来源 IP/时间/URI/状态、日志外送日志平台、留存 ≥6 个月、日志文件权限受控 → 符合;默认格式无外送无留存 → 部分符合。
取证要求:access_log/error_log 配置截图、日志平台留存查询、文件权限实测。
核查方法:
- 官方默认
access_log logs/access.log combined;——从nginx -T转储核对每个 server 是否落日志、是否自定义log_format(escape=json便于平台解析); - 是否外送(syslog/文件采集 agent),日志平台查询留存 ≥6 个月;
- Lua 侧业务日志(
ngx.log输出到 error_log)是否含敏感字段——静态审查 Lua 源码中的日志语句。 - 预期证据:转储节选、日志平台截图、权限实测。
五、入侵防范(8.1.4.4 与 8.1.4.5)
对应控制点:GB/T 22239-2019 8.1.4.4(最小安装、关闭多余服务、漏洞修补)+ 8.1.4.5(恶意代码防范边界)
判定要点:版本无未修补高危漏洞、编译模块最小化、Lua 代码可审计(无
os.execute/io.popen类危险调用且文件来源受控)、lua_code_cache未设 off → 符合。取证要求:
-V模块清单、Lua 代码静态审查记录、漏洞修补记录。
A. 版本与模块最小化
nginx -V输出的 configure 参数即模块清单:与业务需要比对,无用的--with-*模块记录为最小化建议;版本对照官方公告核对已修补漏洞。
B. Lua 代码审计(OpenResty 特有面)
- 官方默认
lua_code_cache on——转储中若出现lua_code_cache off,官方文档明确"强烈不建议生产使用"(每请求独立 Lua VM,性能显著下降且属调试态配置),记录为风险项; - 静态审查
init_by_lua/init_by_lua_file(官方 context 为 http,配置加载期执行——常用来加载密钥/常量,是敏感信息集中点)与content_by_lua_file/access_by_lua_file等文件:检索os.execute、io.popen、dofile、loadstring等危险调用与硬编码口令/密钥(仅检索,不执行); - 8.1.4.5 恶意代码防范:网关层无内置防护,按宿主机统一防护口径判定(联动服务器侧命令单),本组件层标注说明。
六、数据完整性(8.1.4.7 与 8.1.1.2 a))
对应控制点:GB/T 22239-2019 8.1.4.7 + 8.1.1.2 a)(通信传输完整性)
判定要点:对外 HTTPS 已启用且协议套件符合(TLSv1.2+)、证书链与校验深度受控 → 符合;仍用 HTTP 承载敏感业务 → 不符合(结合后端加密说明)。
取证要求:ssl 配置节截图、协议实测(授权内)。
核查方法:
- 从
nginx -T转储核对ssl_protocols/ssl_ciphers/ssl_certificate显式值:官方文档注明 TLSv1.3 参数自 nginx 1.23.4 起默认启用、最新文档默认行为TLSv1.2 TLSv1.3;OpenResty 1.21.x 基于 nginx 1.21.4(早于该分界),现场必须以nginx -V确认内核版本并以转储实际配置判定; - 客户端证书:
ssl_verify_client官方默认 off;若启用双向认证,optional_no_ca(不校验 CA 即放行)按官方语法说明判为弱配置。 - 预期证据:转储节选、
nginx -V版本截图。
七、数据保密性(8.1.4.8 与 8.1.1.2 b))
对应控制点:GB/T 22239-2019 8.1.4.8 + 8.1.1.2 b)(通信传输保密性)
判定要点:对外 TLS 配置合规(会话票据、套件)、Lua 出站调用(cosocket)默认 TLS 不校验的风险已评估、密钥不以明文存于 Lua/conf → 符合。
取证要求:ssl 配置截图、Lua 源码审查记录。
以下三条为 OpenResty 特有、且官方默认即不安全的出站 TLS 面(均对照 lua-nginx-module 官方 README 核验):
lua_ssl_protocols官方默认值为TLSv1 TLSv1.1 TLSv1.2 TLSv1.3(v0.10.25 起;更早版本默认甚至含 SSLv3)——Lua cosocket 出站 HTTPS 未显式收窄时允许 TLSv1/1.1 降级;tcpsock:sslhandshake()的ssl_verify参数默认不启用——除非 Lua 代码显式传 true,出站 HTTPS 不校验对方证书(中间人风险);lua_ssl_trusted_certificate官方默认 none——即使启用校验也无受信 CA 可用。
现场存在对外部系统(支付、三方 API)的 Lua 出站调用时,应结合代码审查实测判定,问题突出按高风险倾向处理。
判定口径详见 联盟团标-网络安全等级保护测评高风险判定指引(2025版)(对应 2025 版判例 6.4.5.1)。
核查方法:
- 对外 TLS:官方
ssl_session_tickets默认 on——会话票据密钥不轮换时存在长期解密面,核查转储中是否显式管理(票据密钥轮换机制/关闭票据); - 出站 TLS:检索 Lua 源码中
sslhandshake调用是否传入ssl_verify = true、conf 中lua_ssl_trusted_certificate/lua_ssl_protocols/lua_ssl_verify_depth(官方默认深度 1)是否显式配置; - 密钥存储:
init_by_lua与lua_shared_dict(官方默认无)中的密钥/口令是否明文。
八、备份与恢复(8.1.4.9)
对应控制点:GB/T 22239-2019 8.1.4.9 a)~c)
判定要点:conf 与 Lua 源文件纳入版本库/备份、有恢复演练、证书文件有备份与到期提醒 → 符合。
取证要求:备份策略截图、版本库记录、演练报告。
- 备注:
nginx -T转储可与版本库/上一版备份做差异比对(只读),验证"配置可重建";证书文件路径从转储提取,核对到期时间与备份。
九、剩余信息保护(8.1.4.10)
对应控制点:GB/T 22239-2019 8.1.4.10 a)~b)
判定要点:废弃 server/Lua 路由及时下线、日志归档件敏感字段脱敏、Lua 共享字典中过期敏感数据有清理逻辑 → 符合。
取证要求:转储与业务清单比对、日志脱敏样例、Lua 缓存清理代码审查记录。
十、个人信息保护(8.1.4.11)
对应控制点:GB/T 22239-2019 8.1.4.11 a)~b);《网络安全法》第 21 条
判定要点:日志中的 IP/UA/查询串按规范最小化与脱敏、
X-Forwarded-For等透传头不泄露内网链路、Lua 业务日志不打印身份证号/手机号明文 → 符合。取证要求:log_format 定义截图、日志抽样脱敏样例、Lua 日志语句审查记录。
参考依据
| 类别 | 来源 |
|---|---|
| 等级保护基本要求 | GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=BAFB47E8874764186BDB7865E8344DAF |
| 等级保护测评要求 | GB/T 28448-2019《信息安全技术 网络安全等级保护测评要求》:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7E736CDF4502B6FF1258DD250AA3EC8C |
| 法律依据 | 《网络安全法》第 21 条(网络日志留存不少于六个月):https://www.cac.gov.cn/2016-11/07/c_1119867116_2.htm |
| 命令行参数 | nginx 官方 Command-line parameters(-v/-V、-t/-T、-s 信号语义):https://nginx.org/en/docs/switches.html |
| 指令默认值 | nginx 官方文档(ssl_protocols 默认 TLSv1.2 TLSv1.3、TLSv1.3 自 1.23.4 默认启用;autoindex 默认 off;ssl_session_tickets 默认 on;ssl_verify_client 默认 off;access_log 默认 logs/access.log combined):https://nginx.org/en/docs/http/ngx_http_ssl_module.html 等(2026-09 逐页核验) |
| Lua 指令默认值 | openresty/lua-nginx-module 官方 README(lua_code_cache 默认 on 且生产禁 off 原文、lua_ssl_protocols 默认 TLSv1~1.3 与 v0.10.25 变更记录、lua_ssl_trusted_certificate 默认 none、lua_ssl_verify_depth 默认 1、lua_shared_dict、init_by_lua context、tcpsock:sslhandshake 的 ssl_verify 参数语义):https://github.com/openresty/lua-nginx-module/blob/master/README.markdown(2026-09 逐节核验) |
| CLI 工具 | openresty/resty-cli 官方 README(resty 无头运行原理、resty -e 用法、resty -V):https://github.com/openresty/resty-cli |
| 安装路径 | OpenResty 官方 Installation 文档(默认前缀 /usr/local/openresty/、nginx 位于 /usr/local/openresty/nginx/sbin/):https://openresty.org/en/installation.html |
未收录与说明:
nginx -s reload/stop/quit、resty执行业务 Lua 脚本、Lua 代码在线调试——均为变更/执行类操作,测评现场不使用(resty仅限只读版本打印等探测);stub_status、ngx.status等运行时状态接口未在本次官方源核验范围内,不在本文收录;如现场部署状态页,按应用层接口核查认证与暴露面;- OpenResty 商业版(OpenResty Edge 等)管理面本文不覆盖,控制台口径另行取证。
关联文章
- 通用面互链:Nginx 中间件测评、HAProxy 负载均衡器测评、负载均衡设备测评;
- 加固侧:17、加固方案总指南、20、应用系统安全加固;
- 高风险口径:22、高风险判定指引与加固对照表。