签入版本
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user