日志、脱敏与请求加密
# 日志、脱敏与请求加密
# 操作日志和登录日志
租户端有两个只读页面:/system/audit-logs 对应 system:audit-log:read,/system/login-logs 对应 system:login-log:read。可以按 requestId、动作、主体 ID 和时间筛选。没有按任意 ID 修改或删除的接口。
查询本身会再写一条查询留痕。留痕失败返回 503,并且不把已经读到的日志返回给调用方。这次查询留痕不进入当前结果,也不递增授权版本。
当前策略是持续保留。运行中的代码不会按时间删除、覆盖或归档审计,也没有给租户管理员的清理接口。超过六个月的记录仍然可以按权限查询。
姓名在出口脱敏。IP 只返回 IPv4 的 /24 或 IPv6 的 /64。会话标识只返回摘要。历史差异里无法识别的字段显示为已脱敏,不会回退原文。页面把历史 JSON 当文本展示。
# 脱敏模块
fago-security 在 DTO 和日志出口遮盖手机号、邮箱、身份证、银行卡、姓名和各类凭证。数据库里的原值不变,脱敏结果不能用来反查或登录。未知规则和异常格式不会回退成原文。日志使用 RedactingHandler,不要在自由文本里拼接口令、token、Cookie、连接串或完整请求体。
# 生产请求加密
开发与测试默认明文 JSON。生产强制 JWE:前端先请求同源的 GET /api/security/config,按发现的 suite 选择算法,发现失败不降级。缺省套件是 rsa-aes,请求保护头为 RSA-OAEP-256 / A256GCM,响应密钥 32 字节。sm2-sm4 使用 SM2 PKCS#8 PEM,请求保护头为 SM2 / SM4-GCM,SM4 密钥和国密响应密钥都是 16 字节。服务端用 APP_API_ENCRYPTION_SUITE 覆盖 YAML;切换套件必须更换 PEM。客户端不能协商算法。GET 把密文放在 X-Fago-Payload,其他方法使用 application/jose。服务端核对算法、路径、时间窗,并用 Redis 认领请求号。重复或过期请求被拒绝。加密不能代替登录、Origin 和权限检查。SM2 与 SM4 的安全强度按 128 位计。TLCP、口令 SM3 和商用密码产品认证未实现,本页不表示二级等保或商密认证已通过。
响应加密失败时不会改发明文。健康检查和密钥发现本身保持普通 JSON。
字段规则和协议步骤见 配置与数据安全。
OIDC 原始 sub、state、nonce、授权码及 PKCE verifier 在结构化日志/JSON出口全遮盖;业务 code 与 typed subjectId 保持原合同。opaque_id 规则对有界有效 UTF-8 生成域分离 SHA256 范围指纹,异常值返回遮盖符;指纹用于区分,不是匿名化或认证证明。管理规则见 OIDC提供方与外部绑定。
生产环境读取加密配置(明文 JSON,不携带业务数据):
GET /api/security/config
Origin: https://admin.example.com
{
"code": 0,
"data": {
"suite": "rsa-aes",
"keyId": "release-key"
},
"message": "ok",
"requestId": "req_example"
}
发现失败或响应损坏时,前端不得降级为明文业务请求。