基于 APISIX 的一机一密实现方案
-
概述
基于 Apache APISIX 网关的一机一密实现方案,通过自主开发的自定义插件实现设备级别的密钥管理和加密通信。本方案通过扩展 APISIX 的插件机制,实现高可用、可扩展的 API 安全防护。
本方案的主要特点:
-
完全自主开发的插件,可定制化程度高 -
支持设备级别的密钥隔离 -
灵活的密钥生命周期管理 -
可配置的加密策略 -
高性能的数据处理 -
完整的监控和告警机制
-
自定义插件架构
2.1 插件开发概述 本方案包含两个自主开发的 APISIX 自定义插件,通过 APISIX 的插件开发框架实现:
-
device-secret: 自定义设备认证和密钥管理插件
-
优先级: 2600 -
执行阶段: rewrite, header_filter, body_filter -
职责: 设备指纹验证、密钥生成和管理 -
开发语言: Lua -
插件类型: 认证类 -
依赖服务: Redis
-
-
payload-crypto: 自定义请求响应加解密插件
-
优先级: 2500 -
执行阶段: rewrite, header_filter, body_filter -
职责: 数据加密解密、密文传输处理 -
开发语言: Lua -
插件类型: 数据处理类 -
依赖模块: lua-resty-crypto
-
2.2 插件交互流程
sequenceDiagram
participant Client
participant APISIX
participant device-secret
participant payload-crypto
participant Backend
Client->>APISIX: 发送请求
APISIX->>device-secret: 设备认证
device-secret->>Redis: 获取/更新密钥
device-secret-->>APISIX: 认证结果
APISIX->>payload-crypto: 数据解密
payload-crypto-->>APISIX: 解密结果
APISIX->>Backend: 转发请求
交换秘钥
接口加密
-
核心功能实现
3.1 设备认证 (device-secret)
-
基于 APISIX ctx 上下文管理设备信息 -
设备标识符生成规则 -
设备状态管理 -
会话信息缓存
-
-
使用 Redis 存储设备密钥 -
密钥格式: device:{id}:secret -
数据结构: Hash -
字段设计: secret, created_at, expires_at
-
-
支持密钥自动续期 -
续期触发条件 -
续期策略配置 -
过期处理机制
-
-
设备指纹验证 -
硬件信息采集 -
指纹算法实现 -
防重放机制
-
3.2 数据加密 (payload-crypto)
-
AES-256-CBC 加密模式 -
密钥派生函数 -
IV 生成策略 -
填充方案
-
-
动态 IV 生成 -
随机性保证 -
IV 传输方案
-
-
分块加密支持 -
块大小配置 -
流式处理 -
内存优化
-
-
加密标记头 -
版本标识 -
算法标识 -
元数据设计
-
-
APISIX 路由配置
4.1 插件启用配置示例
routes:
- uri: /api/*
plugins:
device-secret:
redis_host: "redis"
redis_port: 6379
redis_database: 0
key_expire_time: 86400
device_header: "X-Device-ID"
secret_header: "X-Device-Secret"
auto_renew: true
renew_threshold: 3600
payload-crypto:
encrypt_response: true
encrypt_request: true
algorithm: "aes-256-cbc"
block_size: 16384
iv_header: "X-Crypto-IV"
error_status: 400
-
数据流转过程
5.1 请求处理详细流程
-
APISIX 接收请求 -
解析请求头部 -
提取设备信息 -
初始化上下文
-
-
device-secret 插件验证设备 -
验证设备指纹 -
检查密钥有效性 -
更新设备状态
-
-
payload-crypto 插件解密数据 -
提取加密参数 -
执行解密操作 -
验证数据完整性
-
-
转发到上游服务 -
重组请求体 -
添加内部头部 -
执行负载均衡
-
// ... (继续补充后续章节)
-
插件开发说明
6.1 自定义插件开发环境
-
APISIX 版本要求: 3.x -
开发语言: Lua -
依赖模块: -
lua-resty-redis -
lua-resty-crypto -
lua-resty-http -
lua-resty-jwt
-
-
测试框架: Test::Nginx -
开发工具: -
LuaRocks -
OpenResty -
Docker
-
6.2 device-secret 插件(自研)
-- 插件位置: /apisix/plugins/device-secret.lua
local plugin_name = "device-secret"
local schema = {
type = "object",
properties = {
redis_host = {type = "string"},
redis_port = {type = "integer"},
key_expire_time = {type = "integer", minimum = 60},
-- 其他配置项...
},
required = {"redis_host", "redis_port"}
}
local _M = {
version = 0.1,
priority = 2600,
name = plugin_name,
schema = schema
}
-- 核心方法示例
function _M.rewrite(conf, ctx)
-- 设备认证逻辑
end
return _M
6.3 payload-crypto 插件(自研)
-- 插件位置: /apisix/plugins/payload-crypto.lua
local plugin_name = "payload-crypto"
local schema = {
type = "object",
properties = {
encrypt_response = {type = "boolean", default = true},
encrypt_request = {type = "boolean", default = true},
algorithm = {type = "string", enum = {"aes-256-cbc"}},
-- 其他配置项...
}
}
local _M = {
version = 0.1,
priority = 2500,
name = plugin_name,
schema = schema
}
-- 核心方法示例
function _M.rewrite(conf, ctx)
-- 加解密逻辑
end
return _M
-
性能优化
7.1 APISIX 层面
-
使用 ctx 缓存设备信息 -
减少 Redis 访问频率 -
优化内存使用 -
合理设置缓存时间
-
-
复用 Redis 连接 -
连接池配置 -
心跳检测 -
自动重连机制
-
-
优化插件执行顺序 -
合理设置优先级 -
避免重复操作 -
减少上下文切换
-
-
启用 APISIX 内置缓存 -
路由缓存 -
DNS 缓存 -
配置缓存
-
7.2 插件层面
-
密钥缓存机制 -
本地缓存策略 -
缓存失效策略 -
并发控制
-
-
加密算法优化 -
预分配内存 -
批量处理 -
异步处理
-
-
分块处理优化 -
动态块大小 -
流式处理 -
内存复用
-
-
错误快速返回 -
参数预检 -
异常处理 -
降级策略
-
-
监控与维护
8.1 APISIX 监控指标
-
插件执行耗时 apisix_plugin_latency_ms{plugin="device-secret"} apisix_plugin_latency_ms{plugin="payload-crypto"}
-
请求处理延迟 apisix_http_latency_ms{type="request"}
-
错误率统计 apisix_plugin_error_total{plugin="device-secret"} apisix_plugin_error_total{plugin="payload-crypto"}
-
QPS 监控 apisix_http_requests_total{route="device_auth"}
8.2 插件监控告警
-
密钥交换成功率 -
阈值设置: < 95% 告警 -
监控周期: 5分钟 -
告警级别: P2
-
-
加解密性能 -
延迟阈值: > 100ms 告警 -
CPU 使用率: > 80% 告警 -
内存使用: > 90% 告警
-
-
Redis 连接状态 -
连接失败率: > 1% 告警 -
响应延迟: > 50ms 告警 -
连接池使用率: > 80% 告警
-
-
设备认证统计 -
认证失败率: > 5% 告警 -
并发认证数: > 1000 告警 -
异常设备数: > 100 告警
-
-
安全建议
9.1 APISIX 安全配置
-
启用 SSL 终止 ssl:
cert: /path/to/cert.pem
key: /path/to/key.pem
protocols: ["TLSv1.2", "TLSv1.3"]
ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256" -
配置访问控制 plugins:
ip-restriction:
whitelist:
- "10.0.0.0/8"
limit-req:
rate: 100
burst: 50 -
启用限流插件 -
配置错误处理
9.2 插件安全配置
-
密钥管理 -
密钥轮换周期: 24小时 -
密钥长度: 256位 -
存储加密: AES-GCM
-
-
访问控制 -
设备白名单 -
接口权限 -
请求频率限制
-
-
审计日志 -
操作记录 -
异常记录 -
安全事件
-
-
注意事项
10.1 开发注意事项
-
确保插件优先级正确设置 -
注意内存使用和垃圾回收 -
处理所有可能的异常情况 -
避免阻塞操作影响性能
10.2 运维注意事项
-
监控 Redis 性能和容量 -
定期检查日志和告警 -
及时更新插件版本 -
做好容灾和备份
10.3 安全注意事项
-
定期进行安全审计 -
及时修复安全漏洞 -
做好密钥管理 -
防范常见攻击
-
插件维护
11.1 版本管理
-
版本号规范 -
主版本号: 不兼容的API修改 -
次版本号: 向下兼容的功能性新增 -
修订号
-
本文由 mdnice 多平台发布