土法炼钢兴趣小组的算法知识备份

【零信任安全架构】零信任数据安全:加密、分类与数据访问治理

文章导航

分类入口
architecturesecurity
标签入口
#data-security#encryption-at-rest#data-classification#dlp#kms#hsm#application-level-encryption#zero-trust

目录

零信任讨论的焦点通常在网络层(微分段、mTLS)和身份层(MFA、SPIFFE)。但攻击者的最终目标不是网络,不是身份——是数据。当网络控制和身份验证都失败时(任何安全架构都可能失败),数据本身的保护是最后一道防线。

前置阅读:零信任策略引擎

一、数据层的 Blast Radius 控制

在零信任中,每一层的 blast radius(爆炸半径)都应该被最小化。对于数据层,blast radius 不是”攻击者能访问多少服务器”,而是攻击者能读到多少条数据记录

一个常见的盲区:服务 A 的数据库凭据被泄露了——攻击者用这些凭据连接数据库后能读取多少数据?如果服务 A 只需要访问 users 表,但数据库凭据提供了 SELECT * ON *.* 权限,blast radius 就是整个数据库(可能有几百张表)。

零信任数据安全的第一个原则:数据库授权也应该是最小权限的——每个服务账号只被授予它必要的表和操作权限:

-- 不要: GRANT ALL ON database.* TO 'payment-service';
-- 要:
GRANT SELECT, INSERT, UPDATE ON payment.transactions TO 'payment-service';
GRANT SELECT ON payment.users TO 'payment-service';
-- payment-service 不能访问 payment.audit_logs,
-- 也不能访问 user_service.profiles

二、应用层加密 vs 存储层加密

存储层加密(全盘加密、LUKS/dm-crypt、AWS EBS 加密)保护的是物理介质被窃取的场景——硬盘被从数据中心偷走,数据不可读。但它不保护运行中的系统——当攻击者通过 SQL 注入或凭据泄露获得了数据库的读取权限时,数据库服务会自动解密磁盘上的数据并返回明文结果。

应用层加密(Application-Level Encryption, ALE)在数据进入数据库之前就被应用代码加密了——数据库存储的是密文,即使是数据库管理员也无法直接读取:

// 应用层加密: 在写入数据库之前加密敏感字段
encryptedSSN, _ := kms.Encrypt(ctx, user.SSN, dataKey)
db.Exec("INSERT INTO users (name, ssn_encrypted) VALUES (?, ?)", user.Name, encryptedSSN)

// 读取时解密
rows, _ := db.Query("SELECT ssn_encrypted FROM users WHERE id = ?", userID)
var encryptedSSN []byte
rows.Scan(&encryptedSSN)
plainSSN, _ := kms.Decrypt(ctx, encryptedSSN, dataKey)

应用层加密的代价很高——你不能对加密的数据做 WHERE ssn = '123-45-6789' 查询(因为相同的明文用不同的 IV 会加密为不同的密文)。解决方案是盲索引(Blind Index)——在数据旁边存储一个单向哈希,允许等值查询但不能解密:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    ssn_encrypted VARBINARY(256),  -- 密文
    ssn_blind_idx VARBINARY(32)    -- HMAC(ssn, blind_index_key)
);
-- 查询: SELECT * FROM users WHERE ssn_blind_idx = HMAC('123-45-6789', blind_index_key)

零信任的数据安全取舍:应用层加密提供了最强的保护(即使数据库完全被攻破,数据也不可读),但代价是查询能力受限、性能下降(每个字段的加密/解密开销)、以及密钥管理的复杂度。

三、数据分类标签

数据分类是授权决策细化的基础——不是”这个人能不能访问数据库”,而是”这个人能不能访问标记为 PII 的数据”。

数据分类标签的层级:

标签 含义 访问要求
PUBLIC 公开数据 无限制
INTERNAL 内部数据 已认证用户
CONFIDENTIAL 机密数据(财务、商业计划) 特定组 + Trusted 设备
RESTRICTED 受限数据(PII、SSN、健康记录) 特定角色 + Trusted + Step-up MFA + 审计日志

数据分类的系统化实现需要在数据创建或接收时自动打标签:

四、密钥管理的零信任化

零信任的最后一层是密钥管理——加密数据的最强形式依赖于密钥,如果密钥本身被攻击者获取,前面的所有加密都无效。

DEK 和 KEK 的分离

DEK 在应用内存中可用,但 DEK 的密文(被 KEK 加密后的 DEK)存储在数据库中与数据一起。即使数据库被完全导出,攻击者也看不到 DEK 的明文——因为 KEK 在 HSM 里,且 HSM 的访问受到严格的身份和授权控制。

KMS 的访问控制应使用零信任原则: - 每次密钥操作(加密/解密)都需要验证调用者的身份(SPIFFE ID) - 调用者只能操作它的 DEK,任何尝试解封其他服务的 KEK 的操作被拒绝 - 所有 KMS 操作写入不可篡改的审计日志

五、总结

零信任数据安全的三层结构:

  1. 数据库授权层:最小权限原则——每个服务账号只被授予必要的表和操作权限
  2. 应用加密层(可选,根据数据敏感度):应用层加密(ALE)——数据库存储的是密文
  3. 密钥管理层:DEK/KEK 分离 + KMS/HSM 强制身份验证——密钥本身是零信任保护的

三个层次独立工作——即使攻击者越过了数据库授权(通过窃取凭据),应用层加密使数据不可读。即使应用层加密的 DEK 被从内存中提取(通过内存 dump),DEK 被 KEK 包裹,而 KEK 在 HSM 中且需要独立身份验证。


下一篇:SaaS 与云原生的零信任

参考资料

  1. NIST SP 800-53. Security and Privacy Controls for Information Systems and Organizations.
  2. HashiCorp. Vault Encryption as a Service. https://developer.hashicorp.com/vault/docs/secrets/transit
  3. AWS. AWS Key Management Service Cryptographic Details.

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-13 · architecture / security

【身份与访问控制工程】IAM 全景:为什么这是高价值赛道

从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。

2026-06-17 · architecture / security

【身份与访问控制工程】服务身份:mTLS、SPIFFE/SPIRE 与 Workload Identity

前 9 篇讨论的都是'人'的身份——用户怎么登录、怎么验证。但微服务世界中,80% 的 API 调用是服务之间的。服务身份(Workload Identity)是整个 IAM 体系的另一半:mTLS 解决'传输层你是谁',SPIFFE/SPIRE 解决'在平台层你是谁且怎么证明',JWT Profile for OAuth 解决'我怎么拿到一个服务身份的 Token'。本文从这三条线拆解服务身份的工程实现。

2026-06-12 · architecture / security

【零信任安全架构】NIST SP 800-207 架构深度拆解:不只是 7 条原则

NIST SP 800-207 给了零信任最权威的定义,但大多数讨论只复述了 7 条原则。本文拆解 NIST 文档的完整架构模型:PEP、PDP、Policy Engine、Policy Administrator 的分工与交互协议、信任算法的三种模型、以及 NIST 有意留白留给实现者的工程决策。


By .