Black-Cockpit/ansible-secure-nginx

GitHub: Black-Cockpit/ansible-secure-nginx

一个 Ansible 集合,通过两个角色自动化安装 NGINX 并从源码编译部署 ModSecurity WAF 模块,解决手动配置安全 Web 服务器的繁琐问题。

Stars: 1 | Forks: 1

# hasnmehti91.secure_nginx 此 Ansible collection 用于安装 NGINX 并针对其构建 [ModSecurity](https://github.com/owasp-modsecurity/ModSecurity) Web 应用防火墙。它包含两个角色——一个用于在主机上部署 NGINX,另一个用于从源码编译 `libmodsecurity` 和 NGINX 连接器,安装生成的动态模块,并在 `/etc/nginx/waf_rules` 下 编写规则配置。 这两个角色需按顺序执行。`mod_security` 会针对主机上 现有的 NGINX 编译其连接器,若不存在则会拒绝运行,因此 `install` 是使其可用的前提。 ## 角色 - **install** — 安装 NGINX,然后启用并启动服务。 请参阅 [install 角色文档](roles/install/README.md)。 - **mod_security** — 构建并安装适用于 NGINX 的 ModSecurity 模块及其规则配置。请参阅 [mod_security 角色文档](roles/mod_security/README.md)。 ## 覆盖范围 这两个角色支持相同的发行版集合,这些发行版在每个角色的 `supported_distribution` 变量中定义,并由首个任务的断言强制执行。不属于该集合的发行版会导致触发它的主机运行失败,而不会报告 `ok` 且什么都不做。 | 发行版 | 版本 | NGINX 软件包来源 | CI 测试 | | --- | --- | --- | --- | | AlmaLinux | 8, 9, 10 | nginx.org stable | 10 | | CentOS | 8, 9, 10 | nginx.org stable | — | | Debian | 11, 12 | 发行版归档 | — | | Oracle Linux | 8, 9, 10 | nginx.org stable | — | | Red Hat Enterprise Linux | 8, 9, 10 | nginx.org stable | — | | Rocky Linux | 8, 9, 10 | nginx.org stable | — | | Ubuntu | 22.04, 24.04 | 发行版归档 | 24.04 | **经过 CI 测试的平台仅限 Ubuntu 24.04 和 AlmaLinux 10。** 列出其他所有行是因为它们与这两个平台之一共享相同的包管理器、 仓库布局和依赖名称——而并非因为它们已被实际测试过。请将未测试的行视为基于构建逻辑受支持,在依赖它们之前请自行进行验证。 Enterprise Linux 从官方的 nginx.org stable 仓库获取 NGINX,而不是从 AppStream 获取,因为 `mod_security` 需要与运行版本匹配的源码 tarball,而供应商构建版本包含上游从未发布过的版本字符串。Debian 系则继续 安装发行版软件包。有关此差异在各个路径上产生的代价,请参阅 [install 角色](roles/install/README.md)。 ## 要求 - 控制节点上需安装 Python 3 和 Ansible。`meta/runtime.yml` 声明了 `ansible-core` `2.15.8` 或更高版本;代码库自身的工具在 `requirements.txt` 中指定了 `ansible>=10.0.0,<14.0.0`。 - 目标节点需具备 `become` 权限,且每个节点都运行上述平台 之一。 - 每个目标节点都需要对外的 HTTPS 访问权限,以连接到 `github.com`(用于获取 ModSecurity 发布版 tarball 和连接器仓库)和 `nginx.org`(用于在每个平台上获取 NGINX 源码 tarball,以及在 Enterprise Linux 上获取软件包仓库)。 - 每个目标节点在 `build_dir` 下需要大约 2 GB 的可用空间以及几分钟的 CPU 时间。这两个源码构建过程在运行时间中占据了绝大部分。 - `build_dir` 既不能被挂载为 `noexec`,也不能被定期清理。默认路径是 `/tmp`,而在此处这两种策略都很常见,且都会导致构建中断。 ## 安装 ``` ansible-galaxy collection install hasnimehdi91.secure_nginx ``` ## 用法 单独安装 NGINX: ``` - name: Install nginx hosts: all become: true gather_facts: true any_errors_fatal: true roles: - name: hasnimehdi91.secure_nginx.install ``` 安装 NGINX 并针对其构建防火墙。建议从 `detection_only: true` 开始,这会记录规则匹配情况并照常处理请求,审查审计日志后,再将其切换为 `false`: ``` - name: Install nginx and ModSecurity hosts: all become: true gather_facts: true any_errors_fatal: true roles: - name: hasnimehdi91.secure_nginx.install - name: hasnimehdi91.secure_nginx.mod_security vars: detection_only: true ``` `detection_only`、`module_version` 和 `build_dir` 在角色的 `vars/main.yml` 中声明,其优先级高于清单(inventory)。可以像上文那样将它们作为角色参数设置,或在命令行中设置——在 `group_vars` 或 `host_vars` 中使用相同的变量名会被静默忽略: ``` ansible-playbook -i inventory playbook.yml -e detection_only=true ``` ## 结果 在两个角色都运行完毕后,主机上将安装、启用并启动 NGINX;在 NGINX 编译时读取的模块目录中会包含 `ngx_http_modsecurity_module.so`;从 `/etc/nginx/nginx.conf` 中会包含 `load_module` 指令;并且在 `/etc/nginx/waf_rules` 下会有规则配置。完整的路径列表请参见 [mod_security 角色文档](roles/mod_security/README.md#results)。 该 collection 没有完成以下两件事,你需要自己处理: - **没有任何操作会开启防火墙。** 没有将 `modsecurity on;` 或 `modsecurity_rules_file` 指令写入任何 `http`、 `server` 或 `location` 块中,因此该模块虽已加载但处于未激活状态,并且不会检查任何请求。需要添加的代码行请参见 [开启 WAF](roles/mod_security/README.md#switching-the-waf-on)。 - **没有任何操作会重载 NGINX。** `mod_security` 定义了重启和 配置测试的 handler,但从未触发它们,因此正在运行的进程会继续在没有该模块的情况下提供服务,直到手动重启或被角色运行之后的其他操作重启。 该 collection 也没有安装任何攻击规则集。部署在 `/etc/nginx/waf_rules/modsecurity.conf` 中的是上游推荐的 引擎配置,而不是 [OWASP Core Rule Set](https://github.com/coreruleset/coreruleset); 在此 collection 的基础上添加 CRS 是一个独立的步骤。 ## 测试 该 collection 附带了一个一次性的 VM 集成测试工具,它可以启动一台机器,针对其运行两个角色并断言结果。这里没有单元测试:该 collection 没有提供 Python 插件,因此没有可供单元测试执行的内容。请参阅 [测试文档](tests/README.md)。 该矩阵仅涵盖 Ubuntu 24.04 和 AlmaLinux 10,不包含其他系统,其断言属于结构性的——即验证模块是否已构建、安装和加载,规则文件是否位于磁盘上,以及 `nginx -t` 是否仍然 通过。没有任何测试会断言防火墙是否拦截请求,因为在角色运行完毕后,它并不会执行拦截操作。 ## 链接 - 代码库: - 问题: - ModSecurity: - ModSecurity NGINX 连接器: - OWASP Core Rule Set: - NGINX Linux 软件包:
标签:Ansible, AppImage, ModSecurity, Nginx, Web应用防火墙, 系统加固, 系统提示词, 自动化配置, 负责任AI, 运维, 逆向工具