提交 7f37c9ca authored 作者: 陈泽健's avatar 陈泽健

fix(security): 修复工商银行项目访问页面漏洞

- 更新需求文档中的验证流程,改为验证/exapi/路径下的swagger访问
- 添加服务器IP自动获取功能,支持多种获取方式
- 修改防火墙操作逻辑,先检查8996端口是否开放再决定是否关闭
- 优化配置验证过程,使用动态IP地址进行访问测试
- 调整Docker重启流程,移除用户确认步骤并增加容器状态检查
- 完善日志记录功能,确保所有操作都有相应日志输出
上级 0f0dd65d
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
# 配置参数 # 配置参数
CONFIG_FILE="/var/www/java/nginx-conf.d/meeting443.conf" CONFIG_FILE="/var/www/java/nginx-conf.d/meeting443.conf"
LOG_FILE="$(dirname "$0")/exapicheck.log" LOG_FILE="$(dirname "$0")/exapicheck.log"
SERVER_IP="" # 服务器IP地址,自动获取
BLOCK_CONFIG="# 拦截swagger-ui等危险页面访问 BLOCK_CONFIG="# 拦截swagger-ui等危险页面访问
location ~* ^/exapi/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) { location ~* ^/exapi/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-docs|webjars) {
return 403; return 403;
...@@ -68,6 +69,32 @@ check_root_privilege() { ...@@ -68,6 +69,32 @@ check_root_privilege() {
fi fi
} }
#===============================================================================
# 获取服务器IP地址
#===============================================================================
get_server_ip() {
# 尝试多种方式获取服务器IP
local ip=""
# 方法1: 使用hostname -I
if command -v hostname &>/dev/null; then
ip=$(hostname -I 2>/dev/null | awk '{print $1}')
fi
# 方法2: 使用ip命令
if [ -z "$ip" ] && command -v ip &>/dev/null; then
ip=$(ip route get 1 2>/dev/null | awk '{print $7}' | head -1)
fi
# 方法3: 从网卡配置获取
if [ -z "$ip" ]; then
ip=$(ip addr show 2>/dev/null | grep "inet " | grep -v "127.0.0.1" | head -1 | awk '{print $2}' | cut -d/ -f1)
fi
echo "$ip"
}
#=============================================================================== #===============================================================================
# 检查配置是否已存在 # 检查配置是否已存在
#=============================================================================== #===============================================================================
...@@ -232,7 +259,7 @@ rollback_config() { ...@@ -232,7 +259,7 @@ rollback_config() {
#=============================================================================== #===============================================================================
close_firewall_port() { close_firewall_port() {
log_info "关闭8996端口防火墙..." log_info "检查8996端口防火墙状态..."
# 检查firewalld是否运行 # 检查firewalld是否运行
if ! systemctl is-active --quiet firewalld; then if ! systemctl is-active --quiet firewalld; then
...@@ -240,12 +267,24 @@ close_firewall_port() { ...@@ -240,12 +267,24 @@ close_firewall_port() {
return 0 return 0
fi fi
# 检查8996端口是否开放
local port_list=$(firewall-cmd --list-ports 2>/dev/null)
echo "$port_list" >> "$LOG_FILE"
if echo "$port_list" | grep -q "8996/tcp"; then
log_info "8996端口已开放,开始关闭..."
else
log_info "8996端口未开放,跳过防火墙操作"
return 0
fi
# 移除8996端口 # 移除8996端口
log_info "执行: firewall-cmd --permanent --remove-port=8996/tcp" log_info "执行: firewall-cmd --permanent --remove-port=8996/tcp"
if firewall-cmd --permanent --remove-port=8996/tcp >> "$LOG_FILE" 2>&1; then if firewall-cmd --permanent --remove-port=8996/tcp >> "$LOG_FILE" 2>&1; then
log_info "8996端口移除成功" log_info "8996端口移除成功"
else else
log_warn "8996端口移除失败(可能端口未开放)" log_warn "8996端口移除失败"
return 1
fi fi
# 重载防火墙配置 # 重载防火墙配置
...@@ -259,7 +298,7 @@ close_firewall_port() { ...@@ -259,7 +298,7 @@ close_firewall_port() {
# 验证端口是否已关闭 # 验证端口是否已关闭
log_info "执行: firewall-cmd --list-ports" log_info "执行: firewall-cmd --list-ports"
local port_list=$(firewall-cmd --list-ports 2>/dev/null) port_list=$(firewall-cmd --list-ports 2>/dev/null)
echo "$port_list" >> "$LOG_FILE" echo "$port_list" >> "$LOG_FILE"
if echo "$port_list" | grep -q "8996/tcp"; then if echo "$port_list" | grep -q "8996/tcp"; then
...@@ -277,22 +316,18 @@ close_firewall_port() { ...@@ -277,22 +316,18 @@ close_firewall_port() {
#=============================================================================== #===============================================================================
restart_docker() { restart_docker() {
log_warn "重启docker服务(将影响所有运行容器)..." log_info "重启docker服务..."
# 询问用户确认
echo ""
read -p "是否确认重启docker? (y/n): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
log_warn "用户取消重启docker"
return 1
fi
if systemctl restart docker >> "$LOG_FILE" 2>&1; then if systemctl restart docker >> "$LOG_FILE" 2>&1; then
log_info "docker服务重启成功" log_info "docker服务重启成功"
# 等待容器启动 # 等待容器启动
log_info "等待容器启动(10秒)..." log_info "等待容器启动(60秒)..."
sleep 10 sleep 60
# 检查容器状态
log_info "检查容器状态: docker ps"
docker ps >> "$LOG_FILE" 2>&1
# 检查ujava容器是否运行 # 检查ujava容器是否运行
local container=$(get_ujava_container) local container=$(get_ujava_container)
...@@ -323,35 +358,23 @@ verify_config() { ...@@ -323,35 +358,23 @@ verify_config() {
echo -e "${BLUE}============================================${NC}" echo -e "${BLUE}============================================${NC}"
echo "" echo ""
# 验证8996端口 # 验证/exapi/路径下的swagger访问
echo -n "[1/2] 测试 http://192.168.52.62:8996/swagger-ui.html ... " echo -n "[1/1] 测试 https://${SERVER_IP}/exapi/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") local result=$(curl -k -v https://${SERVER_IP}/exapi/swagger-ui.html 2>&1 | grep -i "HTTP/1.1 403\|HTTP/2 403")
if [ -n "$result1" ]; then if [ -n "$result" ]; then
echo -e "${GREEN}成功 (返回403)${NC}" echo -e "${GREEN}成功 (返回403)${NC}"
log_info "8996端口swagger-ui访问已拦截" log_info "/exapi/路径swagger-ui访问已拦截"
else else
echo -e "${YELLOW}失败 (未返回403)${NC}" echo -e "${YELLOW}失败 (未返回403)${NC}"
log_warn "8996端口swagger-ui访问未被拦截" log_warn "/exapi/路径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 fi
echo "" echo ""
echo -e "${BLUE}============================================${NC}" echo -e "${BLUE}============================================${NC}"
echo "" echo ""
if [ -n "$result1" ] || [ -n "$result2" ]; then if [ -n "$result" ]; then
return 0 return 0
else else
return 1 return 1
...@@ -374,6 +397,14 @@ main() { ...@@ -374,6 +397,14 @@ main() {
log_warn "无法在脚本目录创建日志,使用临时目录: $LOG_FILE" log_warn "无法在脚本目录创建日志,使用临时目录: $LOG_FILE"
} }
# 获取服务器IP
SERVER_IP=$(get_server_ip)
if [ -z "$SERVER_IP" ]; then
log_error "无法获取服务器IP地址"
return 1
fi
log_info "服务器IP地址: $SERVER_IP"
# 检查配置是否已存在 # 检查配置是否已存在
check_config_exists check_config_exists
local check_result=$? local check_result=$?
......
...@@ -39,10 +39,17 @@ ...@@ -39,10 +39,17 @@
- 检查测试结果是否存在`successful`,成功返回true,失败返回false,并去除新增的nginx配置。 - 检查测试结果是否存在`successful`,成功返回true,失败返回false,并去除新增的nginx配置。
- 如果成功则执行重载操作`/usr/local/nginx/sbin/nginx -s reload`,否则返回false - 如果成功则执行重载操作`/usr/local/nginx/sbin/nginx -s reload`,否则返回false
- 检查配置是否成功: - 检查配置是否成功:
- **说明**:需执行以下两个验证命令,确保不同端口和路径的swagger访问均被拦截。 - **说明**:需执行以下验证命令,验证/exapi/路径下的swagger访问是否被拦截。服务器IP需要自动获取当前服务器地址。
- 执行:`curl -k -v http://192.168.52.62:8996/swagger-ui.html` 查看是否正确返回403页面。 - 执行:`curl -k -v https://当前服务器IP/exapi/swagger-ui.html` 查看是否正确返回403页面。
- 执行:`curl -k -v https://192.168.52.62/exapi/swagger-ui.html` 查看是否正确返回403页面。
- 防火墙关闭: - 防火墙关闭:
- **说明**:需先检查8996端口是否开放,如果未开放则跳过防火墙操作。如果已开放则执行关闭操作。
- 检查:执行 `firewall-cmd --list-ports` 查看8996/tcp是否在列表中。
- 如果8996端口已开放,执行:
- 执行:`sudo firewall-cmd --permanent --remove-port=8996/tcp`
- 执行:`sudo firewall-cmd --reload`
- 执行:`sudo firewall-cmd --list-ports`进行验证是否已关闭8996。
- 执行:`sudo systemctl restart docker`重启容器即可。
- 如果8996端口未开放,跳过防火墙操作,直接执行后续步骤。
- **说明**:需执行以下命令,关闭8996防火墙。 - **说明**:需执行以下命令,关闭8996防火墙。
- 执行:`sudo firewall-cmd --permanent --remove-port=8996/tcp` - 执行:`sudo firewall-cmd --permanent --remove-port=8996/tcp`
- 执行:`sudo firewall-cmd --reload` - 执行:`sudo firewall-cmd --reload`
......
...@@ -30,16 +30,21 @@ ...@@ -30,16 +30,21 @@
- 测试成功后执行: `/usr/local/nginx/sbin/nginx -s reload` - 测试成功后执行: `/usr/local/nginx/sbin/nginx -s reload`
#### 2.5 配置验证 #### 2.5 配置验证
- 执行: `curl -k -v http://192.168.52.62:8996/swagger-ui.html` - **说明**:验证/exapi/路径下的swagger访问是否被拦截,服务器IP自动获取
- 执行: `curl -k -v https://192.168.52.62/exapi/swagger-ui.html` - 获取服务器IP: 自动获取当前服务器IP地址
- 执行: `curl -k -v https://当前服务器IP/exapi/swagger-ui.html`
- 验证是否正确返回403页面 - 验证是否正确返回403页面
#### 2.6 防火墙关闭 #### 2.6 防火墙关闭
- **说明**:关闭8996端口防火墙,确保端口不可直接访问 - **说明**:先检查8996端口是否开放,未开放则跳过
- 执行: `sudo firewall-cmd --permanent --remove-port=8996/tcp` - 检查: `firewall-cmd --list-ports` 查看是否包含8996/tcp
- 执行: `sudo firewall-cmd --reload` - 如果8996端口已开放:
- 执行: `sudo firewall-cmd --list-ports` 验证8996端口是否已关闭 - 执行: `sudo firewall-cmd --permanent --remove-port=8996/tcp`
- 执行: `sudo systemctl restart docker` 重启容器 - 执行: `sudo firewall-cmd --reload`
- 执行: `sudo firewall-cmd --list-ports` 验证8996端口是否已关闭
- 执行: `sudo systemctl restart docker` 重启容器
- 如果8996端口未开放:
- 跳过防火墙操作,记录日志
#### 2.7 日志记录 #### 2.7 日志记录
- 实时日志打印 - 实时日志打印
...@@ -93,14 +98,15 @@ location ~* ^/exapi/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-d ...@@ -93,14 +98,15 @@ location ~* ^/exapi/(swagger-ui|doc\.html|swagger-resources|v2/api-docs|v3/api-d
| 配置添加 | [x] | 已实现 | | 配置添加 | [x] | 已实现 |
| nginx测试 | [x] | 已实现 | | nginx测试 | [x] | 已实现 |
| nginx重载 | [x] | 已实现 | | nginx重载 | [x] | 已实现 |
| 配置验证 | [x] | 已实现 | | 配置验证 | [x] | 已实现(使用动态IP) |
| 防火墙关闭 | [ ] | 待补充 | | 防火墙关闭 | [x] | 已实现(包含端口检查) |
| 日志记录 | [x] | 已实现 | | 日志记录 | [x] | 已实现 |
| 服务器IP获取 | [x] | 已实现 |
### 6. 注意事项 ### 6. 注意事项
1. 环境中只会存在一个运行的ujava容器 1. 环境中只会存在一个运行的ujava容器
2. 需要两个验证命令,确保不同端口和路径的swagger访问均被拦截 2. 执行一个验证命令,验证/exapi/路径下的swagger访问是否被拦截
3. 失败时需要自动回滚配置 3. 失败时需要自动回滚配置
4. 所有步骤需要输出日志 4. 所有步骤需要输出日志
5. 防火墙关闭需要root权限,使用sudo执行 5. 防火墙关闭需要root权限,使用sudo执行
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论