01-基础设施审查.md 9.5 KB

第一阶段:基础设施审查报告

审查概述

项目 详情
审查日期 2026年5月19日
审查范围 Dockerfile、docker-compose、Nginx、PHP配置、定时任务、启动脚本
发现问题数 23个
高风险问题 6个
中风险问题 10个
低风险问题 7个

1. Dockerfile 审查

文件位置Dockerfile

🔴 高风险问题

1.1 PHP 版本已终止支持

FROM php:7.3-fpm-alpine
  • 问题:PHP 7.3 已于 2021年12月6日 EOL,不再接收安全更新
  • 风险:已知漏洞无法修复,存在被攻击风险
  • 建议:升级到 PHP 8.1 或 8.2

1.2 使用 root 用户运行服务

CMD ["/bin/sh", "/usr/local/bin/up.sh", "/app/www/new_sdk/crontab.sh"]
  • 问题:容器内所有服务以 root 身份运行
  • 风险:容器逃逸后直接获得 root 权限
  • 建议:创建专用用户运行应用

1.3 敏感文件可能被 COPY 到镜像

COPY . /app
  • 问题:会复制所有文件,包括 .env、密钥文件等
  • 风险:敏感信息泄露到镜像层
  • 建议:使用 .dockerignore 排除敏感文件

🟡 中风险问题

1.4 Composer 使用 snapshot 版本

&& php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --snapshot
  • 问题:使用 --snapshot 安装非稳定版本
  • 风险:可能引入未测试的代码
  • 建议:移除 --snapshot 参数

1.5 缺少多阶段构建

  • 问题:构建依赖和运行时依赖混在一起
  • 风险:镜像体积过大,攻击面大
  • 建议:使用多阶段构建分离构建和运行环境

2. docker-compose.yml 审查

文件位置docker-compose.yml

🔴 高风险问题

2.1 缺少资源限制

services:
    new_sdk:
      build: .
  • 问题:没有设置 CPU/内存限制
  • 风险:单个容器可能耗尽宿主机资源
  • 建议:添加 deploy.resources.limits

🟡 中风险问题

2.2 缺少健康检查

  • 问题:没有 healthcheck 配置
  • 风险:无法自动检测服务故障
  • 建议:添加健康检查配置

2.3 缺少重启策略

  • 问题:没有 restart 策略
  • 风险:服务崩溃后不会自动恢复
  • 建议:添加 restart: unless-stopped

2.4 非标准端口映射

ports:
  - "66:80"
  - "67:443"
  • 问题:使用非标准端口
  • 风险:可能被防火墙阻止,混淆攻击者(优点)
  • 建议:根据实际部署环境调整

3. Nginx 配置审查

文件位置nginx/nginx.conf, nginx/default.conf, nginx/https.conf, nginx/sdkapi.qmgames.cn.conf

🔴 高风险问题

3.1 client_max_body_size 过大

client_max_body_size 2048M;  # default.conf
client_max_body_size 2048M;  # sdkapi.qmgames.cn.conf
  • 问题:允许上传 2GB 文件
  • 风险:DoS 攻击、磁盘空间耗尽
  • 建议:根据业务需求设置合理值(如 50M)

3.2 缺少安全响应头

  • 问题:未配置以下安全头
    • X-Frame-Options - 防止点击劫持
    • X-Content-Type-Options - 防止 MIME 类型嗅探
    • X-XSS-Protection - XSS 过滤
    • Content-Security-Policy - 内容安全策略
    • Strict-Transport-Security - HSTS
  • 建议:添加所有安全响应头

3.3 SSL 配置不完整

ssl_certificate /app/key/sdkapi.qmgames.cn.pem;
ssl_certificate_key /app/key/sdkapi.qmgames.cn.key;
  • 问题:缺少以下配置:
    • ssl_protocols - 应只允许 TLSv1.2+
    • ssl_ciphers - 应使用强密码套件
    • ssl_session_timeout
    • ssl_stapling - OCSP 装订
  • 建议:完善 SSL 安全配置

🟡 中风险问题

3.4 缺少 Rate Limiting

  • 问题:没有配置请求频率限制
  • 风险:API 被暴力破解、DDoS
  • 建议:添加 limit_req_zonelimit_conn_zone

3.5 default.conf 暴露多个域名

server_name devsdkapi.7dgame.cn devsdkadmin.7dgame.cn ...;
  • 问题:开发域名暴露在生产配置中
  • 建议:分离开发和生产配置

4. PHP 配置审查

文件位置php-fpm/php-ini-overrides.ini

🟡 中风险问题

4.1 upload_max_filesize 过大

upload_max_filesize = 1024M
  • 问题:允许上传 1GB 文件
  • 风险:配合 Nginx 配置,可能导致资源耗尽
  • 建议:根据业务需求设置合理值

4.2 OPcache 被禁用

opcache.enable= 0
  • 问题:PHP OPcache 未启用
  • 风险:性能损失约 50-70%
  • 建议:生产环境应启用 OPcache

✅ 良好实践

expose_php = Off  # 不暴露 PHP 版本信息

5. 定时任务审查

文件位置crontabs/crontabfile.txt

🟡 中风险问题

5.1 pay_timeout 任务可能并发冲突

* * * * * bash /app/script/pay_timeout.sh
* * * * * sleep 30; bash /app/script/pay_timeout.sh
  • 问题:每分钟执行两次,如果任务执行超过30秒可能并发
  • 风险:重复处理订单
  • 现状:脚本中使用了 flock 锁,部分缓解了问题
  • 建议:确保所有脚本都有锁机制

5.2 daily.sh 是空脚本

#!/bin/sh
# cd /app/www/new_sdk/
# su www-data -s /usr/local/bin/php artisan command:jiubidetail >> /app/script/jiubidetail.log
# sh /app/www/push_websocketstart.sh >>
  • 问题:脚本内容被注释掉,没有实际功能
  • 建议:清理无用脚本或恢复功能

6. 启动脚本审查

文件位置php-fpm/up.sh

🟡 中风险问题

6.1 PHP-FPM 后台运行

nohup php-fpm > /var/log/php-fpm.log 2>&1 &
  • 问题:PHP-FPM 以后台进程运行
  • 风险:进程崩溃无法自动重启
  • 建议:使用 supervisord 管理进程

6.2 文件权限设置

chown www-data -R /app/www/new_sdk &
  • 问题:使用 & 后台执行 chown
  • 风险:可能在文件未完全设置好权限时就开始处理请求
  • 建议:移除 &,确保权限设置完成后再启动服务

7. 入口文件审查

文件位置www/new_sdk/public/index.php

🔴 高风险问题

7.1 CORS 配置过于宽松

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: *");
  • 问题:允许任意来源和任意方法访问
  • 风险:CSRF 攻击、数据泄露
  • 建议:限制为特定域名

7.2 Socket 超时禁用

ini_set('default_socket_timeout', -1);
  • 问题:禁用了 socket 超时
  • 风险:可能导致请求永久阻塞
  • 建议:设置合理的超时时间

8. 问题汇总

按风险等级分类

🔴 高风险(需立即修复)

序号 问题 位置
1 PHP 7.3 EOL Dockerfile:1
2 root 用户运行 Dockerfile:78
3 敏感文件 COPY Dockerfile:66
4 资源限制缺失 docker-compose.yml
5 安全响应头缺失 nginx/*.conf
6 CORS 过于宽松 public/index.php:14-18

🟡 中风险(建议尽快修复)

序号 问题 位置
1 Composer snapshot Dockerfile:55
2 client_max_body_size 过大 nginx/default.conf:6
3 SSL 配置不完整 nginx/https.conf
4 缺少 Rate Limiting nginx/*.conf
5 OPcache 禁用 php-ini-overrides.ini:12
6 upload_max_filesize 过大 php-ini-overrides.ini:1
7 PHP-FPM 后台运行 php-fpm/up.sh:3
8 chown 后台执行 php-fpm/up.sh:5
9 pay_timeout 并发风险 crontabs/crontabfile.txt:6-7
10 Socket 超时禁用 public/index.php:20

🟢 低风险(建议优化)

序号 问题 位置
1 缺少健康检查 docker-compose.yml
2 缺少重启策略 docker-compose.yml
3 非标准端口 docker-compose.yml:10-11
4 开发域名暴露 nginx/default.conf:4
5 daily.sh 空脚本 script/daily.sh
6 缺少多阶段构建 Dockerfile
7 缺少 .dockerignore 项目根目录

9. 修复优先级建议

第一优先级(安全相关)

  1. 限制 CORS 来源域名
  2. 添加 Nginx 安全响应头
  3. 完善 SSL 配置
  4. 创建 .dockerignore 排除敏感文件

第二优先级(稳定性相关)

  1. 添加 docker-compose 资源限制
  2. 添加健康检查和重启策略
  3. 修复 PHP-FPM 启动方式
  4. 启用 OPcache

第三优先级(长期规划)

  1. 升级 PHP 版本到 8.x
  2. 升级 ThinkPHP 框架版本
  3. 实施多阶段构建
  4. 添加 Rate Limiting

10. 参考配置

Nginx 安全头配置示例

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always;

SSL 安全配置示例

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;

.dockerignore 示例

.env
.env_*
.git
.gitignore
.idea
*.md
key/
logs/
runtime/
vendor/

审查报告生成时间:2026年5月19日