【Atlas】敏感数据识别(如 PII、PCI)在 Atlas 中如何实现?

📅 2026/7/12 20:43:51
【Atlas】敏感数据识别(如 PII、PCI)在 Atlas 中如何实现?
Apache Atlas 2.4.0 敏感数据识别PII/PCI实现机制与金融级自动化打标实战用户问题原文敏感数据识别如 PII、PCI在 Atlas 中如何实现本文将系统性地解答这一核心问题聚焦Apache Atlas 2.4.0在敏感数据识别Sensitive Data Discovery领域的实际能力与落地路径。我们将以金融交易流水表finance_tx_lineage中的银行卡号PCI DSS 合规与身份证号PII识别为业务背景深入剖析从“元数据注册”到“自动打标”再到“策略联动”的全链路自动化体系并通过配置示例、源码片段、验证命令与 Mermaid 架构图构建一套可立即应用于生产环境的闭环方案。一、问题引入风控审计发现未标记的“银行卡号”字段某大型银行的数据治理团队收到 PCI DSS支付卡行业数据安全标准合规审计报告交易流水表finance_tx_lineage中的card_number字段未被识别为敏感数据导致该字段在非授权查询中以明文返回违反了“敏感数据必须加密或脱敏”的强制要求。团队检查 Atlas 发现该表已通过 Hive Hook 正确上报但card_number字段未被打上PCI.CARD_NUMBER或PII.ID_CARD标签。根本原因在于Atlas 本身不提供内置的敏感数据识别引擎。它依赖外部系统基于预设规则如正则、字典、ML 模型进行识别并通过 REST API 或 Kafka 将结果写回 Atlas。关键界定“敏感数据识别”在此指自动检测数据资产中是否包含 PII个人身份信息、PCI支付卡信息、PHI健康信息等敏感内容并为其打上标准化 Classification 标签。结论前置Atlas 是敏感数据标签的存储与传播载体而非识别引擎。二、原理解析Classification 作为敏感数据的“身份证”2.1 官方定义与源码佐证在 Apache Atlas 2.4.0 中敏感数据通过 Classification分类标签进行标识。Classification 是一种特殊的 Entity Type可附加到任何数据资产如hive_column,kafka_topic。源码定义types/ClassificationTypes.json{name:PII,description:Personally Identifiable Information,superTypes:[],attributeDefs:[]},{name:PCI,description:Payment Card Industry Data,superTypes:[],attributeDefs:[]}Java 模型org.apache.atlas.model.instance.AtlasClassificationpublicclassAtlasClassificationextendsAtlasStruct{privateStringentityGuid;// 关联的实体 GUIDprivatebooleanpropagate;// 是否沿血缘传播// ... 其他属性}通俗类比Classification 就像护照上的“签证贴纸”——它声明了持有人的入境权限如“可进入申根区”但不负责检查护照真伪或决定是否放行。技术本质差异签证是静态标识而敏感数据识别需要一个“边检系统”来主动扫描护照内容并贴签证。2.2 敏感数据识别的三大技术路径Atlas 本身不执行任何数据内容扫描但提供了三种标准化接口供外部系统实现识别路径机制适用场景延迟字段名匹配Schema-based基于字段名正则如.*card.*高效、低开销适用于命名规范严格的场景毫秒级数据采样扫描Content-based抽样读取实际数据匹配正则/字典准确率高适用于命名不规范的遗留系统分钟级血缘传播Lineage-based从已标记的上游自动继承标签保证加工链路全程合规秒级设计动机Atlas 作为元数据存储中心保持核心轻量将复杂的敏感数据识别逻辑如正则引擎、NLP 模型下沉到外围系统符合“关注点分离”原则。三、架构全景金融级敏感数据自动识别流水线3.1 整体架构图MermaidHive HookSpark ListenerKafka HookPoll Solr or KafkaRegex on field.nameYesSample Data ContentYesHive Table DDLAtlas ServerSpark Job WriteKafka Topic CreateHBase: Store EntitiesSolr: Index for SearchSensitive Data ScannerField card_number?Add PCI.CARD_NUMBERMatch PAN Regex?Add PCI.CARD_NUMBERRanger Dynamic Masking颜色说明#333数据源#00fAtlas 核心#f96敏感数据扫描器#0f0策略执行者3.2 核心组件交互详解组件 1元数据上报层Hook/ListenerHive Hook捕获CREATE TABLE finance_tx_lineage (card_number STRING, ...)上报字段元数据。Spark Listener监听 DataFrame 写入操作提取 Schema 并上报。上报内容构造AtlasEntity包含qualifiedName如default.finance_tx_lineage.card_numbercl1。组件 2敏感数据扫描器Scanner输入监听ATLAS_ENTITIESKafka Topic 或定期查询 Solr。识别规则规则 1Schema-basedfield.name matches /.*(card|pan|ccn).*/i → PCI.CARD_NUMBER规则 2Content-based抽样 1000 行数据匹配Luhn 算法验证的 16 位数字PAN 格式。输出调用 Atlas REST API 打标。组件 3策略执行层Ranger基于PCI.CARD_NUMBER标签应用动态脱敏如MASK_SHOW_LAST_4。数据目录在 UI 中高亮显示敏感字段提示用户谨慎使用。四、实战配置构建金融交易流水的 PCI 自动识别链路4.1 步骤 1定义敏感数据 Classification创建PCI.CARD_NUMBER和PII.ID_CARD分类# 创建 PCI.CARD_NUMBERcurl-uadmin:admin-XPOST\-HContent-Type: application/json\-d{ classificationDefs: [{ name: PCI.CARD_NUMBER, description: 支付卡主账号PAN需 PCI DSS 合规, superTypes: [PCI], attributeDefs: [] }] }\http://atlas:21000/api/atlas/v2/types/typedefs# 创建 PII.ID_CARDcurl-uadmin:admin-XPOST\-HContent-Type: application/json\-d{ classificationDefs: [{ name: PII.ID_CARD, description: 中国居民身份证号, superTypes: [PII], attributeDefs: [] }] }\http://atlas:21000/api/atlas/v2/types/typedefs4.2 步骤 2部署敏感数据扫描器Python 示例# sensitive_scanner.pyimportreimportrequestsfromkafkaimportKafkaConsumerimportjsonimportrandom ATLAS_URLhttp://atlas:21000ATLAS_AUTH(admin,admin)KAFKA_TOPICATLAS_ENTITIESBOOTSTRAP_SERVERSkafka:9092# PCI PAN 正则简化版实际需 Luhn 校验PAN_REGEXr\b(?:\d{4}[-\s]?){3}\d{4}\bdefis_card_field_by_name(field_name):returnbool(re.search(r.*(card|pan|ccn).*,field_name,re.IGNORECASE))defis_card_field_by_content(sample_data):# 模拟从 Hive 读取样本实际需集成 Spark/Hive Clientforvalueinsample_data:ifre.search(PAN_REGEX,str(value)):returnTruereturnFalsedefadd_classification(entity_guid,classification_name):urlf{ATLAS_URL}/api/atlas/v2/entity/bulk/classificationpayload{classification:{typeName:classification_name},entityGuids:[entity_guid]}resprequests.post(url,authATLAS_AUTH,jsonpayload)ifresp.status_code!200:print(fFailed to tag{entity_guid}:{resp.text})# 消费 Atlas Entity 变更事件consumerKafkaConsumer(KAFKA_TOPIC,bootstrap_serversBOOTSTRAP_SERVERS,value_deserializerlambdam:json.loads(m.decode(utf-8)))formsginconsumer:entitiesmsg.value.get(entities,[])forentityinentities:# 仅处理 Hive 字段ifentity[typeName]hive_column:field_nameentity[attributes][name]qualified_nameentity[attributes][qualifiedName]guidentity[guid]# 规则 1字段名匹配ifis_card_field_by_name(field_name):print(fTagging by name:{qualified_name}as PCI.CARD_NUMBER)add_classification(guid,PCI.CARD_NUMBER)continue# 规则 2内容采样仅对新表触发ifmsg.value.get(operationType)ENTITY_CREATE:# 模拟抽样实际需查询 Hive 表sample_data[f4111-1111-1111-{random.randint(1000,9999)}for_inrange(100)]ifis_card_field_by_content(sample_data):print(fTagging by content:{qualified_name}as PCI.CARD_NUMBER)add_classification(guid,PCI.CARD_NUMBER)⚠️危险操作警告内容扫描必须限制抽样比例与频率避免对生产 Hive 集群造成性能冲击。建议在非高峰时段运行并设置资源配额。4.3 步骤 3启用血缘传播确保下游合规当finance_tx_lineage被加工为宽表risk_user_profile自动继承标签// 在 Spark 作业上报的 process Entity 中设置{typeName:spark_process,relationshipAttributes:{inputs:[{guid:finance_tx_guid,propagateTags:ONE_TO_TWO// 关键配置}],outputs:[{guid:risk_profile_guid,propagateTags:TWO_TO_ONE}]}}源码依据org.apache.atlas.repository.store.graph.v2.EntityGraphMapper.propagateClassifications()4.4 验证端到端流程验证点 1模拟表创建并上报-- 在 Hive 中执行CREATETABLEdefault.finance_tx_lineage(tx_id STRING,card_number STRING,amountDOUBLE)STOREDASPARQUET;验证点 2检查字段是否自动打标# 获取字段 GUIDCARD_GUID$(curl-s-uadmin:admin\http://atlas:21000/api/atlas/v2/entity/uniqueAttribute/type/hive_column?attr:qualifiedNamedefault.finance_tx_lineage.card_numbercl1\|jq-r.entity.guid)# 检查 Classificationcurl-uadmin:admin\http://atlas:21000/api/atlas/v2/entity/guid/$CARD_GUID/classifications# 预期输出包含 PCI.CARD_NUMBER验证点 3验证 Ranger 脱敏生效-- 以 analyst 用户查询SELECTcard_numberFROMdefault.finance_tx_lineageLIMIT1;-- 预期结果****1234 而非完整卡号验证点 4监控 Kafka 消费延迟# 查看 ATLAS_ENTITIES Topic Lagkafka-consumer-groups.sh --bootstrap-server kafka:9092\--groupsensitive_scanner_group--describe# 确保 LAG 为 0五、高级特性多维度识别与 GDPR 联动5.1 复合规则提升准确率场景字段名user_info不明确但内容含身份证号。规则组合if(is_id_card_by_content(sample_data)andtable_name containsuseranddatabasein[prod,finance]):tag_as(PII.ID_CARD)5.2 GDPR Right to Erasure 联动流程当用户行使“被遗忘权”系统通过 Atlas 查询所有带PII.USER_ID标签的字段触发数据删除作业HiveDELETE或 HudiCompaction更新dq_result记录删除状态。六、FAQ高频关联问题解答Q1Atlas 能直接扫描 HDFS 文件内容吗不能。Atlas 无分布式文件系统访问能力。必须通过外部扫描器如 Spark 作业读取数据。Q2正则表达式如何管理最佳实践将正则规则存入 Git通过 CI/CD 流水线更新扫描器配置。工具推荐使用Presidio微软开源的预置 PII 识别器。Q3性能瓶颈在哪里Atlas 写入高频打标可能导致 HBase Region Split。优化方案批量 API/bulk/classification、结果缓存避免重复打标。Q4云上如何实现AWSMacie自动识别 S3 中的 PII Glue Data Catalog存储标签。AzurePurview内置敏感数据扫描 Synapse Link。Q5如何处理误报人工复核队列将疑似敏感字段加入待审核列表。反馈闭环用户可在 Atlas UI 中“取消误标”更新扫描器模型。七、总结与最佳实践金融级合规必备PCI DSS、GDPR 等法规要求自动化敏感数据识别人工打标无法规模化。三层架构是黄金标准上报层Hook 识别层Scanner 执行层Ranger。金融场景最佳实践字段名规范强制要求敏感字段包含card、id等关键词。血缘传播必开确保从 ODS 到 ADS 全链路标签一致。双引擎校验Schema-based Content-based 交叉验证降低漏报率。避坑指南避免在 Hook 中直接调用内容扫描增加事务复杂度应通过 Kafka 解耦。定期清理无效 Classification如表已删除但标签残留。作者署名九师兄专题目录【Apache Atlas】Apache Atlas 资深工程师到专家实战之路目录总目录【目录】技术体系目录注意本文由 AI 辅助生成技术细节请以官方文档为准。生产环境使用前务必充分测试。