签入版本

This commit is contained in:
2026-10-08 17:50:29 +08:00
parent 809750b47e
commit e213a9b31d
444 changed files with 39366 additions and 37533 deletions
@@ -8,10 +8,10 @@
| 项目 | 操作 | 检查命令 |
|------|------|----------|
| JWT 密钥 | `.env` 中 `JWT.SECRET` 修改为强随机字符串 | `grep JWT.SECRET .env` |
| 调试模式 | `.env` 中 `APP_DEBUG = false` | `grep APP_DEBUG .env` |
| 错误信息 | `.env` 中 `SHOW_ERROR_MSG = false` | `grep SHOW_ERROR_MSG .env` |
| CORS | `.env` 中 `CORS.ALLOW_ORIGIN` 限制为实际域名 | `grep CORS .env` |
| JWT 密钥 | `.env` 中 `JWT_SECRET` 修改为强随机字符串(≥32 字符,缺失/过短时服务拒绝签发令牌,fail-close) | `grep JWT_SECRET .env` |
| 调试模式 | `.env` 中 `APP_DEBUG=false` | `grep APP_DEBUG .env` |
| 运行环境 | `.env` 中 `APP_ENV=production` | `grep APP_ENV .env` |
| CORS | `.env` 中 `CORS_ALLOW_ORIGIN` 限制为实际域名 | `grep CORS_ALLOW_ORIGIN .env` |
| 数据库密码 | 修改默认 root 密码 | `mysql -u root -p` |
| Redis 密码 | 设置 requirepass | `redis-cli CONFIG GET requirepass` |
| HTTPS | 启用 SSL 证书 | `curl -I https://your-domain.com` |
@@ -76,13 +76,13 @@ server_tokens off;
; =============================================================================
; php.ini 生产环境安全配置
; =============================================================================
; 配置路径:/etc/php/8.2/fpm/php.ini
; 生效命令:sudo systemctl restart php8.2-fpm
; 配置路径:/etc/php/8.3/fpm/php.ini
; 生效命令:sudo systemctl restart php8.3-fpm
; =============================================================================
expose_php = Off ; 隐藏 PHP 版本号(防止针对性攻击)
display_errors = Off ; 不向浏览器显示错误(防止 SQL/路径泄露)
log_errors = On ; 记录错误到日志文件(便于排查)
log_errors = On ; 记录错误到日志文件(Laravel 日志在 storage/logs/)
allow_url_fopen = Off ; 禁止 fopen 打开远程 URL(防 SSRF)
disable_functions = exec,passthru,shell_exec,system,proc_open ; 禁用危险系统函数
```
@@ -97,18 +97,19 @@ chmod -R 755 /www/api/ # 目录 755,文件自动
chown -R www-data:www-data /www/api/ # owner 设为 Web 服务器用户
# -----------------------------------------------------------------------------
# 运行时目录(必须可写 — ThinkPHP 缓存、日志、编译模板)
# 运行时目录(必须可写 — Laravel 缓存、日志、编译视图)
# -----------------------------------------------------------------------------
chmod -R 777 /www/api/runtime/ # 777 确保 PHP-FPM 可写入
chmod -R 777 /www/api/storage/ # 777 确保 PHP-FPM 可写入
chmod -R 777 /www/api/bootstrap/cache/ # 配置/路由缓存写入位置
# -----------------------------------------------------------------------------
# 上传目录(必须可写 — 用户上传文件存储位置)
# -----------------------------------------------------------------------------
chmod -R 755 /opt/data/uploads/ # 目录可写
chown -R www-data:www-data /opt/data/uploads/ # owner 设为 Web 服务器用户
chmod -R 755 /www/api/public/uploads/ # 目录可写
chown -R www-data:www-data /www/api/public/uploads/ # owner 设为 Web 服务器用户
# -----------------------------------------------------------------------------
# .env 文件(仅 owner 可读 — 包含数据库密码等敏感信息)
# .env 文件(仅 owner 可读 — 包含数据库密码、JWT 密钥等敏感信息)
# -----------------------------------------------------------------------------
# 600 = owner 可读写,group/others 无权限
chmod 600 /www/api/.env
@@ -132,8 +133,8 @@ ALTER USER 'root'@'localhost' IDENTIFIED BY 'strong_password_here';
CREATE USER 'rxthinkcmf_app'@'localhost' IDENTIFIED BY 'app_password';
-- 授权应用用户只能访问项目数据库(最小权限原则)
-- rxthinkcmf.thinkphp6.elevue.* → 该项目数据库的所有表
GRANT ALL PRIVILEGES ON `rxthinkcmf.thinkphp6.elevue`.* TO 'rxthinkcmf_app'@'localhost';
-- rxthinkcmf.laravel13.elevue.* → 该项目数据库的所有表
GRANT ALL PRIVILEGES ON `rxthinkcmf.laravel13.elevue`.* TO 'rxthinkcmf_app'@'localhost';
FLUSH PRIVILEGES; -- 刷新权限使配置生效
-- 禁止远程 root 登录(只允许本地连接)
@@ -163,6 +164,10 @@ rename-command FLUSHDB "" ; 禁用 FLUSHDB(清空当前数
rename-command CONFIG "" ; 禁用 CONFIG(防止运行时修改配置)
```
:::warning Redis 承载关键状态
本项目的会话、缓存、队列和 JWT 令牌状态均存储在 Redis 中,Redis 泄露等同于会话泄露。除密码外,还应限制网络访问(安全组 / bind 内网),并避免与其它业务共用实例。
:::
## 安全检查脚本
```bash
@@ -179,11 +184,10 @@ echo "=== 安全检查 ==="
# -----------------------------------------------------------------------------
# 检查 APP_DEBUG 是否关闭
# -----------------------------------------------------------------------------
# grep "APP_DEBUG" .env → 从 .env 文件中提取 APP_DEBUG 行
# grep -v "#" → 排除注释行
# cut -d= -f2 → 以 = 为分隔符取第 2 部分(值)
# tr -d ' ' → 去除空格
debug=$(grep "APP_DEBUG" .env | grep -v "#" | cut -d= -f2 | tr -d ' ')
# grep "^APP_DEBUG" .env → 从 .env 中取 APP_DEBUG 行(^ 锚定行首,排除注释)
# cut -d= -f2 → 以 = 为分隔符取第 2 部分(值)
# tr -d ' ' → 去除空格
debug=$(grep "^APP_DEBUG" .env | cut -d= -f2 | tr -d ' ')
if [ "$debug" = "true" ]; then
echo "❌ APP_DEBUG 未关闭(生产环境必须为 false)"
else
@@ -191,14 +195,12 @@ else
fi
# -----------------------------------------------------------------------------
# 检查 JWT 密钥长度
# 检查 JWT 密钥长度(本项目 .env 为扁平键名 JWT_SECRET)
# -----------------------------------------------------------------------------
# sed -n '/\[JWT\]/,/^\[/p' → 提取 .env 中 [JWT] 到下一个 [...] 之间的内容
# grep "^SECRET" → 取 SECRET 行
# ${#secret} → 获取字符串长度
secret=$(sed -n '/\[JWT\]/,/^\[/p' .env | grep "^SECRET" | cut -d= -f2 | tr -d ' ')
# ${#secret} → 获取字符串长度
secret=$(grep "^JWT_SECRET" .env | cut -d= -f2 | tr -d ' ')
if [ ${#secret} -lt 32 ]; then
echo "❌ JWT 密钥太短(建议32字节以上,当前 ${#secret} 字符)"
echo "❌ JWT 密钥太短(建议 32 字符以上,当前 ${#secret} 字符)"
else
echo "✓ JWT 密钥长度足够(${#secret} 字符)"
fi
@@ -206,7 +208,7 @@ fi
# -----------------------------------------------------------------------------
# 检查 CORS 是否允许所有来源
# -----------------------------------------------------------------------------
cors=$(sed -n '/\[CORS\]/,/^\[/p' .env | grep "^ALLOW_ORIGIN" | cut -d= -f2 | tr -d ' ')
cors=$(grep "^CORS_ALLOW_ORIGIN" .env | cut -d= -f2 | tr -d ' ')
if [ "$cors" = "*" ]; then
echo "⚠ CORS 允许所有来源(生产环境建议限制为实际域名)"
else