使用案例: 支付
产品: MongoDB Atlas, Queryable Encryption, 使用客户密钥管理进行静态加密, 私有端点, 数据库审计, PCI DSS 认证
合作伙伴: Amazon Web Services
解决方案概述
的PCI DSS 构成了保护支付账户数据的参考标准。它为存储、进程或传输 CHD 的系统设定了技术和操作实践的基线。它为团队提供了如何保护和控制支付系统的共同参考点。
保护支付数据通常涉及加密。使用传统方法,一旦字段被加密,就不能再通过其值进行搜索。对于支付平台来说,这种限制是一个实际问题,因为欺诈调查取决于搜索敏感字段,例如客户的电子邮件、电话或账户参考号。由于无法搜索加密数据,调查被迫做出一个令人不舒服的选择:要么批量解密数据,从而扩大暴露范围,要么放慢速度并离线运行。这种两难境地引出了解决方案的设计问题:
支付平台如何对数据进行静态加密,同时仍允许欺诈分析人员按值搜索?
PCI DSS 提高了支付数据的保护标准。其最新版本 v.4 0和 40v..1 更加重视持续合规、时间点审核,并缩小范围以减少服务评估工作量提供商。
在 PCI DSS 下,合规遵循责任共担模型: MongoDB Atlas确保托管平台的操作安全,而客户则控制其部署的配置和数据策略。
简单地说,使用MongoDB本身并不能使解决方案符合 PCI DSS。合规性是根据特定环境进行评估的,其中包括产品、流程和组织。 MongoDB Atlas提供经过认证的基础架构和数据层功能,可减少实现合规的工作量并缩小Atlas 审核范围。这里的价值是加速和范围缩小,而不是合规保证。
PCI DSS 的形式以及各层的划分
PCI 安全标准委员会维护 PCI DSS 并组织了一设立根据控制目标分组的要求:
目标 | 要求 |
|---|---|
构建和维护安全的网络 |
|
保护帐户数据 |
|
维护漏洞管理计划 |
|
实施严格的访问权限控制 |
|
定期监控和测试网络 |
|
维护信息安全政策 |
|
在责任共担模型下,这些需求分割在这些层级中:
基础设施层(提供商的责任):包括物理安全、网络控制、平台补丁和根本的存储的静态加密。 MongoDB Cloud 是经过 PCI DSS 认证的服务提供商,并经 QSA、Coalfire Systems 验证。对于MongoDB Cloud 中的 CHD 环境,QSA 可以依赖MongoDB Cloud AOC,可通过MongoDB信任中心请求。这个预先验证的层使客户无需重新审核根本的基础架构。
应用程序层(客户负责):包括产品如何存储、保护、查询、屏蔽和审核 CHD,以及允许谁读取信息。此层仍由客户自行设计决定。
图 1。 PCI DSS 共担责任分层模型
PSP项目填充了应用程序层。它包括一个参考架构和一设立最佳实践。它展示了如何使用MongoDB使应用程序层与 PCI DSS 控制目标保持一致,从而保护存储的数据、限制访问权限、监控数据以及缩小Atlas 审核范围。该项目是加速采用 PCI DSS 的点。
架构建议
PSP项目是符合 PCI DSS 的 PSP 平台。它在MongoDB Atlas上运行支付生命周期:卡结账和授权、自动欺诈评分以及多级分析师调查。它展示了分析师如何以清晰的设计理念搜索加密数据:
加密所有内容。查询任何内容。钥匙归您所有。
通过从Atlas继承基础架构层(参见图 1),剩余的工作将在应用程序层进行。 Atlas提供了多种功能来支持这项工作,其中最核心的功能就是Queryable Encryption 。 MongoDB功能部分列出了完整的功能。
Queryable Encryption焦点
使用传统方法时,字段要么以明文形式保存,以便进行搜索(任何具有数据库访问权限的人都可读),要么加密,以便受到保护(但不再可搜索)。Queryable Encryption为其支持的查询类型删除了“非此即彼”的操作。
图 2。 MongoDB加密架构: Queryable Encryption、密钥管理和数据保护层
对于相等可搜索字段,流程如下进行:
驾驶员使用字段的 DEK 在客户端端加密搜索值。
服务器将该加密值与加密索引进行匹配。它将密文与密文进行比较,但不会解密字段。
当匹配的文档返回到应用程序进程进程时,驾驶员会对内存中的目标字段进行解密。 MongoDB Atlas仅存储和处理作为BSON二进制子类型 06 保存的密文;因此,具有完全集群访问权限的数据库管理员只能看到不透明字节。
PSP项目中的具体效果:欺诈分析师通过加密的电子邮件、电话或帐户引用搜索客户并取回记录,而明文值不会到达Atlas。此功能使敏感的 PII 保持静态加密并按值可用,而无需进行会扩大 CDE 的批量解密。
需要保护但不需要搜索的字段使用不可搜索模式,仅针对授权的升级请求进行解密。数据模型部分介绍了这两种模式及其保护的字段。
MongoDB应用程序层功能
PSP项目结合了MongoDB和Atlas 的多项功能。每个映射到 PCI DSS 应用程序层工作的特定部分:
功能 | 在项目中的角色 | PCI DSS 控制目标 | MongoDB 文档 |
|---|---|---|---|
可查询加密:等值 | 按精确匹配搜索加密的PII(电子邮件、电话、帐户参考);该字段已在客户端加密,因此数据库服务器仅为其存储和处理密文,而不会接收明文。 | 保护存储的帐户数据;限制访问权限。 | |
Queryable Encryption:不可搜索和客户端字段级加密 | 加密高敏感度字段(解决、政府ID、 原始网关有效负载),仅用于检索,在客户端解密。 | 保护存储的帐户数据;限制访问权限。 | |
客户管理的密钥 | 将客户主密钥保存在客户自己的密钥管理服务中;主密钥保留在那里, MongoDB无权访问权限它们,而数据密钥则使用它们加密。 | 保护存储的帐户数据。 | |
自动加密共享库: | 在驾驶员/应用程序进程中执行加密和解密,因此加密字段的明文不会通过网络传输到Atlas。 | 保护存储的帐户数据;传输中加密。 | |
RBAC 和联合身份验证 | 数据库和集合级别基于角色的细粒度访问权限,使用 LDAC/Active Directory、OpenID Connect 和员工联合身份验证进行身份验证。 | 按需知来限制访问权限;识别和验证用户。 | |
两层数据加密密钥结构 | 在每层Atlas角色和数据库用户的支持下,以加密方式实施最低特权字段可见性。 | 按需要了解的情况来限制访问权限。 | |
私有网络 | 通过IP白名单将持卡人数据流量保持在通过私有端点的云提供商主干线上,从而在 CDE 周围形成明确的网络边界。 | 构建和维护安全的网络。 | |
Atlas数据库审核 | 将对敏感字段的访问权限记录为Atlas 审核记录,并将Atlas 审核日志转发到 SIEM 系统进行查看。 | 记录并监控所有访问权限。 | |
Atlas连接上的传输层安全 1.3 | 在每个网络跃点加密持卡人数据。 | 对传输中的数据进行加密。 | |
具有 BIAN 对齐模式的文档模型 | 对卡片、ACID 事务和参与方数据进行建模,以便隔离持卡人数据并使其最小化。 | 支持范围界定和数据最小化。 |
相邻用例
该解决方案的核心原则(包括稳定的 API 边界、字段级 Queryable Encryption 和每个访问层级一个 DEK 模型)可以应用于其他使用案例:
开放金融:同意范围的数据访问,将第三方限制为客户授权的领域,例如 PSD2 和消费者数据权。
医疗保健:受 HIPAA 保护的健康信息。
保险和财富:根据一般数据保护法规 (GDPR)处理政府标识符和金融账户数据的平台。
参考架构
PSP项目是标准卡支付链中的支付网关位置:
商户后端
支付网关:处理机构、收单机构、卡网络和发卡机构
它拥有 PCI DSS 范围的存储、加密和访问权限控制(管理谁可以读取哪些持卡人数据字段)。它不模拟卡网络或处理器;因此该架构侧重于数据安全层。
处理器、收单机构、卡网络和发卡机构等下游参与者是外部子系统,可通过提供程序访问。在演示中,每个提供商都有一个内置模块,可保持项目的独立性,但在生产中它们可以被实际的外部子系统替换。发卡机构就是这样的提供商之一:其内置模块在内部存储用于演示的卡数据,而在生产中,该数据将存储在外部发卡机构中。
图 3。 PSP 平台分层架构和外部组件
架构组件
该架构使用以下组件:
PSP仪表盘(前端):表示层。它不直接与数据库通信。签出时,它会对 PAN 进行标记,以便 PSP 核心不会传输或存储完整的 PAN。
PSP API网关(后端):单一入口点和唯一可以解密受保护字段的组件。它持有Queryable Encryption客户端,解析调用者的角色,并为每个请求选择正确的密钥层级。所有调用者(包括用户界面、服务帐户和集成)都通过相同的API进行传递,并遵循相同的 RBAC 和密钥规则。
MongoDB Atlas (M10 或更高版本) 结合 Queryable Encryption: 仅为每个受保护的字段存储密文 (二进制子类型 06)。 具有完整集群访问权限的数据库管理员会看到不透明的字节。 TLS 1.3 可保护传输中的所有数据。PSP 项目依赖于等值搜索,生产环境中支持此功能。
AWS KMS :保存封装和解封装数据加密密钥的集合扫描 。 集合扫描保留在KMS中, MongoDB无权访问权限它。本地密钥提供商程序可用作演示的离线后备方案。
注意
对前缀、后缀和子字符串查询的Queryable Encryption支持处于公开预览阶段,并且需要MongoDB 8.2 或更高版本。确保您在Atlas 集群和 crypt_shared 库上使用MongoDB 8.2 或更高版本。相等和范围查询不需要 8.2。
数据模型方法
PSP项目数据模型遵循 BIAN 服务域命名约定,因此每个集合和字段都映射到 BIAN 标准中定义的服务域。除了 BIAN 之外, MongoDB Queryable Encryption还定义了字段级安全态势。
查询类型以及项目如何应用它们
MongoDB Queryable Encryption 可以在客户端保持字段加密,同时仍允许服务器查询密文。PSP 项目使用以下查询类型:
相等(生产):PCI DSS 范围的查找键的可搜索模式。该驾驶员会对查询值进行加密,并将其与加密索引进行匹配,因此服务器不会对该字段进行解密。此功能可让欺诈分析师通过电子邮件、电话或账户引用查找记录,而无需暴露明文。
无查询(仅检索):这是针对最高敏感度字段的不可搜索模式,包括住宅地址、政府标识符和原始网关负载。授权客户端仅即时解密这些字段。
范围(生产):用于值范围查找,例如按金额范围筛选。它会对金额加密。
前缀、后缀和子字符串(公开预览版):演示如何对加密身份字段进行 KYC 样式的部分匹配查找。
对于以下 PCI DSS 范围的卡和 PII 字段,访问权限设计简化为以下类别:
字段 | 分类 | 加密模式 | 可搜索 |
|---|---|---|---|
| 帐户参考/PII |
| 是 |
| 帐户参考 |
| 是 |
| PII |
| 是 |
| PII |
| 是 |
| 先心病 |
| No |
| 高 PII |
| No |
| 高 PII |
| No |
| 敏感操作 |
| No |
| 网络令牌 | 明文 | 是 |
| 仅显示 | 明文 | No |
完整 PAN ( | 先心病 | 不由 PSP 核心存储 | 对于 PSP 核心不适用 |
CVV 和 PIN | 敏感身份验证数据 | 从不存储 | 不适用 |
尽可能将持卡人数据排除在范围之外的设计选择包括:
PAN 令牌化:应用程序将完整的 PAN 替换为
tok_<uuid>代理令牌,并仅保留最后四位数字以供显示。零 SAD 捕获:端点从不捕获 SAD,例如 CVV 或 PIN。
通过细分和标记化缩小范围
常见的 PCI DSS 做法会将持卡人数据排除在不需要这些数据的系统之外,因此大多数平台都不在 CDE 之内。这些技术应用分段(将 CDE 与系统的其他部分隔离)和标记化(用专用标记化保管库中保存的代理令牌替换主节点 (primary node in the replica set)帐号)。分段不是 PCI DSS 要求,但它将系统排除在范围之外并降低了评估费用;在使用时,必须对其进行记录、证明和验证。
PSP项目在数据层应用了这些技术:
完整的 PAN 永远不会驻留在 PSP 核心中:核心仅存储代理令牌、BIN 和最后四位数字。该平台的大部分内容不包含持卡人数据,因此不在讨论范围之内。完整的 PAN 属于发卡机构子系统,在生产环境中位于外部。在演示中,可替换的内置发行者模块会介入并将 PAN 存储在其自己的隔离保管库中,并使用
QE:equality加密。无需解密即可匹配该字段以进行精确查找和重复检测。PII 是集中式的:身份字段(例如电子邮件或电话)位于协议、卡和ACID 事务记录引用的单个 BIAN SD-13 方集合中。一个保护和进程数据主体删除请求的位置。
敏感字段位于单独的密钥层级后面:
QE:none字段使用与可搜索QE:equality字段不同的数据加密密钥层级,因此敏感数据和非敏感数据之间的边界由密钥强制执行。
这是参考模式,而不是认证。 CDE 定义及其验证仍然由客户负责,由评估人员确认。
访问控制实施密钥,而不是应用程序代码
单独的 DEK 支持加密层:
查找层级:
QE:equality密钥可供所有经过身份验证的分析师角色用于搜索。敏感层级:
QE:none密钥仅适用于持有有效、短期升级令牌的 2 级调查员和只读安全审核员。设计核心: 1级客户端的加密字段映射省略了敏感密钥,因此驾驶员无法解密这些字段,并将它们作为密文返回。此处的字段级访问权限控制是加密的,而不是应用程序代码中的投影,这降低了因查询错误而意外泄漏的风险。当分析师升级案例并经2 级调查员批准时,调查员会收到一个升级令牌,该令牌为该请求激活敏感层客户端端池。
构建解决方案
本部分是为想要运行和评估解决方案的团队提供的部署指南。它涵盖了对成功部署至关重要的配置选择、如何在本地运行堆栈以及如何将其部署到生产环境。使用此 GitHub存储库来实现此解决方案。
配置密钥管理服务
使用数据库设置命令 npm run setup:db 配置MongoDB密钥保管库。为每个加密字段使用由集合扫描包装的 DEK。此步骤是幂等的,因此您可以安全地重新运行它以重复使用现有密钥。
将托管KMS(例如 AWS KMS)用于任何生产或类似生产的部署。 集合扫描保留在组织自己的账户中, MongoDB无权访问权限它。
对于 AWS KMS,通过环境变量配置提供商:
PSP_KMS_PROVIDER=aws AWS_CMK_ARN=arn:aws:kms:<region>:<account-id>:key/<key-id> AWS_REGION=<region> AWS_ACCESS_KEY_ID=<access-key-id> AWS_SECRET_ACCESS_KEY=<secret-access-key> AWS_SESSION_TOKEN=<token> # optional, for temporary credentials
或者,使用将主密钥保存在环境变量中的本地密钥提供商。此设置作为离线演示和本地开发的变通方法,并不适合真实的持卡人数据。
仅为离线演示配置本地KMS解决方法:
PSP_KMS_PROVIDER=local PSP_KMS_LOCAL_MASTER_KEY=<96-byte base64 key> # generate with: npm run setup:key:master
本地提供商需要一个 96 字节的基本64主密钥。 MongoDB Queryable Encryption希望本地提供商具有此大小。
配置事件总线
该平台是事件驱动的。业务和合合规事件通过事件总线流动。引擎由 EVENT_BUS_ENGINE 选择,无论选择如何,都会运行相同的发布者和消费者代码。
将Kafka用于生产或高吞吐量环境,因此事件具有持久性、分区性和可由其他系统使用的特点。
EVENT_BUS_ENGINE=kafka KAFKA_BROKERS=broker1:9092,broker2:9092 KAFKA_CLIENT_ID=pci-psp KAFKA_SSL=true KAFKA_SASL_MECHANISM=plain # or scram-sha-256 / scram-sha-512 KAFKA_SASL_USERNAME=<username> KAFKA_SASL_PASSWORD=<password> EVENT_BUS_TOPIC_PREFIX=pci.psp
对于本地开发、演示或低容量部署等要求不高的环境,请使用进程内引擎。
EVENT_BUS_ENGINE=in-process
卡数据作为加密信封传输,因此引擎的选择不会改变 PCI DSS 合规状态。
设置附加配置
在启动堆栈之前,在根 .env 中设置以下值:
MongoDB Atlas:
MONGODB_URI,MONGODB_DB_NAMEQE 共享库:
MONGODB_CRYPT_SHARED_LIB_PATH身份验证:
PSP_JWT_SECRET、PSP_OAUTH_KEY_PROVIDER前端/商家:
NEXT_PUBLIC_PSP_URL_BACKEND_PUBLIC,PSP_MERCHANT_OAUTH_CLIENT_ID,PSP_MERCHANT_OAUTH_CLIENT_SECRET,PSP_MERCHANT_SESSION_SECRET
该存储库包含一个 .env 文件 以进行编辑;有关完整列表,请参阅安装 wiki 页面。
使用 Docker Compose 在本地运行演示
安装依赖项,配置数据库并为其设定种子,然后启动堆栈。 Docker Compose 是首次运行的推荐路径。它将后端、PSP 门户和商家应用作为独立的容器化堆栈启动:
npm run setup # install root + backend + frontend + merchant dependencies npm run setup:db # create QE collections, provision DEKs and indexes npm run setup:seed # insert synthetic BIAN demo data docker compose up # start the full stack
对于支持热重载的本地开发,请使用 npm run dev 而不是 docker compose up。
运行后,可在以下位置使用这些服务:
PSP 门户,网址为 http://localhost:8080
位于 http://localhost:8082 的 Merchant 应用
后端API,位于 http://localhost: }8081
OpenAPI/Swagger,位于
/doc运行状况检查位于
/api/v1/system/health
图 4。 Leafy Pay应用程序演示用户界面
setup:db 需要具有有效KMS凭证的实时 M10 或更高级别的Atlas 集群。该演示仅使用合成数据。
部署用于生产环境
对于生产或共享环境,请部署到 Kubernetes,而不是使用单个 Docker Compose 托管:
npm run deploy:kube # Kubernetes deploy via tools/kube.ts npm run deploy:docker # alternative: containerised deploy with docker compose
推荐的生产设置:
将 AWS KMS用于密钥提供商程序和Kafka事件总线。
提供 QE 每层连接字符串和凭证作为Kubernetes密钥。
通过 TLS 终止客户端端流量,并通过可用的私有端点访问Atlas 。
AWS KMS就位后,可水平扩展后端;在本地密钥提供商上运行时,仅保留单个副本。
关键要点
从第一天起就按照责任共享模型进行设计:MongoDB Atlas 的 PCI DSS 认证使基础设施层可以通过 AOC 继承,但应用程序层仍由客户负责。
同时启用加密和可搜索性: Queryable Encryption支持对加密的PII 进行精确匹配搜索,而无需服务器对其进行解密,这可以简化“解密以调查”过程。权衡,往往会扩大 PCI DSS 范围。
使用密钥(而不仅仅是代码)实施访问权限控制:每层 DEK 模型对字段级访问权限进行加密。低特权客户端无法解密敏感字段,从而降低了查询错误泄漏敏感字段的可能性。
在保护数据之前缩小范围:对 PAN 进行标记并仅存储屏蔽后的最后四位数字,将系统的大部分内容排除在持卡人数据范围之外。与加密但仍在范围内的数据相比,超出范围的数据需要的控制更少,因此范围缩小会缩小Atlas 审核面。
设计Atlas 审核跟踪,使其比密钥的寿命更长:将仅追加访问权限日志保持未加密状态,并与其描述的数据分开,以便通过密钥轮换保持可读性,并支持 PCI DSS 期望的访问权限日志记录和监控。
作者
- Antonio Membrides Espinosa, MongoDB