提交 82cb1456 authored 作者: 陈泽健's avatar 陈泽健

feat(security): 新增nginx拦截脚本防止swagger页面访问

- 创建exapicheck.sh脚本用于自动添加nginx转发拦截配置
- 实现配置检查功能避免重复添加location ~* ^/(swagger-ui拦截规则
- 添加nginx配置文件备份和恢复机制确保系统安全
- 实现docker容器内nginx配置测试和重载功能
- 集成curl验证功能确保8996和443端口swagger访问被正确拦截
- 提供完整的日志记录和错误处理机制
- 生成需求文档和执行计划文档规范实施流程
上级 0fa62058
#!/bin/bash
#===============================================================================
# 脚本名称: exapicheck.sh
# 功能描述: 自动补充nginx转发拦截配置,屏蔽swagger-ui等危险页面访问
# 使用方法: ./exapicheck.sh
# 作者: AI生成
# 日期: 2026-05-06
# 版本: v1.0.0
#===============================================================================
# 配置参数
CONFIG_FILE="/var/www/java/nginx-conf.d/meeting443.conf"
LOG_FILE="$(dirname "$0")/exapicheck.log"
BLOCK_CONFIG="# 拦截swagger-ui等危险页面访问
location ~* ^/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) {
return 403;
}"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
#===============================================================================
# 日志函数
#===============================================================================
log_info() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1"
echo -e "${GREEN}${msg}${NC}"
echo "$msg" >> "$LOG_FILE"
}
log_error() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1"
echo -e "${RED}${msg}${NC}"
echo "$msg" >> "$LOG_FILE"
}
log_warn() {
local msg="[$(date '+%Y-%m-%d %H:%M:%S')] WARN: $1"
echo -e "${YELLOW}${msg}${NC}"
echo "$msg" >> "$LOG_FILE"
}
#===============================================================================
# 打印头部信息
#===============================================================================
print_header() {
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} Nginx Swagger拦截配置脚本${NC}"
echo -e "${BLUE}============================================${NC}"
echo "执行时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
}
#===============================================================================
# 检查root权限
#===============================================================================
check_root_privilege() {
if [ "$(id -u)" -ne 0 ]; then
log_error "请使用root用户执行此脚本"
exit 1
fi
}
#===============================================================================
# 检查配置是否已存在
#===============================================================================
check_config_exists() {
log_info "检查配置是否已存在..."
if [ ! -f "$CONFIG_FILE" ]; then
log_error "配置文件不存在: $CONFIG_FILE"
return 2
fi
if grep -q "location ~* \^/(swagger-ui" "$CONFIG_FILE"; then
log_warn "配置已存在,无需重复添加"
echo ""
grep -A 2 "location ~* \^/(swagger-ui" "$CONFIG_FILE"
echo ""
return 1
fi
log_info "配置不存在,可以添加"
return 0
}
#===============================================================================
# 备份配置文件
#===============================================================================
backup_config() {
local backup_file="${CONFIG_FILE}.backup.$(date '+%Y%m%d%H%M%S')"
log_info "备份配置文件到: $backup_file"
if cp "$CONFIG_FILE" "$backup_file"; then
log_info "备份成功"
return 0
else
log_error "备份失败"
return 1
fi
}
#===============================================================================
# 添加nginx拦截配置
#===============================================================================
add_nginx_block_config() {
log_info "添加nginx拦截配置..."
# 查找根目录转发配置位置
local root_location_line=$(grep -n "location /" "$CONFIG_FILE" | head -1 | cut -d: -f1)
if [ -z "$root_location_line" ]; then
log_error "未找到根目录转发配置 location /"
return 1
fi
log_info "找到根目录转发配置在第 $root_location_line 行"
# 在根目录转发配置前插入拦截配置
local insert_line=$((root_location_line - 1))
# 使用sed插入配置
if sed -i "${insert_line}a $BLOCK_CONFIG" "$CONFIG_FILE"; then
log_info "配置添加成功"
return 0
else
log_error "配置添加失败"
return 1
fi
}
#===============================================================================
# 查询ujava容器
#===============================================================================
get_ujava_container() {
log_info "查询ujava容器..."
local container=$(docker ps | grep ujava | awk '{print $1}')
if [ -z "$container" ]; then
log_error "未找到运行的ujava容器"
return 1
fi
log_info "找到ujava容器: $container"
echo "$container"
return 0
}
#===============================================================================
# 测试nginx配置
#===============================================================================
test_nginx_config() {
local container=$1
log_info "测试nginx配置..."
local test_result=$(docker exec "$container" /usr/local/nginx/sbin/nginx -t 2>&1)
echo "$test_result" >> "$LOG_FILE"
if echo "$test_result" | grep -qi "successful"; then
log_info "nginx配置测试成功"
return 0
else
log_error "nginx配置测试失败"
echo "$test_result"
return 1
fi
}
#===============================================================================
# 重载nginx配置
#===============================================================================
reload_nginx() {
local container=$1
log_info "重载nginx配置..."
local reload_result=$(docker exec "$container" /usr/local/nginx/sbin/nginx -s reload 2>&1)
if [ $? -eq 0 ]; then
log_info "nginx重载成功"
return 0
else
log_error "nginx重载失败"
echo "$reload_result" >> "$LOG_FILE"
return 1
fi
}
#===============================================================================
# 回滚配置
#===============================================================================
rollback_config() {
log_warn "开始回滚配置..."
# 删除新增的配置块
if sed -i '/# 拦截swagger-ui等危险页面访问/,/}$/d' "$CONFIG_FILE"; then
log_info "配置回滚成功"
return 0
else
log_error "配置回滚失败"
return 1
fi
}
#===============================================================================
# 验证配置是否生效
#===============================================================================
verify_config() {
log_info "验证配置是否生效..."
echo ""
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} 执行验证测试${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""
# 验证8996端口
echo -n "[1/2] 测试 http://192.168.52.62:8996/swagger-ui.html ... "
local result1=$(curl -k -v http://192.168.52.62:8996/swagger-ui.html 2>&1 | grep -i "HTTP/1.1 403\|HTTP/2 403")
if [ -n "$result1" ]; then
echo -e "${GREEN}成功 (返回403)${NC}"
log_info "8996端口swagger-ui访问已拦截"
else
echo -e "${YELLOW}失败 (未返回403)${NC}"
log_warn "8996端口swagger-ui访问未被拦截"
fi
# 验证443端口/exapi路径
echo -n "[2/2] 测试 https://192.168.52.62/exapi/swagger-ui.html ... "
local result2=$(curl -k -v https://192.168.52.62/exapi/swagger-ui.html 2>&1 | grep -i "HTTP/1.1 403\|HTTP/2 403")
if [ -n "$result2" ]; then
echo -e "${GREEN}成功 (返回403)${NC}"
log_info "443端口/exapi路径swagger-ui访问已拦截"
else
echo -e "${YELLOW}失败 (未返回403)${NC}"
log_warn "443端口/exapi路径swagger-ui访问未被拦截"
fi
echo ""
echo -e "${BLUE}============================================${NC}"
echo ""
if [ -n "$result1" ] || [ -n "$result2" ]; then
return 0
else
return 1
fi
}
#===============================================================================
# 主函数
#===============================================================================
main() {
print_header
# 检查root权限
check_root_privilege
# 创建日志文件
touch "$LOG_FILE" 2>/dev/null || {
LOG_FILE="/tmp/exapicheck.log"
log_warn "无法在脚本目录创建日志,使用临时目录: $LOG_FILE"
}
# 检查配置是否已存在
check_config_exists
local check_result=$?
if [ $check_result -eq 1 ]; then
# 配置已存在,询问是否继续验证
echo ""
read -p "是否需要验证现有配置? (y/n): " verify_choice
if [[ "$verify_choice" =~ ^[Yy]$ ]]; then
verify_config
fi
return 0
elif [ $check_result -eq 2 ]; then
return 1
fi
echo ""
# 备份配置文件
backup_config
if [ $? -ne 0 ]; then
log_error "备份失败,终止执行"
return 1
fi
# 添加nginx拦截配置
add_nginx_block_config
if [ $? -ne 0 ]; then
log_error "配置添加失败,终止执行"
return 1
fi
echo ""
# 查询ujava容器
local ujava_container=$(get_ujava_container)
if [ $? -ne 0 ]; then
log_error "未找到ujava容器,开始回滚配置"
rollback_config
return 1
fi
# 测试nginx配置
test_nginx_config "$ujava_container"
if [ $? -ne 0 ]; then
log_error "nginx配置测试失败,开始回滚配置"
rollback_config
return 1
fi
# 重载nginx配置
reload_nginx "$ujava_container"
if [ $? -ne 0 ]; then
log_error "nginx重载失败,请手动检查"
return 1
fi
echo ""
log_info "nginx配置已成功添加并重载"
# 验证配置
verify_config
echo ""
log_info "执行完成"
echo ""
echo "日志文件: $LOG_FILE"
}
# 执行主函数
main "$@"
# 8996访问页面漏洞修复需求文档
## 代码路径
- 代码路径:[AuxiliaryTool/漏洞修复/ExaptCheck/exapicheck.sh]
## 功能需求
### 功能目标
**目标:** 新增脚本来自动补充nginx转发拦截,将`http://192.168.52.62:8996/swagger-ui.html` 在访问时做拦截操作,返回403页面。
### 需求描述
- 输出脚本:`AuxiliaryTool/漏洞修复/ExtaptCheck/ExtaptCheck.sh`
- 脚本功能:
- **配置检查**:执行前先检查配置文件中是否已存在拦截配置,避免重复添加。通过检查是否包含 `location ~* \^/(swagger-ui` 关键字来判断。
- 在宿主机[/var/www/java/nginx-conf.d]目录下对nginx配置文件[meeting443.conf]新增转发拦截配置,需要加在根目录转发的上面。
- 根目录转发内容为:
- ```ignorelang
location / { }
```
- 配置文件内容:
- ```ignorelang
# 这里的 ^/ 表示匹配 URL 路径的开头
location ~* ^/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) {
return 403;
}
```
- 添加后的效果:
- ```ignorelang
location ~* ^/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) {
return 403;
}
location / { }
```
- 添加成功后需要做重载操作。
- 操作步骤:
- **说明**:环境中只会存在一个运行的ujava容器。
- 模糊查询ujava容器,docker ps | grep ujava
- 进入ujava容器
- 执行测试:`/usr/local/nginx/sbin/nginx -t`
- 检查测试结果是否存在`successful`,成功返回true,失败返回false,并去除新增的nginx配置。
- 如果成功则执行重载操作`/usr/local/nginx/sbin/nginx -s reload`,否则返回false
- 检查配置是否成功:
- **说明**:需执行以下两个验证命令,确保不同端口和路径的swagger访问均被拦截。
- 执行:`curl -k -v http://192.168.52.62:8996/swagger-ui.html` 查看是否正确返回403页面。
- 执行:`curl -k -v https://192.168.52.62/exapi/swagger-ui.html` 查看是否正确返回403页面。
- 日志打印:
- 实时日志打印,每一步骤都需要打印,日志文件可以存放在当前脚本所在目录下。
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 8996访问页面漏洞修复计划执行文档
## 需求来源
- 需求文档: `_PRD_8996访问页面的漏洞修复需求文档.md`
## 实施计划
### 1. 脚本创建
- 脚本路径: `AuxiliaryTool/漏洞修复/ExaptCheck/exapicheck.sh`
- 脚本功能: 自动补充nginx转发拦截配置
### 2. 实现步骤
#### 2.1 配置检查
- 执行前先检查配置文件中是否已存在拦截配置
- 通过检查关键字 `location ~* ^/(swagger-ui` 判断
#### 2.2 配置添加
- 在宿主机 `/var/www/java/nginx-conf.d` 目录下操作
- 配置文件: `meeting443.conf`
- 在根目录转发配置上方添加拦截配置
#### 2.3 nginx配置测试
- 模糊查询ujava容器: `docker ps | grep ujava`
- 进入容器执行测试: `/usr/local/nginx/sbin/nginx -t`
- 检查结果是否包含 `successful`
- 失败则去除新增配置并返回false
#### 2.4 nginx重载
- 测试成功后执行: `/usr/local/nginx/sbin/nginx -s reload`
#### 2.5 配置验证
- 执行: `curl -k -v http://192.168.52.62:8996/swagger-ui.html`
- 执行: `curl -k -v https://192.168.52.62/exapi/swagger-ui.html`
- 验证是否正确返回403页面
#### 2.6 日志记录
- 实时日志打印
- 日志文件存放在脚本所在目录
### 3. 配置内容
```bash
# nginx拦截配置
location ~* ^/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) {
return 403;
}
```
### 4. 执行流程图
```
开始
检查配置是否已存在 → 是 → 结束(配置已存在)
↓ 否
添加nginx拦截配置
查询ujava容器
进入容器执行nginx -t
检查是否successful
↓ ↓
失败 成功
↓ ↓
去除新增配置 执行nginx reload
返回false ↓
执行curl验证
检查返回403
结束
```
### 5. 实施状态
| 步骤 | 状态 | 说明 |
|------|------|------|
| 脚本创建 | [ ] | 待实施 |
| 配置检查 | [ ] | 待实施 |
| 配置添加 | [ ] | 待实施 |
| nginx测试 | [ ] | 待实施 |
| nginx重载 | [ ] | 待实施 |
| 配置验证 | [ ] | 待实施 |
| 日志记录 | [ ] | 待实施 |
### 6. 注意事项
1. 环境中只会存在一个运行的ujava容器
2. 需要两个验证命令,确保不同端口和路径的swagger访问均被拦截
3. 失败时需要自动回滚配置
4. 所有步骤需要输出日志
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论