静态脱敏系统身份认证方案
一份能过审计的静态脱敏系统身份认证方案,要管住的不只是脱敏规则,而是发起作业的那个身份。某制造企业有一条固定流程:把生产库的副本先脱敏,再交给测试团队用。去年一次内部检查发现,有人用一个测试库账号直接连到脱敏系统的源库配置页面,把一份还没脱敏的客户名单导了出去。复盘时才发现,脱敏系统本身「谁在操作、能碰哪些库」这件事,从来没有被单独管过------大家都在关心脱敏算法准不准,没人问过「执行脱敏的是谁」。
坐标先立:脱敏是数据处理里承上启下的一段。GB/T 37964《信息安全技术 个人信息去标识化指南》关注的是去标识化后数据还能不能被重新识别;GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》在身份鉴别与访问控制两项上要求账户按最小权限分配、及时清理多余或过期账户;GB/T 39786《信息安全技术 信息系统密码应用基本要求》把身份鉴别列为四个层面之一。本文切入的是最容易被当成算法问题的那一块------静态脱敏系统身份认证方案到底要管住哪几类身份,才经得起一次核查。
01 | 静态脱敏系统身份认证方案这件事,难在哪儿
难点不在「脱敏算法准不准」,而在算法之外那些说不清的地方。下面五处是最常被核查点到的。
首要难在把脱敏当成一道算法题。 一提脱敏,讨论立刻集中在规则怎么配、字段怎么替换。可真正把整份客户名单搬走的那次事故,问题不在算法,而在于「谁有权接触源库」。合规审计中如何应用静态脱敏系统,往往也从这一步开始:先问谁动了数据,再问数据被怎么处理。
其次难在发起作业的往往不是人。 脱敏作业多数由调度器定时发起,用的是一把服务账号凭据,而不是某个员工的登录。这把凭据如果和自然人共用一套权限,那么「谁执行了这次脱敏」在事后根本无法还原。登录认证中如何应用静态脱敏系统,指的正是这条从凭据到执行者的链路要能对上。
再有一处难在作业账号权限过大。 为了让脱敏跑通,很多团队给作业账号同时开了源库的读权限和目标库的写权限,甚至顺手给了生产库。一旦这把凭据泄露,攻击者拿到的不是一个脱敏工具,而是一把能横穿多个库的钥匙。
第四处难在作业令牌一签就是长期有效。 一次授权配置好,凭据就在那里放着,一年也不换。作业本身只跑几十分钟,凭据却长期挂着,暴露面被无谓地放大。身份认证中如何应用静态脱敏系统,一个绕不开的动作就是让凭据的有效期对齐作业时长。
最后一处难在作业记录只有日志、没有台账。 日志是流水,能证明「发生过一次访问」;台账是结论,要能回答「这一批处理了多少行、列、从哪个库到哪个库、由谁发起」。两者不能互相替代,只留日志的团队在核查时会发现,能拼出过程却给不出结论。
把这五处串起来看,核心矛盾是:核查要的是「抽一次作业能复算」,而现实给的往往是「一段说不清是谁发起的处理过程」。
02 | 机制拆解:静态脱敏系统身份认证方案的四条线
一套能被核对的静态脱敏系统身份认证方案,通常围绕四条线组织:身份谱系线、授权边界线、作业时效线、证据留痕线。四条线指向四个不同的问题,缺一条就会在某一类追问上卡住。
| 线 | 回答的问题 | 核对方式 | 缺了会怎样 |
|---|---|---|---|
| 身份谱系线 | 这次作业是谁发起的 | 三类主体凭据分离、各成一路 | 执行者无法还原 |
| 授权边界线 | 这个身份能碰哪些库 | 只读源库、只写目标库,越界即拒 | 一把凭据横穿多库 |
| 作业时效线 | 这次授权能用到什么时候 | 令牌绑定作业、一次性、到期即失效 | 凭据长期挂着 |
| 证据留痕线 | 这批数据到底处理了什么 | 台账整体签名,行数列数入库 | 只留流水、给不出结论 |
四条线的边界要讲清楚:身份谱系线管的是「你是谁」,授权边界线管的是「你能碰什么」,作业时效线管的是「这份权限多久作废」,证据留痕线管的是「做完之后留下什么」。四者要落在同一个作业编号上------身份有名称、授权有作用域、令牌带到期时刻、台账引用前面三者的摘要,同一条链路才对得上。这也是身份认证中如何应用静态脱敏系统里最先要理清的一层。
静态脱敏系统身份认证方案的身份谱系
脱敏系统里通常同时住着三类主体:自然人操作员、长期在位的服务账号、按批次生成的作业调度身份。三者的凭据必须各成一路,谁也不能替谁签。梳理身份谱系的第一步不是列人名,而是先把这三类分开------用服务账号的凭据签不出自然人会话,用自然人的登录签不动作业令牌。这一步做完,「谁发起了这次脱敏」才有确定答案。登录认证中如何应用静态脱敏系统,第一步也落在同一处:先把三类主体的凭据分开。
静态脱敏系统身份认证方案的授权边界
授权要回答的是「能碰哪些库」。作业身份的理想形状是单向的:对源库只读、对目标库只写,任何跨库的读写都判为越界。最容易出问题的是「为了让作业一次跑通」而顺手放宽------给作业账号同时开读和写,甚至给它生产库。正确的做法是把授权写成「主体加资源加动作加效力」的条目,显式拒绝优先,没有匹配条目一律拒绝,这样新增的库天然处于关闭状态。
静态脱敏系统身份认证方案的作业时效
作业往往只跑几十分钟,凭据却常常长期有效,这是暴露面被无谓放大的根源。做法是让令牌与作业绑定:令牌里写清作业编号、作用域与到期时刻,整体签名,并且一次性使用------同一作业令牌用过即作废,重放直接被拒。这样「这次授权能用到什么时候」就有了确定答案,而不是取决于凭据被配置成多久过期。
静态脱敏系统身份认证方案的证据留痕
留痕要能回答「处理了什么」。台账里要有作业编号、行数、列数、源库、目标库、发起主体与执行服务账号,并把整条台账整体签名。日志负责证明过程,台账负责给出结论,两者分工明确。台账一旦签名,改一个行数就会在核对时暴露,而不是等到季度审计才发现对不上。
下面这张图说明四条线在一次脱敏作业里的位置关系:
text
[身份谱系] 操作员 / 服务账号 / 作业调度 --> 三类凭据分离 --> [谁发起 = 可还原]
|
v
[授权边界] 主体+资源+动作+效力 --> 显式拒绝优先 --> 无匹配即拒绝 --> [跨库即拒]
|
v
[作业时效] 作业号+作用域+到期时刻 --> [令牌整体签名] --> [一次性/到期即失效]
|
v
[证据留痕] 行数+列数+源库+目标库 --> [台账整体签名] --> [改一格即验签失败]
|
v
[核查] 验令牌 + 复算一条授权 + 验台账 --> [三项一致即通过]
03 | 先跑通:静态脱敏系统身份认证方案的四个验证点
下面这段演示把身份谱系、授权边界、作业令牌与台账签名串在同一段代码里跑一遍,用的是公开算法:SM2 签名、SM3 摘要、SM4 分组加密。代码只依赖 gmssl,可以直接复现。
python
# -*- coding: utf-8 -*-
"""
W39 Day5 #2 · 静态脱敏系统身份认证方案
演示身份可分:三类主体(操作员/服务账号/作业调度)凭据分离 / 授权边界与越界拒绝 /
作业令牌时效与一次性 / 作业台账整体签名 / 按主体派生会话密钥 / 写入报文加密
"""
from gmssl import sm2, sm4, sm3, func
# ---- 固定私钥(已过 xxcsdn_keycheck.py 三关) ----
PRIV_LEDGER = "7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab" # 作业台账签发方
PRIV_JOB = "5b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d0" # 作业令牌签发方
PRIV_FORGE = "4d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c72" # 冒名方
FIXED_K = "0101010101010101010101010101010101010101010101010101010101010101"
def pub_of(priv: str) -> str:
"""P = d·G。gmssl 不会从私钥派生公钥,必须显式算出再传给 CryptSM2。"""
return sm2.CryptSM2(private_key=priv, public_key="")._kg(
int(priv, 16), sm2.default_ecc_table["g"])
PUB_LEDGER, PUB_JOB = pub_of(PRIV_LEDGER), pub_of(PRIV_JOB)
PUB_FORGE = pub_of(PRIV_FORGE)
def sm3_hex(data: bytes) -> str:
return sm3.sm3_hash(func.bytes_to_list(data))
# ---- 手写 SM4-CBC:gmssl 的 crypt_cbc 有缺陷,one_round 是 16 进 16 出的单块运算 ----
def sm4_cbc(key: bytes, iv: bytes, data: bytes, enc: bool) -> bytes:
assert len(key) == 16, "SM4 KEY 必须 16 字节"
assert len(iv) == 16, "IV 必须 16 字节(少一字节会 IndexError)"
c = sm4.CryptSM4()
c.set_key(key, sm4.SM4_ENCRYPT if enc else sm4.SM4_DECRYPT)
out, prev = b"", iv
for i in range(0, len(data), 16):
blk = data[i:i + 16]
if enc:
x = bytes(a ^ b for a, b in zip(blk, prev))
e = bytes(c.one_round(c.sk, list(x)))
out += e
prev = e
else:
d = bytes(c.one_round(c.sk, list(blk)))
out += bytes(a ^ b for a, b in zip(d, prev))
prev = blk
return out
def pkcs7_pad(data: bytes, block: int = 16) -> bytes:
pad = block - (len(data) % block)
return data + bytes([pad]) * pad
def pkcs7_unpad(data: bytes) -> bytes:
pad = data[-1]
if not (1 <= pad <= 16):
return data
return data[:-pad]
def decrypt_or_none(key: bytes, iv: bytes, ct: bytes):
try:
return pkcs7_unpad(sm4_cbc(key, iv, ct, False))
except Exception: # noqa: BLE001
return None
def dec_is(key: bytes, iv: bytes, ct: bytes, plain: bytes) -> bool:
"""判据是「还不出原文」,不能写 `is None`(用错密钥通常不抛异常)。"""
return decrypt_or_none(key, iv, ct) == plain
# ======================================================================= #
# 业务逻辑区
# ======================================================================= #
MASTER = b"MASTER-KEY-FOR-SDM-AUTH-2026"
IV = b"16BYTEIVFORSDM01" # 16 字节,数过
assert len(IV) == 16
NOW = "20261010T1200" # 演示用的时间基准,固定值保证可复现
# 三类主体:自然人操作员、服务账号、作业调度身份,凭据各成一路
SUBJ_OP, SUBJ_SVC, SUBJ_JOB = "op:1007", "svc:masking", "job:20261010-01"
# 授权表:主体|资源|动作|效力。作业身份只读源库、只写目标库,生产库一律拒。
POLICY = (
"op:1007|db:hr_src|read|allow;"
"op:1007|db:prod|write|deny;"
"svc:masking|db:mask_dst|write|allow;"
"svc:masking|db:prod|read|deny"
)
def parse_policy(text: str):
return [tuple(item.split("|")) for item in text.split(";")]
def authorize(rules, subj, res, act) -> bool:
"""显式 deny 优先;无匹配条目则默认拒绝。"""
hit = [e for (s, r, a, e) in rules if s == subj and r == res and a == act]
if not hit:
return False
return hit[0] == "allow"
def subject_key(master: bytes, subj: str) -> bytes:
"""按「主密钥 + 主体」派生 16 字节会话密钥,三类主体互不相同。"""
return bytes.fromhex(sm3_hex(master + b"|subj=" + subj.encode("utf-8"))[:32])
# --- 1) 作业台账整体签名:行数、列数、主体、源目标库一并受保护 ---
LEDGER = ("job=20261010-01|rows=128400|cols=37|"
"op=op:1007|svc=svc:masking|src=db:hr_src|dst=db:mask_dst")
ledger_signer = sm2.CryptSM2(public_key=PUB_LEDGER, private_key=PRIV_LEDGER)
h_lg = sm3_hex(LEDGER.encode("utf-8"))
sig_lg = ledger_signer.sign(h_lg.encode("utf-8"), FIXED_K)
ok_ledger = ledger_signer.verify(sig_lg, h_lg.encode("utf-8"))
ledger_tam = LEDGER.replace("rows=128400", "rows=98200")
ok_ledger_tamper = not ledger_signer.verify(
sig_lg, sm3_hex(ledger_tam.encode("utf-8")).encode("utf-8"))
forge = sm2.CryptSM2(public_key=PUB_FORGE, private_key=PRIV_FORGE)
sig_lg_forge = forge.sign(h_lg.encode("utf-8"), FIXED_K)
ok_ledger_imposter = not ledger_signer.verify(sig_lg_forge, h_lg.encode("utf-8"))
# --- 2) 授权边界:操作员只读源库;服务账号只写目标库;越界一律拒绝 ---
rules = parse_policy(POLICY)
ok_op_read = authorize(rules, SUBJ_OP, "db:hr_src", "read") is True
ok_op_cross = authorize(rules, SUBJ_OP, "db:prod", "write") is False
ok_svc_write = authorize(rules, SUBJ_SVC, "db:mask_dst", "write") is True
ok_svc_cross = authorize(rules, SUBJ_SVC, "db:prod", "read") is False
# --- 3) 作业令牌:绑定作业号、作用域与到期时刻,整体签名,一次性 ---
job_signer = sm2.CryptSM2(public_key=PUB_JOB, private_key=PRIV_JOB)
token = ("job=20261010-01|scope=db:hr_src,db:mask_dst|nonce=N7F3|exp=20261010T1400")
h_jt = sm3_hex(token.encode("utf-8"))
sig_jt = job_signer.sign(h_jt.encode("utf-8"), FIXED_K)
ok_token = job_signer.verify(sig_jt, h_jt.encode("utf-8"))
_used = set()
def issue(nonce: str) -> bool:
"""一次性作业令牌:同一 nonce 只能用一次,重放即失效。"""
if nonce in _used:
return False
_used.add(nonce)
return True
ok_nonce_first = issue("N7F3") is True
ok_nonce_replay = issue("N7F3") is False
ok_token_expired = not ("20261010T1100" > NOW) # 作业结束后令牌判失效
# --- 4) 按主体派生会话密钥:三类主体互不相同,主密钥轮换后变化 ---
k_op, k_svc = subject_key(MASTER, SUBJ_OP), subject_key(MASTER, SUBJ_SVC)
ok_derive_len = len(k_op) == 16
ok_derive_diff = k_op != k_svc
ok_derive_rotate = k_op != subject_key(b"NEW-MASTER-KEY-FOR-SDM-AUTH", SUBJ_OP)
# --- 5) 目标库写入报文加密落盘 ---
payload = (f"dst=db:mask_dst|{SUBJ_JOB}|rows=128400|batch=B2026101001").encode("utf-8")
ct = sm4_cbc(k_svc, IV, pkcs7_pad(payload), True)
ok_enc = dec_is(k_svc, IV, ct, payload)
asserts = [
("作业台账整体签名验签通过", ok_ledger),
("台账行数被改后签名被拒", ok_ledger_tamper),
("冒名方签名作业台账被拒", ok_ledger_imposter),
("操作员读取源库被放行", ok_op_read),
("操作员跨写生产库被拒绝", ok_op_cross),
("服务账号写目标库被放行", ok_svc_write),
("服务账号跨读生产库被拒绝", ok_svc_cross),
("作业令牌整体签名验签通过", ok_token),
("同一作业令牌不可重放", ok_nonce_replay),
("作业结束后令牌判定失效", ok_token_expired),
("按主体派生会话密钥为 16 字节", ok_derive_len),
("不同主体派生密钥不同", ok_derive_diff),
("主密钥轮换后派生值变化", ok_derive_rotate),
("目标库写入报文加密可解密还原", ok_enc),
]
# 首行必须是 '='*60:脚本靠它把「demo 输出块」与「ASCII 机制图」区分开
print("=" * 60)
for t, ok in asserts:
print(f"[{t}] = {'True' if ok else 'False'}")
text
============================================================
[作业台账整体签名验签通过] = True
[台账行数被改后签名被拒] = True
[冒名方签名作业台账被拒] = True
[操作员读取源库被放行] = True
[操作员跨写生产库被拒绝] = True
[服务账号写目标库被放行] = True
[服务账号跨读生产库被拒绝] = True
[作业令牌整体签名验签通过] = True
[同一作业令牌不可重放] = True
[作业结束后令牌判定失效] = True
[按主体派生会话密钥为 16 字节] = True
[不同主体派生密钥不同] = True
[主密钥轮换后派生值变化] = True
[目标库写入报文加密可解密还原] = True
逐段读一下这段代码在验什么。前三条验作业台账:整条台账(作业号、行数、列数、发起主体、源库、目标库)整体签名能验过;把行数由 128400 改成 98200 后签名立刻被拒;换一把私钥来签同样不被接受。第四到七条验授权边界:操作员读源库被放行,跨去写生产库被拒;服务账号写目标库被放行,跨去读生产库被拒------这四条说明「能碰哪些库」不是靠约定,而是每次判定都要过一遍条目。第八到十条验作业令牌:令牌整体签名能验过,同一个令牌用过一次就作废、重放直接被拒,早于时间基准的令牌被直接判失效。最后四条验派生与落盘:按主体派生出的会话密钥是 16 字节,三类主体彼此不同,主密钥轮换后派生值跟着变,目标库的写入报文加密后仍能还原。
现场演示时最能说明问题的不是「签名验过」,而是第六条和第九条:服务账号试图跨读生产库被判拒绝,说明授权边界是逐条判定的,而不是「给了一把钥匙就随便开」;作业令牌用过即作废,说明一次授权只对应一次作业,而不是一把长期挂着的凭据。这两条把「最小必要」和「一次性」从制度要求变成了当场能跑出来的结果。
要注意一处工程细节:演示里用的是固定 K 的 SM2 签名,目的是让每次输出一致、便于复现;真实系统里签名随机数必须由密码模块内部产生,同一私钥配同一个 K 会泄露私钥,这一点在技术评审时经常被追问。
04 | 落地动作:静态脱敏系统身份认证方案分四条线怎么做
身份谱系线,动作是把操作员、服务账号、作业调度身份三类主体分开登记,各自持有独立凭据。验收点:服务账号的凭据签不出自然人会话,自然人登录也签不动作业令牌。
授权边界线,动作是把作业身份的授权写成条目,源库只读、目标库只写,跨库一律拒绝。验收点:拿作业身份去读生产库必须被拒;新增一个库时若未显式放行,默认应当关闭。这一步做扎实,静态脱敏系统身份认证方案才算把「能碰什么」这条线立住。
作业时效线,动作是让令牌与作业绑定,写清作业编号、作用域与到期时刻并整体签名,一次性使用。登录认证中如何应用静态脱敏系统所需要的「一次一凭据」,正是靠这条约束落地。验收点:同一个令牌用第二次必须失败;作业结束后的令牌必须判失效。
证据留痕线,动作是把每次作业的编号、行数、列数、源库、目标库、发起主体收进台账并整体签名。验收点:改台账里任意一格,验签必须失败;拿一个作业编号,必须能查出这一批处理了多少行。
整改样本(某制造企业)。 背景:测试前的脱敏流程里,作业账号同时持有源库读权限与生产库读权限;凭据配置后长期不换;事故发生后只能翻日志,说不清是谁发起的。动作:先把三类主体分开登记、各自发凭据(三周);再把作业账号的权限收成「源库只读加目标库只写」,跨库一律拒绝(四周);随后给令牌加上作业绑定、到期时刻与一次性约束(三周);最后把每次作业收成带签名的台账并接入核对流程(三周)。结果:抽查任意一次脱敏,团队能当场说清是谁发起、碰了哪些库、处理了多少行;作业账号即便泄露,也拿不到一份未脱敏的原始数据。整个整改周期约三个月,主要工作量在把散落的库权限重新梳理成条目。
05 | 避坑清单:静态脱敏系统身份认证方案的 9 条常见坑
踩得最多的坑按后果严重度排序如下。判断是否避开,靠的是当场能跑出来的结果,而不是流程文档里写过。
| # | 坑 | 后果 | 怎么验证避开了 |
|---|---|---|---|
| 1 | 只谈脱敏规则不管执行身份 | 谁动过数据说不清 | 三类主体分开登记 |
| 2 | 服务账号与自然人共用权限 | 执行者无法还原 | 两类凭据互不通用 |
| 3 | 作业账号同时读写多库 | 一把凭据横穿多库 | 源库只读、目标库只写 |
| 4 | 跨库访问默认放行 | 生产库被顺手读到 | 无匹配条目一律拒绝 |
| 5 | 作业令牌长期有效 | 暴露面被无谓放大 | 到期即失效 |
| 6 | 令牌可重复使用 | 一次授权被反复用 | 同一令牌用过即作废 |
| 7 | 只留日志不留台账 | 给不出结论 | 台账带行数列数并签名 |
| 8 | 台账只存不签名 | 事后可被改 | 改一格即验签失败 |
| 9 | 会话密钥全局共用 | 一处泄露处处可用 | 按主体派生互不相同 |
展开说第 3 条。作业账号同时持有多个库的读写权限,是最常见、也最容易被合理化的一条:为了让脱敏一次跑通,配权限的人会把源库、目标库、有时还有临时库一起开给同一把凭据。代价是这把凭据一旦泄露,攻击者拿到的不是脱敏工具,而是一把能横穿这些库的钥匙。正确做法是把授权收成「源库只读、目标库只写」两条,跨库一律拒绝------合规审计中如何应用静态脱敏系统,检验的正是这条边界是不是真的成立。
06 | 合规视角:静态脱敏系统身份认证方案要对上哪些要求
网络安全等级保护。 GB/T 22239-2019 对身份鉴别与访问控制有明确要求:应授予管理用户所需的最小权限、应及时删除或停用多余的与过期的账户、应防止鉴别信息被窃听。落到本文场景,就是四件事------三类主体分开、作业身份最小权限、凭据到期即失效、鉴别信息走加密通道。合规审计中如何应用静态脱敏系统,通常也是从这四条入手。
商用密码应用安全性评估。 GB/T 39786 把身份鉴别列为四个层面之一,关注鉴别过程本身能不能被核对。落到脱敏作业,就是三条动作:令牌整体签名保完整性、按主体派生密钥保访问控制、台账整体签名保数据完整性。身份认证中如何应用静态脱敏系统,落到密评就是鉴别过程本身要能被核对。测评会追问算法、密钥存放位置与轮换周期。
个人信息去标识化。 GB/T 37964 关注的是去标识化之后的数据还能不能被重新识别。这条要求把「脱敏做得准不准」和「谁能碰脱敏前的数据」绑在一起------如果执行身份管不住,算法再严谨也挡不住一份原始名单被直接导出。
个人信息保护法的一般要求。 处理个人信息应遵循最小必要原则。落到本文场景,就是只取做脱敏所必需的那几项字段与那几行数据,并且把「谁有权在什么条件下触碰原始数据」写成可核对的条目,而不是靠一句内部通知。
07 | 落地答案:静态脱敏系统身份认证方案怎么承接
静态脱敏系统身份认证方案的落地,落到产品能力上通常这样组合四段。评估顺序建议倒过来:先看一次作业能不能被复算,再看支持多少种脱敏规则------复算不上,规则再多也只是一份处理清单。
身份谱系这一段,需要的能力是「多类主体分别登记与凭据分离」。操作员、服务账号、作业调度身份各持独立凭据,签出的凭证互不通用;这样「谁发起了这次作业」才是可还原的。安当在这一段提供的能力落在凭据登记与鉴别上,关键词是「可还原」。
授权边界这一段,需要的能力是「条目化授权与缺省拒绝」。作业身份按主体、资源、动作、效力四要素授权,源库只读、目标库只写,跨库一律拒绝;新增库默认关闭,要开必须显式写一条。登录认证中如何应用静态脱敏系统,靠的正是这条边界能把作业身份限制在最小范围内。
作业时效这一段,需要的能力是「令牌签名加一次性加到期失效」。令牌与作业绑定,用过即作废,到期自动失效;这样凭据的暴露面被收窄到一次作业的时长,而不是长期挂着。合规审计中如何应用静态脱敏系统,同样会追问这份凭据的有效期是不是对齐了作业时长。
证据留痕这一段,需要的能力是「作业台账整体签名」。每次作业的编号、行数、列数、源库、目标库、发起主体一并入库并签名,改一格即失败。身份认证中如何应用静态脱敏系统,最后都要落到这条能交得出去的台账上。
08 | 验收清单与下一步
上线前建议逐项过一遍这张表,任何一项答不上来就不要接受「脱敏已经做好了」的结论。
| # | 验收项 | 通过标准 |
|---|---|---|
| 1 | 主体分类登记 | 三类主体各自成册 |
| 2 | 凭据分离 | 两类凭据互不通用 |
| 3 | 执行者可还原 | 从作业号能查到发起主体 |
| 4 | 最小权限 | 作业身份仅限源库读 |
| 5 | 目标库限写 | 作业身份仅限目标库写 |
| 6 | 缺省拒绝 | 无匹配条目一律拒绝 |
| 7 | 显式拒绝优先 | 拒绝条目覆盖放行条目 |
| 8 | 令牌绑作业 | 令牌内含作业编号与作用域 |
| 9 | 令牌整体签名 | 改一个字即验签失败 |
| 10 | 令牌一次性 | 用过即作废 |
| 11 | 令牌有时效 | 到期即失效 |
| 12 | 台账带规模 | 行数、列数入库 |
| 13 | 台账整体签名 | 改一格即验签失败 |
| 14 | 主密钥保护 | 在硬件密码机内、无明文副本 |
| 15 | 会话密钥派生 | 不同主体密钥不同 |
| 16 | 落盘加密 | 写入报文密文与明文不同 |
趋势上看,静态脱敏系统身份认证方案的重心,正在从「规则配得全不全」走向「一次作业能不能被复算」。过去交一份脱敏规则清单就算交差;现在核查会随机抽一次作业,要求团队当场说清是谁发起、碰了哪些库、处理了多少行。这个迁移对平台的实质要求是:身份、授权、时效、台账四件事必须落在同一个作业编号上,而这是整套脱敏流程能不能经得起核查的起点。
下一篇预告:同一工作日的另一篇,我们转到另一类系统,看防勒索系统合规审计------为什么「有没有备份」和「备份能不能被验证」,在审计里是两件不同的事。
09 | 常见问题:静态脱敏系统身份认证方案的 4 个高频疑问
- Q: 静态脱敏系统身份认证方案第一次落地要怎么做才不返工?
- A: 结论是先把三类主体分开,再收授权边界,最后才接脱敏规则。主体不分开,执行者就还原不出来;授权不收窄,作业账号迟早会被配成一把横穿多库的钥匙。这两件事定完,接规则只是把处理逻辑挂上去。反过来先配规则,往往要在权限梳理处推倒重来。
- Q: 合规审计中如何应用静态脱敏系统,重点要准备哪些材料?
- A: 结论是准备两类可复算的材料:一类是授权条目,证明作业身份只读源库、只写目标库;另一类是作业台账,写清行数、列数、源库、目标库与发起主体。前者回答「能碰什么」,后者回答「碰了什么」,两样都有,审计时才不用临时翻日志。
- Q: 登录认证中如何应用静态脱敏系统的作业账号,凭证该配多久?
- A: 结论是让凭证的有效期对齐作业时长,而不是按季度或年度来配。作业通常只跑几十分钟,凭据长期有效只会放大暴露面。做法是令牌与作业绑定、一次性使用、到期即失效;这样即便凭据被截获,过期之后也派不上用场。
- Q: 身份认证中如何应用静态脱敏系统,服务账号和操作员要不要共用一套凭据?
- A: 结论是不能共用。服务账号由调度器持有、按批次运行,操作员由自然人持有、按需触发;两者共用一套凭据,等于把「谁发起了这次作业」这个问题永久地抹掉了。分开之后,台账里同时记下发起主体与执行服务账号,链路才是完整的。
相关阅读
文章作者:安当加密-焱垚