DeOldify部署审计清单:防火墙规则/端口暴露/认证机制合规检查

📅 发布时间:2026/7/10 13:51:38 👁️ 浏览次数:
DeOldify部署审计清单:防火墙规则/端口暴露/认证机制合规检查
DeOldify部署审计清单防火墙规则/端口暴露/认证机制合规检查1. 为什么你需要这份部署审计清单最近帮朋友部署了一个DeOldify图像上色服务就是那种能把黑白老照片变成彩色照片的AI工具。部署过程挺顺利Web界面漂亮API也好用朋友很满意。但过了几天他半夜给我打电话声音都变了“服务器好像被黑了CPU一直100%流量异常是不是有人用我的服务搞事情”我连夜帮他排查发现问题出在几个地方服务端口7860直接暴露在公网没有任何访问控制没有设置任何认证机制谁都能随便调用防火墙规则配置不当所有端口都开放这次经历让我意识到很多人在部署AI服务时只关注功能实现完全忽略了安全合规。今天我就把这次踩坑的经验整理成一份完整的审计清单帮你避免同样的风险。2. 部署前的安全规划2.1 明确你的安全需求在开始部署之前先问自己几个问题服务要开放给谁用仅内部团队使用 → 需要内网访问控制给特定客户使用 → 需要用户认证和权限管理完全公开服务 → 需要防滥用和流量控制数据敏感程度如何普通公开图片 → 基础防护即可包含个人信息 → 需要数据加密和访问日志商业机密图片 → 需要高级安全措施预计的访问量少量测试使用 → 简单防护中等规模使用 → 需要限流和监控大规模公开服务 → 需要完整的安全架构2.2 选择合适的安全级别根据你的需求可以选择不同的安全级别基础级个人/测试使用防火墙限制访问IP简单的API密钥认证基本的访问日志标准级团队/小规模使用JWT令牌认证请求频率限制完整的访问审计日志输入数据验证高级级公开/商业服务OAuth 2.0认证防DDoS攻击数据加密传输安全漏洞扫描定期安全审计3. 防火墙规则配置检查3.1 端口暴露风险评估DeOldify默认使用7860端口这个端口直接暴露在公网的风险很高。我们先来看看常见的风险场景风险场景1端口扫描攻击# 攻击者可能这样扫描你的服务 nmap -p 7860 your-server-ip # 如果发现端口开放他们会尝试各种攻击 # 1. 暴力调用API消耗资源 # 2. 上传恶意文件尝试执行 # 3. 探测服务漏洞风险场景2未授权访问# 任何人都可以这样调用你的服务 curl -X POST http://your-server-ip:7860/colorize \ -F imageany_image.jpg # 结果你的服务器资源被滥用 # 电费、流量费、计算资源都被消耗3.2 正确的防火墙配置方案A仅限特定IP访问推荐如果你只需要让特定的人或服务访问可以这样配置# 使用iptables限制访问 # 只允许特定IP访问7860端口 sudo iptables -A INPUT -p tcp --dport 7860 -s 192.168.1.100 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 7860 -s 10.0.0.50 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 7860 -j DROP # 保存规则Ubuntu/Debian sudo netfilter-persistent save # 查看当前规则 sudo iptables -L -n | grep 7860方案B使用云服务商的安全组如果你用的是云服务器阿里云、腾讯云、AWS等可以用安全组功能# 以阿里云为例的安全组规则 # 入方向规则 # 协议类型自定义TCP # 端口范围7860/7860 # 授权对象114.114.114.114/32仅限你的IP # 优先级1最高 # 出方向规则通常保持默认 # 但如果你需要限制出站也可以配置方案C结合Nginx反向代理更安全的做法是通过Nginx反向代理隐藏真实端口# /etc/nginx/sites-available/deoldify server { listen 80; server_name your-domain.com; # 只允许特定IP访问 allow 192.168.1.0/24; allow 10.0.0.0/8; deny all; location / { proxy_pass http://localhost:7860; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 添加基础认证 auth_basic Restricted Access; auth_basic_user_file /etc/nginx/.htpasswd; } # 限制请求频率 limit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; limit_req zoneapi burst20 nodelay; }3.3 防火墙配置检查清单部署完成后用这个清单检查你的防火墙配置#!/bin/bash # firewall-check.sh echo 防火墙配置检查 # 1. 检查7860端口是否开放 echo 1. 检查7860端口状态: sudo netstat -tlnp | grep :7860 # 2. 检查iptables规则 echo -e \n2. 检查iptables规则: sudo iptables -L INPUT -n --line-numbers | grep 7860 # 3. 检查UFW配置如果使用UFW echo -e \n3. 检查UFW状态: sudo ufw status verbose | grep 7860 # 4. 从外部测试端口可访问性 echo -e \n4. 外部端口测试需要另一台服务器: # 注释掉这行在实际测试时使用 # nc -zv your-server-ip 7860 # 5. 检查Nginx配置如果使用 echo -e \n5. 检查Nginx配置: if [ -f /etc/nginx/sites-available/deoldify ]; then echo Nginx配置文件存在 sudo nginx -t else echo 未使用Nginx反向代理 fi echo -e \n 检查完成 4. 认证机制配置指南4.1 为什么需要认证机制没有认证的AI服务就像没有锁的门谁都能进。认证机制能帮你控制访问权限只有授权用户能使用服务追踪使用情况知道谁在什么时候用了什么功能防止资源滥用限制恶意用户的无限调用满足合规要求很多场景下认证是必须的4.2 简单的API密钥认证对于个人或小团队使用API密钥是最简单的方案步骤1生成API密钥# generate_api_keys.py import secrets import hashlib import json from datetime import datetime def generate_api_key(user_id, description): 生成API密钥 # 生成随机密钥 raw_key secrets.token_urlsafe(32) # 创建密钥记录 api_key { key_id: hashlib.sha256(raw_key.encode()).hexdigest()[:16], raw_key: raw_key, # 只显示一次需要保存 hashed_key: hashlib.sha256(raw_key.encode()).hexdigest(), user_id: user_id, description: description, created_at: datetime.now().isoformat(), is_active: True, rate_limit: 100 # 每小时最大请求数 } return api_key # 生成示例密钥 keys [ generate_api_key(user1, 内部测试使用), generate_api_key(user2, 客户A使用), generate_api_key(user3, 客户B使用) ] # 保存到文件 with open(api_keys.json, w) as f: json.dump(keys, f, indent2) print(API密钥已生成请妥善保存api_keys.json文件) print(注意raw_key字段只显示一次需要告知用户)步骤2在DeOldify服务中添加认证中间件# auth_middleware.py import hashlib import json import time from functools import wraps from flask import request, jsonify from collections import defaultdict # 加载API密钥 with open(api_keys.json, r) as f: API_KEYS json.load(f) # 请求频率限制 request_counts defaultdict(list) def require_api_key(f): API密钥认证装饰器 wraps(f) def decorated_function(*args, **kwargs): # 获取API密钥 api_key request.headers.get(X-API-Key) if not api_key: return jsonify({ error: API密钥缺失, message: 请在请求头中添加 X-API-Key }), 401 # 验证密钥 hashed_key hashlib.sha256(api_key.encode()).hexdigest() valid_key None for key_info in API_KEYS: if key_info[hashed_key] hashed_key and key_info[is_active]: valid_key key_info break if not valid_key: return jsonify({ error: 无效的API密钥, message: 请检查密钥是否正确或已失效 }), 401 # 检查频率限制 key_id valid_key[key_id] current_time time.time() # 清理一小时前的记录 request_counts[key_id] [ t for t in request_counts[key_id] if current_time - t 3600 ] # 检查是否超限 if len(request_counts[key_id]) valid_key[rate_limit]: return jsonify({ error: 请求频率超限, message: f每小时最多{valid_key[rate_limit]}次请求, reset_in: int(3600 - (current_time - request_counts[key_id][0])) }), 429 # 记录本次请求 request_counts[key_id].append(current_time) # 将用户信息添加到请求上下文 request.user_id valid_key[user_id] request.key_info valid_key return f(*args, **kwargs) return decorated_function # 使用示例修改DeOldify的API路由 from flask import Flask, request import base64 from io import BytesIO from PIL import Image app Flask(__name__) app.route(/colorize, methods[POST]) require_api_key # 添加认证装饰器 def colorize(): 需要认证的图片上色接口 # 原来的处理逻辑 if image not in request.files: return jsonify({error: 没有上传图片}), 400 file request.files[image] # 记录谁调用了这个接口 user_id request.user_id print(f用户 {user_id} 调用了上色接口) # ... 原来的上色处理逻辑 ... return jsonify({ success: True, user_id: user_id, output_img_base64: ..., format: png }) app.route(/public/colorize, methods[POST]) def public_colorize(): 公开接口有限制 # 这里可以添加一些限制比如 # - 图片大小限制 # - 每天调用次数限制 # - 简单的验证码 # ... 处理逻辑 ... return jsonify({success: True})步骤3客户端使用API密钥# client_with_auth.py import requests import base64 from io import BytesIO from PIL import Image class DeOldifyClient: def __init__(self, base_url, api_key): self.base_url base_url self.api_key api_key self.headers { X-API-Key: api_key } def colorize_image(self, image_path): 使用API密钥调用上色服务 try: with open(image_path, rb) as f: files {image: f} response requests.post( f{self.base_url}/colorize, filesfiles, headersself.headers ) if response.status_code 200: result response.json() if result[success]: # 解码并保存图片 img_data base64.b64decode(result[output_img_base64]) img Image.open(BytesIO(img_data)) output_path image_path.replace(., _colored.) img.save(output_path) print(f上色成功用户: {result.get(user_id, unknown)}) print(f保存到: {output_path}) return output_path else: print(f上色失败: {result}) elif response.status_code 401: print(认证失败API密钥无效) elif response.status_code 429: print(请求频率超限请稍后再试) else: print(f请求失败状态码: {response.status_code}) except Exception as e: print(f发生错误: {e}) return None # 使用示例 client DeOldifyClient( base_urlhttp://localhost:7860, api_keyyour_api_key_here # 从api_keys.json获取 ) result client.colorize_image(old_photo.jpg)4.3 更安全的JWT认证对于需要更复杂权限管理的场景可以使用JWTJSON Web Token# jwt_auth.py import jwt import datetime from functools import wraps from flask import request, jsonify from werkzeug.security import generate_password_hash, check_password_hash # 配置 SECRET_KEY your-secret-key-change-this TOKEN_EXPIRE_HOURS 24 # 模拟用户数据库 users { admin: { password_hash: generate_password_hash(admin123), role: admin, rate_limit: 1000 }, user1: { password_hash: generate_password_hash(user123), role: user, rate_limit: 100 } } def create_token(username): 创建JWT令牌 payload { username: username, role: users[username][role], exp: datetime.datetime.utcnow() datetime.timedelta(hoursTOKEN_EXPIRE_HOURS), iat: datetime.datetime.utcnow() } token jwt.encode(payload, SECRET_KEY, algorithmHS256) return token def verify_token(token): 验证JWT令牌 try: payload jwt.decode(token, SECRET_KEY, algorithms[HS256]) return payload except jwt.ExpiredSignatureError: return None # 令牌过期 except jwt.InvalidTokenError: return None # 无效令牌 def login_required(f): 登录验证装饰器 wraps(f) def decorated_function(*args, **kwargs): token request.headers.get(Authorization) if not token: return jsonify({ error: 未提供认证令牌, message: 请在Authorization头中提供Bearer令牌 }), 401 # 提取Bearer令牌 if token.startswith(Bearer ): token token[7:] # 验证令牌 payload verify_token(token) if not payload: return jsonify({ error: 无效的认证令牌, message: 令牌无效或已过期 }), 401 # 将用户信息添加到请求上下文 request.user payload return f(*args, **kwargs) return decorated_function def role_required(role): 角色权限验证装饰器 def decorator(f): wraps(f) def decorated_function(*args, **kwargs): # 先检查是否登录 token request.headers.get(Authorization) if not token: return jsonify({error: 需要认证}), 401 if token.startswith(Bearer ): token token[7:] payload verify_token(token) if not payload: return jsonify({error: 无效令牌}), 401 # 检查角色权限 if payload.get(role) ! role: return jsonify({ error: 权限不足, message: f需要{role}角色 }), 403 request.user payload return f(*args, **kwargs) return decorated_function return decorator # 登录接口 app.route(/api/login, methods[POST]) def login(): 用户登录获取JWT令牌 data request.get_json() username data.get(username) password data.get(password) if not username or not password: return jsonify({error: 需要用户名和密码}), 400 # 验证用户 user users.get(username) if not user or not check_password_hash(user[password_hash], password): return jsonify({error: 用户名或密码错误}), 401 # 创建令牌 token create_token(username) return jsonify({ success: True, token: token, user: { username: username, role: user[role], rate_limit: user[rate_limit] } }) # 需要认证的接口 app.route(/api/colorize, methods[POST]) login_required def api_colorize(): 需要JWT认证的上色接口 user_info request.user print(f用户 {user_info[username]} (角色: {user_info[role]}) 调用了接口) # ... 上色处理逻辑 ... return jsonify({ success: True, processed_by: user_info[username] }) # 需要管理员角色的接口 app.route(/api/admin/stats, methods[GET]) role_required(admin) def admin_stats(): 只有管理员能访问的统计接口 # ... 返回统计信息 ... return jsonify({ success: True, stats: { total_requests: 1000, active_users: 50, server_load: 30% } })5. 完整的部署审计清单5.1 部署前检查清单在部署DeOldify服务之前先完成这些检查#!/bin/bash # pre-deployment-checklist.sh echo DeOldify部署前安全检查 # 1. 系统安全更新 echo 1. 检查系统更新: sudo apt update sudo apt list --upgradable # 2. 检查不必要的服务 echo -e \n2. 检查运行中的服务: sudo systemctl list-units --typeservice --staterunning | grep -E (ssh|nginx|apache|mysql|redis) # 3. 检查开放端口 echo -e \n3. 检查开放端口: sudo netstat -tlnp # 4. 检查防火墙状态 echo -e \n4. 检查防火墙状态: sudo ufw status || sudo iptables -L -n # 5. 检查用户权限 echo -e \n5. 检查当前用户: whoami groups # 6. 检查目录权限 echo -e \n6. 检查项目目录权限: ls -la /root/cv_unet_image-colorization/ # 7. 检查Python环境 echo -e \n7. 检查Python环境: python3 --version pip3 list | grep -E (flask|torch|modelscope) echo -e \n 检查完成 echo 请根据检查结果调整配置后再部署5.2 部署后审计清单部署完成后运行这个审计脚本# security_audit.py import requests import socket import subprocess import json from datetime import datetime class DeOldifySecurityAudit: def __init__(self, service_urlhttp://localhost:7860): self.service_url service_url self.audit_results [] def log_result(self, check_name, status, details): 记录审计结果 result { check: check_name, status: status, # PASS, WARNING, FAIL details: details, timestamp: datetime.now().isoformat() } self.audit_results.append(result) status_icon ✅ if status PASS else ⚠️ if status WARNING else ❌ print(f{status_icon} {check_name}: {details}) def check_port_exposure(self): 检查端口暴露情况 try: # 检查本地端口 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) result sock.connect_ex((localhost, 7860)) if result 0: self.log_result(端口监听, PASS, 服务正在监听7860端口) else: self.log_result(端口监听, FAIL, 服务未在7860端口监听) sock.close() # 检查防火墙规则 try: output subprocess.check_output( sudo iptables -L INPUT -n | grep 7860, shellTrue, stderrsubprocess.DEVNULL, textTrue ) if ACCEPT in output: # 检查是否有来源限制 if 0.0.0.0/0 in output or anywhere in output: self.log_result(防火墙规则, FAIL, 7860端口对所有IP开放) else: self.log_result(防火墙规则, PASS, 7860端口有IP限制) elif DROP in output or REJECT in output: self.log_result(防火墙规则, PASS, 7860端口被防火墙阻止) else: self.log_result(防火墙规则, WARNING, 未找到7860端口的防火墙规则) except subprocess.CalledProcessError: self.log_result(防火墙规则, WARNING, 无法检查防火墙规则) except Exception as e: self.log_result(端口检查, FAIL, f检查失败: {str(e)}) def check_authentication(self): 检查认证机制 try: # 测试无需认证的访问 response requests.get(f{self.service_url}/health, timeout5) if response.status_code 200: # 检查是否有认证相关头信息 headers response.headers if WWW-Authenticate in headers: self.log_result(认证机制, PASS, 服务需要认证) else: # 测试API接口是否需要认证 try: api_response requests.post( f{self.service_url}/colorize, files{image: (test.jpg, bfake_image_data)}, timeout5 ) if api_response.status_code 401: self.log_result(API认证, PASS, API接口需要认证) else: self.log_result(API认证, FAIL, API接口无需认证即可访问) except requests.exceptions.RequestException: self.log_result(API认证, WARNING, 无法测试API接口) else: self.log_result(服务可访问性, WARNING, f服务返回状态码: {response.status_code}) except requests.exceptions.RequestException as e: self.log_result(服务可访问性, FAIL, f无法访问服务: {str(e)}) def check_rate_limiting(self): 检查频率限制 try: # 测试快速连续请求 responses [] for i in range(11): # 快速发送11个请求 try: response requests.get(f{self.service_url}/health, timeout2) responses.append(response.status_code) except: responses.append(0) # 检查是否有429状态码太多请求 if 429 in responses: self.log_result(频率限制, PASS, 服务实施了频率限制) else: self.log_result(频率限制, WARNING, 未检测到频率限制) except Exception as e: self.log_result(频率限制检查, WARNING, f检查失败: {str(e)}) def check_input_validation(self): 检查输入验证 test_cases [ (超大文件, bx * (51 * 1024 * 1024)), # 51MB超过50MB限制 (恶意文件名, bfake, test.php;.jpg), (非图片文件, bnot an image, test.txt), ] for test_name, content, filename in test_cases: try: response requests.post( f{self.service_url}/colorize, files{image: (filename, content)}, timeout10 ) if response.status_code 400 or response.status_code 413: self.log_result(f输入验证-{test_name}, PASS, 正确拒绝了无效输入) else: self.log_result(f输入验证-{test_name}, WARNING, f未正确验证{test_name}状态码: {response.status_code}) except requests.exceptions.RequestException: self.log_result(f输入验证-{test_name}, WARNING, 测试请求失败) def check_logging(self): 检查日志配置 try: # 检查日志文件是否存在 log_files [ /root/cv_unet_image-colorization/logs/error.log, /root/cv_unet_image-colorization/logs/access.log, ] for log_file in log_files: try: with open(log_file, r) as f: lines f.readlines() if len(lines) 0: self.log_result(f日志文件-{log_file}, PASS, f日志文件存在有{len(lines)}行记录) else: self.log_result(f日志文件-{log_file}, WARNING, 日志文件存在但为空) except FileNotFoundError: self.log_result(f日志文件-{log_file}, FAIL, 日志文件不存在) except Exception as e: self.log_result(日志检查, WARNING, f检查失败: {str(e)}) def run_full_audit(self): 运行完整审计 print( 开始DeOldify安全审计) print( * 50) self.check_port_exposure() self.check_authentication() self.check_rate_limiting() self.check_input_validation() self.check_logging() print(\n * 50) print( 审计结果汇总:) # 统计结果 pass_count sum(1 for r in self.audit_results if r[status] PASS) warn_count sum(1 for r in self.audit_results if r[status] WARNING) fail_count sum(1 for r in self.audit_results if r[status] FAIL) print(f✅ 通过: {pass_count}) print(f⚠️ 警告: {warn_count}) print(f❌ 失败: {fail_count}) # 生成报告 report { summary: { total_checks: len(self.audit_results), passed: pass_count, warnings: warn_count, failed: fail_count, timestamp: datetime.now().isoformat() }, details: self.audit_results, recommendations: self.generate_recommendations() } # 保存报告 with open(deoldify_security_audit.json, w) as f: json.dump(report, f, indent2, ensure_asciiFalse) print(f\n 详细报告已保存到: deoldify_security_audit.json) return report def generate_recommendations(self): 生成安全建议 recommendations [] # 分析审计结果 fail_checks [r for r in self.audit_results if r[status] FAIL] warn_checks [r for r in self.audit_results if r[status] WARNING] if any(端口对所有IP开放 in r[details] for r in self.audit_results): recommendations.append({ priority: HIGH, issue: 端口暴露风险, recommendation: 立即配置防火墙限制7860端口的访问IP, action: 使用iptables或云安全组限制访问来源 }) if any(API接口无需认证 in r[details] for r in self.audit_results): recommendations.append({ priority: HIGH, issue: 缺乏认证机制, recommendation: 为API接口添加认证机制, action: 实现API密钥或JWT认证 }) if any(未检测到频率限制 in r[details] for r in self.audit_results): recommendations.append({ priority: MEDIUM, issue: 缺乏频率限制, recommendation: 添加请求频率限制, action: 使用令牌桶算法或漏桶算法实现限流 }) if len(fail_checks) 0: recommendations.append({ priority: HIGH, issue: 存在安全风险, recommendation: 立即修复所有FAIL级别的检查项, action: 按照审计报告逐一修复 }) if len(warn_checks) 0: recommendations.append({ priority: MEDIUM, issue: 存在潜在风险, recommendation: 尽快处理WARNING级别的检查项, action: 优化配置消除警告 }) # 基础建议 recommendations.extend([ { priority: MEDIUM, issue: 日志监控, recommendation: 设置日志监控和告警, action: 配置logrotate和监控告警 }, { priority: LOW, issue: 定期审计, recommendation: 定期运行安全审计, action: 每月运行一次安全审计脚本 } ]) return recommendations # 运行审计 if __name__ __main__: # 修改为你的服务地址 auditor DeOldifySecurityAudit(service_urlhttp://localhost:7860) report auditor.run_full_audit()5.3 自动化安全监控脚本部署后可以设置定时任务自动监控安全状态#!/bin/bash # security_monitor.sh # 配置 LOG_FILE/var/log/deoldify_security.log ALERT_EMAILadminexample.com SERVICE_URLhttp://localhost:7860 # 创建日志目录 mkdir -p $(dirname $LOG_FILE) # 记录时间 echo 安全监控检查 $(date) $LOG_FILE # 1. 检查服务状态 echo 检查服务状态... $LOG_FILE if curl -s $SERVICE_URL/health /dev/null; then echo ✅ 服务运行正常 $LOG_FILE else echo ❌ 服务不可用 $LOG_FILE echo 服务不可用请立即检查 | mail -s DeOldify服务异常 $ALERT_EMAIL fi # 2. 检查端口暴露 echo -e \n检查端口暴露... $LOG_FILE OPEN_PORTS$(sudo netstat -tlnp | grep :7860 | awk {print $4}) if [[ $OPEN_PORTS *0.0.0.0:7860* ]] || [[ $OPEN_PORTS *:7860* ]]; then echo ⚠️ 7860端口对所有IP开放 $LOG_FILE # 检查是否有防火墙限制 IPTABLES_RULE$(sudo iptables -L INPUT -n | grep 7860) if [[ -z $IPTABLES_RULE ]]; then echo ❌ 未配置防火墙规则 $LOG_FILE echo 警告7860端口完全暴露 | mail -s DeOldify安全警告 $ALERT_EMAIL else echo 防火墙规则: $IPTABLES_RULE $LOG_FILE fi else echo ✅ 端口访问受限制 $LOG_FILE fi # 3. 检查认证简单测试 echo -e \n检查认证机制... $LOG_FILE RESPONSE$(curl -s -o /dev/null -w %{http_code} -X POST $SERVICE_URL/colorize) if [[ $RESPONSE 401 ]] || [[ $RESPONSE 403 ]]; then echo ✅ 接口需要认证 $LOG_FILE elif [[ $RESPONSE 200 ]]; then echo ❌ 接口无需认证即可访问 $LOG_FILE echo 安全警告API接口无需认证 | mail -s DeOldify安全警告 $ALERT_EMAIL else echo ⚠️ 认证检查返回状态码: $RESPONSE $LOG_FILE fi # 4. 检查日志文件大小 echo -e \n检查日志文件... $LOG_FILE LOG_DIR/root/cv_unet_image-colorization/logs if [ -d $LOG_DIR ]; then for log_file in $LOG_DIR/*.log; do if [ -f $log_file ]; then size$(du -h $log_file | cut -f1) echo 日志文件 $(basename $log_file): $size $LOG_FILE # 如果日志文件过大超过100MB if [ $(du -m $log_file | cut -f1) -gt 100 ]; then echo ⚠️ 日志文件过大: $log_file $LOG_FILE fi fi done else echo ❌ 日志目录不存在: $LOG_DIR $LOG_FILE fi # 5. 检查磁盘空间 echo -e \n检查磁盘空间... $LOG_FILE DISK_USAGE$(df -h / | tail -1 | awk {print $5} | sed s/%//) if [ $DISK_USAGE -gt 80 ]; then echo ⚠️ 磁盘使用率: ${DISK_USAGE}% $LOG_FILE echo 磁盘空间不足警告 | mail -s 服务器磁盘警告 $ALERT_EMAIL else echo ✅ 磁盘使用率: ${DISK_USAGE}% $LOG_FILE fi echo -e \n 检查完成 \n $LOG_FILE # 保留最近30天的日志 find $(dirname $LOG_FILE) -name *.log -mtime 30 -delete # 设置定时任务每天凌晨2点运行 # crontab -e 添加 # 0 2 * * * /path/to/security_monitor.sh6. 总结构建安全的DeOldify服务6.1 关键安全要点回顾通过这次完整的安全审计我们学到了几个重要的安全原则1. 最小权限原则服务只开放必要的端口使用防火墙限制访问来源运行服务使用非root用户2. 防御深度原则多层安全防护网络层、应用层、数据层输入验证和输出编码定期安全审计和更新3. 监控和响应原则完整的访问日志实时监控和告警应急预案和恢复流程6.2 推荐的部署架构对于生产环境我推荐这样的安全架构┌─────────────────────────────────────────────┐ │ 用户访问 │ │ (HTTPS 认证) │ └─────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 负载均衡器 / Nginx │ │ • HTTPS终止 │ │ • 频率限制 │ │ • 基础认证 │ │ • 访问日志 │ └─────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 应用服务器 │ │ • DeOldify服务 (7860端口) │ │ • JWT认证中间件 │ │ • 输入验证 │ │ • 业务日志 │ └─────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 数据库/存储 │ │ • 用户凭证 │ │ • 访问日志 │ │ • 处理记录 │ └─────────────────────────────────────────────┘6.3 持续安全维护建议安全不是一次性的工作需要持续维护每日检查查看错误日志和访问日志监控服务器资源使用情况检查异常访问模式每周维护更新系统和依赖包备份配置和日志运行安全审计脚本每月审计审查防火墙规则更新API密钥如果使用检查用户权限和访问记录运行完整的安全扫描每季度评估评估当前安全措施的有效性更新安全策略和应急预案进行渗透测试如果条件允许记住安全是一个持续的过程而不是一次性的任务。通过定期审计和监控你可以确保DeOldify服务既好用又安全。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。