对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

借助 MongoDB Atlas 加速 PCI DSS 合规

使用案例: 支付

行业: 金融服务、安全与合规

产品: 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 安全标准委员会维护 PCI DSS 并组织了一设立根据控制目标分组的要求:

目标
要求

构建和维护安全的网络

  1. 网络安全控制

  2. 安全配置

保护帐户数据

  1. 保护存储的帐户数据

  2. 加密传输中的数据

维护漏洞管理计划

  1. Anti-malware

  2. 保护软件和系统

实施严格的访问权限控制

  1. 根据需要知悉原则限制访问

  2. 识别和验证用户身份

  3. 限制物理访问

定期监控和测试网络

  1. 记录并监控所有访问权限

  2. 定期测试安全性

维护信息安全政策

  1. 组织安全策略

在责任共担模型下,这些需求分割在这些层级中:

  • 基础设施层(提供商的责任):包括物理安全、网络控制、平台补丁和根本的存储的静态加密。 MongoDB Cloud 是经过 PCI DSS 认证的服务提供商,并经 QSA、Coalfire Systems 验证。对于MongoDB Cloud 中的 CHD 环境,QSA 可以依赖MongoDB Cloud AOC,可通过MongoDB信任中心请求。这个预先验证的层使客户无需重新审核根本的基础架构。

  • 应用程序层(客户负责):包括产品如何存储、保护、查询、屏蔽和审核 CHD,以及允许谁读取信息。此层仍由客户自行设计决定。

PCI DSS 共担责任分层模型

图 1。 PCI DSS 共担责任分层模型

点击放大

PSP项目填充了应用程序层。它包括一个参考架构和一设立最佳实践。它展示了如何使用MongoDB使应用程序层与 PCI DSS 控制目标保持一致,从而保护存储的数据、限制访问权限、监控数据以及缩小Atlas 审核范围。该项目是加速采用 PCI DSS 的点。

PSP项目是符合 PCI DSS 的 PSP 平台。它在MongoDB Atlas上运行支付生命周期:卡结账和授权、自动欺诈评分以及多级分析师调查。它展示了分析师如何以清晰的设计理念搜索加密数据:

加密所有内容。查询任何内容。钥匙归您所有。

通过从Atlas继承基础架构层(参见图 1),剩余的工作将在应用程序层进行。 Atlas提供了多种功能来支持这项工作,其中最核心的功能就是Queryable Encryption 。 MongoDB功能部分列出了完整的功能。

使用传统方法时,字段要么以明文形式保存,以便进行搜索(任何具有数据库访问权限的人都可读),要么加密,以便受到保护(但不再可搜索)。Queryable Encryption为其支持的查询类型删除了“非此即彼”的操作。

MongoDB加密架构: Queryable Encryption、密钥管理和数据保护层

图 2。 MongoDB加密架构: Queryable Encryption、密钥管理和数据保护层

点击放大

对于相等可搜索字段,流程如下进行:

  • 驾驶员使用字段的 DEK 在客户端端加密搜索值。

  • 服务器将该加密值与加密索引进行匹配。它将密文与密文进行比较,但不会解密字段。

  • 当匹配的文档返回到应用程序进程进程时,驾驶员会对内存中的目标字段进行解密。 MongoDB Atlas仅存储和处理作为BSON二进制子类型 06 保存的密文;因此,具有完全集群访问权限的数据库管理员只能看到不透明字节。

PSP项目中的具体效果:欺诈分析师通过加密的电子邮件、电话或帐户引用搜索客户并取回记录,而明文值不会到达Atlas。此功能使敏感的 PII 保持静态加密并按值可用,而无需进行会扩大 CDE 的批量解密。

需要保护但不需要搜索的字段使用不可搜索模式,仅针对授权的升级请求进行解密。数据模型部分介绍了这两种模式及其保护的字段。

PSP项目结合了MongoDB和Atlas 的多项功能。每个映射到 PCI DSS 应用程序层工作的特定部分:

功能
在项目中的角色
PCI DSS 控制目标
MongoDB 文档

可查询加密:等值

按精确匹配搜索加密的PII(电子邮件、电话、帐户参考);该字段已在客户端加密,因此数据库服务器仅为其存储和处理密文,而不会接收明文。

保护存储的帐户数据;限制访问权限。

Queryable Encryption:不可搜索和客户端字段级加密

加密高敏感度字段(解决、政府ID、 原始网关有效负载),仅用于检索,在客户端解密。

保护存储的帐户数据;限制访问权限。

客户管理的密钥

将客户主密钥保存在客户自己的密钥管理服务中;主密钥保留在那里, MongoDB无权访问权限它们,而数据密钥则使用它们加密。

保护存储的帐户数据。

自动加密共享库: crypt_shared

在驾驶员/应用程序进程中执行加密和解密,因此加密字段的明文不会通过网络传输到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 范围的存储、加密和访问权限控制(管理谁可以读取哪些持卡人数据字段)。它不模拟卡网络或处理器;因此该架构侧重于数据安全层。

处理器、收单机构、卡网络和发卡机构等下游参与者是外部子系统,可通过提供程序访问。在演示中,每个提供商都有一个内置模块,可保持项目的独立性,但在生产中它们可以被实际的外部子系统替换。发卡机构就是这样的提供商之一:其内置模块在内部存储用于演示的卡数据,而在生产中,该数据将存储在外部发卡机构中。

PSP 平台分层架构和外部组件

图 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 字段,访问权限设计简化为以下类别:

字段
分类
加密模式
可搜索

cardTransactionAccountReference

帐户参考/PII

QE:equality

是

customerAgreementReference

帐户参考

QE:equality

是

partyEmailAddress

PII

QE:equality

是

partyMobilePhoneNumber

PII

QE:equality

是

paymentCardExpirationDate

先心病

QE:none

No

customerAgreementResidentialAddress

高 PII

QE:none

No

governmentIdentificationReference

高 PII

QE:none

No

rawGatewayPayload, processorTransactionMetadata

敏感操作

QE:none

No

paymentCardReference

网络令牌

明文

是

paymentCardMaskedPanDisplay

仅显示

明文

No

完整 PAN (paymentCardNumber)

先心病

不由 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存储库来实现此解决方案。

1

验证您的项目是否符合以下要求:

  • Node.js 20 LTS 或更高版本。

  • Docker和Docker Compose(建议运行full 堆栈)。

  • MongoDB Atlas 群集,M10 或更高。 Queryable Encryption在免费套餐中不可用。

  • 密钥提供商,例如 AWS KMS或用于离线开发的本地提供商PSP_KMS_PROVIDER=local。

  • 自动加密共享库。从MongoDB Enterprise下载并点MONGODB_CRYPT_SHARED_LIB_PATH 。如果未设置,后端将回退到常用安装路径。

2

使用数据库设置命令 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希望本地提供商具有此大小。

3

该平台是事件驱动的。业务和合合规事件通过事件总线流动。引擎由 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 合规状态。

4

在启动堆栈之前,在根 .env 中设置以下值:

  • MongoDB Atlas: MONGODB_URI, MONGODB_DB_NAME

  • QE 共享库: 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 页面。

5

安装依赖项,配置数据库并为其设定种子,然后启动堆栈。 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。

运行后,可在以下位置使用这些服务:

Leafy Pay应用程序演示用户界面

图 4。 Leafy Pay应用程序演示用户界面

点击放大

setup:db 需要具有有效KMS凭证的实时 M10 或更高级别的Atlas 集群。该演示仅使用合成数据。

6

对于生产或共享环境,请部署到 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