企业出海受监管文件交换(MFT)架构实战:托管 SFTP/AS2/EDI 选型、零信任加固与合规举证(2026版)
Meta Description: 出海企业的对账文件、EDI 报文、银行回单怎么安全交换?
- 一句话结论:MFT 不是"传文件",是一条需要被审计的第三方通道
- 本文边界:与站内相邻五篇怎么分工
- 为什么 2023 年之后 MFT 从"运维小事"变成"董事会事项"
- 协议族选型:SFTP 是默认,AS2 是 EDI 的硬门槛
- 三条技术路线:商业 MFT、云厂商托管、自建开源
- 参考架构:三条边界、单向下沉、可用性靠云
- 多云能力对照:托管能力其实很不均匀
- 实操一:托管 SFTP 端点从零到可用的 8 条命令
Meta Description: 出海企业的对账文件、EDI 报文、银行回单怎么安全交换?本文给出托管 SFTP/AS2 与自建 MFT 的三路线选型表、参考架构图、AWS Transfer Family 实操命令、12 项加固清单、按协议计费的成本模型与合规举证方法。
关键词: 托管 SFTP、MFT 文件传输、AS2 EDI、多云文件交换、文件传输合规
一句话结论:MFT 不是"传文件",是一条需要被审计的第三方通道
如果伙伴数量在 50 家以内、文件量低于 2 TB/月、协议只需要 SFTP,用云厂商托管端点(AWS Transfer Family 一类)最划算:一台端点月费约 216 美元,省掉的是补丁责任、主机密钥轮换和 HA 建设。一旦出现 AS2/EDI 高频报文(每月十万条以上)或需要伙伴自助门户与审批流,商业 MFT 或自建网关更合适。所有路线的共同底线只有三条:端点必须落在私网、协议必须收敛到最小集合、每一次读写都必须留下可查询的审计证据。
很多团队把 MFT(Managed File Transfer,受管文件传输)当成"装个 SFTP 服务器"的运维小事,直到某天审计问一句"上个月给德国客户的退货明细是谁传的、传了哪些字段、有没有被改过",才发现整条链路只有 auth.log 里一行 Accepted publickey。文件通道的特殊性在于:它是企业与外部伙伴之间唯一长期开放的双向数据入口,既承载最敏感的数据(对账、薪资、医疗、卡数据),又由外部方发起连接,天然处在信任边界上。
本文按"选协议 → 选路线 → 搭架构 → 加固 → 算钱 → 举证"的顺序展开,所有命令均在 AWS 侧实测可用,价格取自官方计价口径(2026 年 10 月核对,36 个区域同价)。
本文边界:与站内相邻五篇怎么分工
| 站内文章 | 它讲的那一层 | 本文只讲的那一层 |
|---|---|---|
| 《多云网络互通与 Transit 架构》 | 专线/VPN/TGW,链路怎么通 | 通了之后,伙伴的文件怎么进来、怎么被验收 |
| 《混合云存储网关》 | NAS/SMB 与对象存储的协议翻译 | 内部系统之间的搬运,不是外部伙伴的接入 |
| 《跨云对象存储与数据湖》 | 桶、生命周期、数据湖分层 | 只把 S3/OSS/COS 当作"落地区",不重复存储选型 |
| 《GDPR 跨境传输技术落地》 | 法律机制(SCC)与跨境同步 | 文件通道本身的技术控制与证据链 |
| 《多云统一出网与私网访问》 | 出向流量收敛 | 本文讲入向:伙伴连进来 |
一句话区分:别人讲"数据在路上怎么走",本文讲"谁把文件放进来、放进来之后凭什么相信它、出了事怎么自证"。
为什么 2023 年之后 MFT 从"运维小事"变成"董事会事项"
2023 年是文件传输产品被集中攻击的一年。MOVEit Transfer 的漏洞(CVE-2023-34362)被 Cl0p 团伙做成批量利用工具,数千家使用该产品的机构在几周内被拖走数据,受害者里包括大量政府机构、银行和大学——他们并不是安全投入不足,而是共用同一款边缘软件,且这款软件直接暴露在公网、直接持有敏感文件。同年 GoAnywhere MFT 也出现被利用的漏洞(CVE-2023-0669)。这两起事件给出了同一个结构性结论:MFT 是"高价值数据 + 公网暴露 + 老旧代码"的三重叠加,它的风险不是来自某一次配置失误,而是产品形态本身。
把失败模式拆开看,企业踩的坑集中在这三类:
| 失败模式 | 典型症状 | 根因 | 代价 | 控制点 |
|---|---|---|---|---|
| 边缘产品漏洞被批量利用 | 一夜间大量文件被压缩打包外传 | 公网直挂 + 单点软件缺陷 + 补丁窗口以月计 | 数据外泄通报、监管罚款、客户流失 | 端点入私网、WAF/IPS 前置、补丁 SLA 写进合同 |
| 长期密钥与明文协议遗留 | 伙伴方脚本里还是 2013 年的 FTP 账号 | 兼容性优先,没人敢动老伙伴 | 凭据泄露后无法定位影响面 | 每伙伴独立账号、强制密钥、协议黑白名单 |
| 影子通道 | 业务用网盘、邮件、微信传对账文件 | 正式通道太慢、申请流程太长 | 数据出境无记录,审计直接判不合格 | 伙伴自助门户 + 审批流 + 通道唯一化 |
托管化的真正价值不是省运维,而是把"补丁责任、可用性责任、日志责任"写进 SLA 合同。 当你把端点换成云厂商的托管服务,MOVEit 式的"我来打补丁"就变成了"厂商打补丁、我核对版本",这在合规问答里是两种完全不同的答案。但代价是:你必须接受它的计费形状(按协议、按小时)和它的能力边界(例如中国区没有该服务)。这两点后文都会算清楚。
协议族选型:SFTP 是默认,AS2 是 EDI 的硬门槛
选协议不是技术偏好问题,而是伙伴的接入要求决定的。北美大型零售商(如 Walmart)的 EDI 接入普遍要求 AS2,欧洲汽车行业常见 OFTP2,银行与物流多数接受 SFTP,只有少数遗留伙伴还抱着 FTPS。
| 协议 | 默认端口 | 典型伙伴 | 传输加密 | 认证方式 | 主要坑 | 建议 |
|---|---|---|---|---|---|---|
| SFTP(SSH2) | 22 | 银行、物流、多数 SaaS | SSH 通道加密,可叠加 PGP | SSH 公钥 | 对象存储后端不支持 chmod/rename 覆盖 | 默认首选 |
| FTPS(显式) | 21 / 990 | 部分欧洲老伙伴 | TLS | 用户名密码 + 证书 | 数据通道端口随机,防火墙极难放行 | 仅作兼容 |
| FTP(明文) | 21 | 2010 年代的遗留脚本 | 无 | 明文 | 任何合规框架都直接否决 | 一律禁用 |
| AS2 | 443 | 北美零售 EDI | S/MIME 签名 + 加密 | 双方证书交换 | 证书过期即全量失败;MDN 同步/异步差异 | EDI 必选 |
| HTTPS / REST | 443 | 现代 SaaS、开放平台 | TLS + OAuth | Token | 大文件需断点续传 | 新伙伴优先 |
| OFTP2 | 443 | 欧洲汽车供应链 | TLS + 签名 | 证书 | 国内运维几乎无人熟悉 | 欧洲车企专用 |
EDI 场景再补一层常识,方便与业务方对齐:850 是采购订单,855 是订单确认,856 是发货通知(ASN),810 是发票,997 是功能性确认。它们的共同特点是报文小而频率高,而这个特征会直接击穿按条计费的托管方案——后文成本章节会算这笔账。
三条选型纪律:
- 协议数量最小化。 每多开一个协议端点就多一份攻击面和一份月费,能用 SFTP 解决的绝不开 FTPS。
- 新旧伙伴分治。 新伙伴一律 SFTP(密钥 + 源 IP 白名单),老伙伴在"最后期限 + 迁移支持"的双重约束下改造,不要为了兼容把 FTP 重新打开。
- AS2 单独规划证书生命周期。 AS2 的失败几乎全部来自证书过期或信任链变更,而不是网络问题。
三条技术路线:商业 MFT、云厂商托管、自建开源
MFT 市场上有三类完全不同的东西,很多选型会死在"拿 A 的价格比 B 的能力"上。
| 维度 | 商业 MFT(MOVEit / GoAnywhere / Cleo 一类) | 云厂商托管(AWS Transfer Family 一类) | 自建开源(OpenSSH + SFTPGo + OpenAS2) |
|---|---|---|---|
| 初始投入 | 许可费 + 实施费,通常五位数美元起 | 近乎为零,开通即用 | 服务器费 + 集成工时 |
| 边际成本 | 按用户/按伙伴,扩容要再谈许可 | 按协议 × 小时 + 按 GB + 按消息 | 只增机器与带宽 |
| 协议覆盖 | 全协议(SFTP/FTPS/AS2/OFTP2/HTTPS) | SFTP/FTPS/FTP/AS2(分产品,按协议计费) | 取决于你拼装多少组件 |
| 伙伴自助门户 | 内建,可做审批、过期、下载回执 | 需自研(或用其 Web App 单元) | 需自研 |
| 加密与密钥 | 内建 PGP、证书库、密钥托管 | PGP 工作流步骤 + KMS/Secrets Manager | 自己接 GPG/KMS |
| 高可用 | 集群部署,成本高 | 多 AZ 免费,SLA 由云承担 | 需自己做双机/负载均衡 |
| 补丁责任 | 自己(这是 2023 年事故的根因) | 云厂商 | 自己,且组件越多越重 |
| 审计举证 | 内建报表,审计员熟悉 | CloudTrail 数据事件 + 结构化日志 | 自己拼日志,最容易断链 |
| 团队要求 | 需要专职 MFT 管理员 | 一个懂 IAM 的云工程师 | 需要运维 + 开发 |
| 迁移成本 | 高(数据与配置都在产品里) | 中(退出时凭 S3 里的原始文件) | 低(都是标准协议) |
三条结论,按企业规模对号入座:
- 伙伴 ≤ 50 家、协议 ≤ 2 种、无 EDI:选云厂商托管。你的真实成本是"每月 216 美元起 + 一个工程师每周两小时"。
- 有 EDI(AS2)、伙伴 ≥ 100 家、需要伙伴自助门户与审批:选商业 MFT。此时你买的是工作流、门户和审计报表,不是传输能力。
- 文件量极大(TB/月级)、协议老旧但无法拒绝、预算极紧:自建 + 统一网关。但要接受一个前提——你必须有人能对
sshd_config、证书和日志负责。
参考架构:三条边界、单向下沉、可用性靠云
先给全景。整个链路的要害不是"文件能不能传进来",而是传进来之后它在哪个区、以什么身份被谁读走。所以架构上强制切三段:
graph TD
A[外部伙伴 SFTP/AS2 客户端] -->|公网 443/22| B[托管端点 私网 ENI + 安全组]
B --> C[落地区 对象存储 开启版本与对象锁]
C --> D[工作流 PGP 解密 恶意文件扫描]
D --> E[分发区 内部系统 只读挂载]
D --> F[审计 CloudTrail 数据事件 结构化日志]
F --> G[SIEM 告警 与 Athena 取证]
H[Secrets Manager 主机密钥/伙伴密钥] --> B
I[KMS CMK 静态加密] --> C
对应的物理视图(ASCII 全景图):
┌──────────────┐ ┌──────────────────────────────────────────────┐
│ 外部伙伴 │ │ 云上 VPC 10.20.0.0/16 │
│ bank-sftp │ TLS │ ┌────────────┐ ┌─────────────────────┐ │
│ retail-as2 │───────▶│ │ 托管端点 │──▶│ 落地区 S3 桶 │ │
│ logistics │ 443 │ │ 私网 ENI │ │ /inbound/<partner>/ │ │
└──────────────┘ │ │ SG 白名单 │ │ 版本 + 对象锁 + KMS │ │
│ └─────┬──────┘ └──────────┬──────────┘ │
│ │ │ │
│ ┌────▼─────────────────────▼──────────┐ │
│ │ 工作流 解密 → 扫描 → 校验 → 重命名 │ │
│ └────┬─────────────────────┬──────────┘ │
│ │ │ │
│ ┌─────▼──────┐ ┌─────▼──────────┐ │
│ │ 分发区 │ │ 审计桶 │ │
│ │ EFS/内网API │ │ CloudTrail 事件 │ │
│ └────────────┘ └────────────────┘ │
└──────────────────────────────────────────────┘
四条设计原则,每一条都对应一次真实事故:
- 端点只认私网。 托管服务的"公网端点"类型往往不允许挂安全组,意味着你无法做源 IP 白名单;要白名单就必须选 VPC 端点类型(挂 ENI + 安全组),前面再放 WAF/NLB。
- 落地区只写不读。 伙伴账号的角色只允许
PutObject到自己前缀,禁止GetObject、禁止ListBucket。伙伴永远看不到别人的文件,也看不到自己的历史文件(防止被当作数据中继)。 - 解密后另写一份对象。 不要原地覆盖密文,也不要让下游直接读密文前缀。工作流把解密结果写到
/decrypted/,附上原始对象的 key 与校验和——这是事后证明"这份明文确实来自那份密文"的唯一办法。 - 落地区与业务区之间的搬运只走单向。 内部系统从分发区读,绝不回写落地区;需要回传给伙伴的文件走独立的
/outbound/前缀和独立角色。方向分离是防止勒索软件从伙伴侧横向进入业务网的最低成本手段。
多云能力对照:托管能力其实很不均匀
做多云的企业最容易被"某云有、另一云没有"打乱架构。下表只列机制与能力有无,不列各家的实时报价(不同账号折扣差异过大,任何具体数字都可能是编的)。
| 能力 | AWS | 阿里云 | 腾讯云 | 商业 MFT |
|---|---|---|---|---|
| 托管 SFTP 端点 | Transfer Family,36 个区域 | 无对位的托管 SFTP 产品,通行做法是 ECS 自建(OSS/NAS 落地) | 无对位的托管 SFTP 产品,通行做法是 CVM 自建(COS/CFS 落地) | 有 |
| 托管 AS2(EDI) | 有,按消息计费 | 需自建(OpenAS2 等) | 需自建 | 有 |
| 伙伴自助 Web 门户 | 有 Web App 形态(按会话单元计费) | 需自研 | 需自研 | 有,且含审批 |
| 对象存储落地 | S3 | OSS | COS | 各自接 |
| 对象锁 / WORM | S3 Object Lock | OSS 保留策略 | COS 版本控制 + 保留策略 | 部分支持 |
| 审计数据事件 | CloudTrail S3 数据事件 | ActionTrail + OSS 访问日志 | CloudAudit + COS 日志 | 内建报表 |
| 私网端点 | VPC Endpoint 类型(可挂 SG) | 需自建 + SLB | 需自建 + CLB | 自建 |
| 中国内地可用 | 不可用(无 cn-* 区域) | 可用 | 可用 | 可用 |
两个必须提前知道的限制:
- Transfer Family 在
cn-*区域不存在。 面向中国内地伙伴的接入必须落在新加坡、香港或东京,再从那里用专线/CEN 回内地——这就不再是"传文件",而是一次跨境传输,合规链条要同步拉长。 - "公有云没有托管 SFTP"不等于不能用。 阿里云/腾讯云的做法是 ECS/CVM 上跑 SFTPGo 或 OpenSSH,落地到 OSS/COS。能力上完全够用,代价是补丁、双机、审计这三件事回到你自己身上。
实操一:托管 SFTP 端点从零到可用的 8 条命令
以下命令按执行顺序排列,全部为 AWS CLI v2。先确认当前支持的安全策略清单,不要凭记忆写死策略名(厂商会新增,旧名可能被标记为不推荐):
// 第 0 步:先看当前可用的传输安全策略,取最新一条填到后续命令
aws transfer list-security-policies --query "SecurityPolicyNames" --output text
第 1 步,创建 VPC 端点(不是公网端点)。 只有 VPC 端点才能挂安全组做源 IP 白名单:
aws transfer create-server \
--protocols SFTP \
--endpoint-type VPC \
--endpoint-details SubnetIds=subnet-0123456789abcdef0,VpcId=vpc-0123456789abcdef0,AddressAllocationIds=eipalloc-0123456789abcdef0 \
--identity-provider-type SERVICE_MANAGED \
--logging-role arn:aws:iam::111122223333:role/transfer-logging \
--security-policy-protocols SFTP=TransferSecurityPolicy-2024-01 \
--tags Key=env,Value=prod Key=owner,Value=integration-team
--endpoint-details 里必须显式给 SubnetIds 和 VpcId,想固定出口 IP 再给 AddressAllocationIds(伙伴侧要加白名单时就需要)。多 AZ 最多三个子网,不额外收费。
第 2 步,创建伙伴用户并绑定公钥。 注意:create-user 只在 SERVICE_MANAGED 身份源下可用;如果用 Lambda/API Gateway/AD 做身份源,用户由那边托管:
aws transfer create-user \
--server-id s-0123456789abcdef0 \
--user-name partner-acme-sftp \
--role arn:aws:iam::111122223333:role/transfer-partner-acme \
--home-directory /acme-bucket/inbound/acme \
--home-directory-type PATH \
--ssh-public-key-body file://acme_id_ed25519.pub
每个伙伴一个用户、一把密钥,绝不共用。密钥丢失时只删这一个用户,影响面可控。
第 3 步,给端点绑自定义域名。 伙伴的防火墙白名单通常只放行域名,不放行 *.transfer.amazonaws.com。这一步是纯打标签 + 建 CNAME:
aws transfer tag-resource \
--arn arn:aws:transfer:ap-southeast-1:111122223333:server/s-0123456789abcdef0 \
--tags Key=transfer:customHostname,Value=sftp.acme-gateway.example.com \
Key=transfer:route53HostedZoneId,Value=Z0123456789ABCDEFGHIJ
打标签后,端点会给出一个规范域名(形如 s-xxxx.server.transfer.<region>.amazonaws.com),在 Route53 里建 CNAME 指过去即可。用 CLI/CDK 创建的端点是公共端点时,没有这个标签就永远看不到自定义域名——这是最常见的"控制台能设、代码设不了"的困惑来源。
第 4 步,修掉 S3 后端最常见的客户端报错。 S3 不支持 chmod/chown/chgrp,也不支持 rename 覆盖已有对象;很多图形客户端(WinSCP、FileZilla)上传后会尝试 SETSTAT,于是出现"文件传上去了但客户端报错":
aws transfer update-server \
--server-id s-0123456789abcdef0 \
--protocol-details SetStatOption=ENABLE_NO_OP
设成 ENABLE_NO_OP 后,SETSTAT 请求被静默接受而不执行,客户端不再报错。如果需要真正的 POSIX 语义(权限、重命名覆盖),后端要换成 EFS 而不是 S3。
第 5 步,打开结构化日志。 结构化日志是 JSON 行,含 session_id、username、bytes_transferred、command,比传统日志好用得多——审计要查"谁在几点传了多大文件",直接查这个字段,不用正则解析:
aws transfer update-server \
--server-id s-0123456789abcdef0 \
--structured-log-destinations arn:aws:logs:ap-southeast-1:111122223333:log-group:/aws/transfer/s-0123456789abcdef0
第 6 步,打开对象级审计(这一步最容易被漏掉)。 CloudTrail 默认只记管理事件,不记 S3 的对象读写。没有数据事件,"谁下载了哪份对账文件"这个问题永远答不出来:
aws cloudtrail put-event-selectors \
--trail-name org-trail \
--advanced-event-selectors '[{"Name":"S3Objects","FieldSelectors":[{"Field":"eventCategory","Equals":["Data"]},{"Field":"resources.type","Equals":["AWS::S3::Object"]},{"Field":"resources.ARN","StartsWith":["arn:aws:s3:::acme-bucket/inbound/"]}]}]'
按前缀过滤是控制成本的关键:整桶数据事件的费用会随文件数线性上升,只勾 inbound/ 和 outbound/ 两个前缀通常能省掉一个数量级。
第 7 步,用最小权限角色收口。 伙伴角色只给三件事:写自己前缀、读自己前缀(如果允许回读)、列自己前缀:
aws iam put-role-policy --role-name transfer-partner-acme --policy-name acme-inbound-only --policy-document '{
"Version":"2012-10-17",
"Statement":[
{"Effect":"Allow","Action":["s3:PutObject"],"Resource":"arn:aws:s3:::acme-bucket/inbound/acme/*"},
{"Effect":"Allow","Action":["s3:ListBucket"],"Resource":"arn:aws:s3:::acme-bucket","Condition":{"StringLike":{"s3:prefix":["inbound/acme/*"]}}}
]}'
注意不要给 s3:GetObject,也要不要给 s3:DeleteObject——伙伴误删或恶意删除会直接破坏对账证据链,清理交给生命周期规则。
第 8 步,用伙伴的视角做一次验收。 不要用自己的管理机测,用一台干净主机模拟伙伴侧:
// -P 指定端口;批处理模式下可 -b 指定命令文件做自动化验收
sftp -P 22 -i ./acme_id_ed25519 -o StrictHostKeyChecking=accept-new \
[email protected] <<< "put ./test-2026-10-31.csv"
验收看三件事:文件落在预期前缀、structured log 里有对应 session_id、CloudTrail 数据事件里出现 PutObject。三者都对,才算这条通道"可用且可举证"。
实操二:PGP 解密、恶意文件扫描与路由的托管工作流
企业最常被审计追问的一点是"文件在落地区是密文还是明文"。答案是:落地区必须是密文,解密在托管的受控步骤里做。托管工作流可以直接声明解密步骤,不需要自建一台解密机:
{
"Steps": [
{ "Type": "Decrypt", "DecryptStepDetails": {
"Type": "PGP", "Name": "decrypt-partner-pgp",
"SourceFileLocation": "${original.file}",
"OverwriteExisting": "FALSE",
"DestinationFileLocation": { "S3FileLocation": { "Bucket": "acme-bucket", "Key": "decrypted/${original.file}" } }
}},
{ "Type": "Tag", "TagStepDetails": { "Name": "tag-partner", "Tags": [
{ "Key": "partner", "Value": "acme" },
{ "Key": "stage", "Value": "decrypted" }
], "SourceFileLocation": "${original.file}" }},
{ "Type": "Custom", "CustomStepDetails": {
"Name": "notify-integration", "Target": "arn:aws:lambda:ap-southeast-1:111122223333:function:mft-notify",
"TimeoutSeconds": 60, "SourceFileLocation": "${original.file}"
}}
]
}
三个工程要点:
- 解密步骤支持 PGP,按解密后的字节数计费(每 GB 0.10 美元,单文件最小按 1 MB 计)。这个价格在文件量小时可以忽略,在 TB 级时是成本表里第二大的项。
- 解密失败必须能告警。 工作流的
OnExceptionSteps里挂一个Tag+ SNS 通知,否则伙伴用了错误密钥加密时,文件会永远躺在落地区没人发现。 - 恶意文件扫描放在解密之后、分发之前。 密文扫不出任何东西,扫描必须在明文副本上做;扫描结论(通过/隔离)要作为对象标签写回,下游只读
av=clean的对象。
如果不想自己维护杀毒引擎,可以用云厂商的对象存储恶意文件防护(如 GuardDuty 的 S3 恶意文件防护),它在对象写入时异步扫描并打标签,正好接在上面的 Tag 步骤之后。
文件名幂等是最后一道保险。 伙伴重复上传同一份对账文件是常态,落地区按 partner/yyyy/mm/dd/文件名 分区,配合"同名对象写新版本"(开版本控制)而不是覆盖,才能既保留历史又让下游只处理最新版本。
安全加固 12 项清单(每项都给验证方法)
这份清单按"攻击者从外部往里走"的顺序排列,前六项决定"能不能进来",后六项决定"进来之后能干什么、留下什么"。
| # | 加固项 | 风险 | 做法 | 验证方法 |
|---|---|---|---|---|
| 1 | 端点入私网 | 公网端点无法挂安全组,等于全网可连 | 选 VPC 端点类型,挂 ENI + 安全组 | describe-server 看 EndpointType=VPC |
| 2 | 协议收敛 | 明文 FTP 泄露凭据与内容 | 只开 SFTP;AS2 单独端点 | describe-server 的 Protocols 只有 SFTP |
| 3 | 每伙伴独立账号 | 共用账号导致影响面不可控 | 一伙伴一用户一密钥 | list-users 数量 = 伙伴数 |
| 4 | 禁密码认证 | 弱口令爆破 | 只用公钥;自定义身份源也不开 password | 用错误密码尝试应被拒 |
| 5 | 源 IP 白名单 | 密钥泄露后全球可连 | 安全组按伙伴出口 IP 放行 + WAF | 从非白名单 IP 连接应超时 |
| 6 | 主机密钥托管与轮换 | 主机密钥固定,中间人风险 | 密钥存 Secrets Manager,配多把做无中断轮换 | describe-server 看 HostKeyFingerprint 变化 |
| 7 | IAM 最小权限 | 伙伴横向读取他人文件 | 只给自身前缀的 PutObject/ListBucket | iam simulate-principal-policy 验证越权被拒 |
| 8 | 落地区对象锁 | 文件被删或被改写,证据链断裂 | 开版本控制 + 合规模式对象锁 | 尝试删除已锁对象应失败 |
| 9 | 静态加密 | 存储介质泄露 | SSE-KMS,按环境分 CMK | 对象 ServerSideEncryption=aws:kms |
| 10 | 恶意文件扫描 | 伙伴侧被感染,恶意文件进入内网 | 解密后扫描并打 av=clean 标签 | 上传 EICAR 测试文件应被隔离 |
| 11 | 审计留存 | 答不出"谁在何时传了什么" | CloudTrail 数据事件 + 结构化日志,留存 ≥ 6 个月 | Athena 能查出指定文件的 PutObject 记录 |
| 12 | 证书与密钥到期监控 | AS2 证书过期导致全量交换失败 | 到期前 30/7/1 天三级告警 | 告警规则里能看到证书到期指标 |
五条容易被忽略但代价最高的补充:
- AS2 的证书必须双份在线。 轮换时同时上传新旧两张证书,等伙伴都切完再摘旧的,否则切换当天所有报文验签失败。
- 禁止伙伴回读历史文件。 很多"数据中继"事故是伙伴账号被攻破后,攻击者用合法凭据把历史文件全下载走。
- 文件大小上限要显式设置。 单对象 5 TB 是服务上限,不是你的业务上限;业务上限应设在 2 GB 一类,超过走人工。
- 速率限制与并发会话上限。 一个伙伴的脚本死循环能把端点打满,多 AZ 也救不了带宽。
- 新增伙伴必须双人审批。 建用户、发密钥、加白名单三个动作分开授权,避免一个人就能开一条对外通道。
成本模型:按协议计费的形状决定了你的架构
托管 MFT 的计费不是"按机器",而是按协议 × 小时 + 按流量 + 按消息。这个形状会直接扭曲架构决策,所以必须先把账算清。
| 计费项 | 单价(美元) | 换算成直觉 |
|---|---|---|
| SFTP / FTPS / FTP / AS2 端点 | 0.30 / 小时 / 每个协议 | 216 / 月 / 协议,2,592 / 年 |
| 上传 | 0.04 / GB | 1 TB 上传 = 40 |
| 下载 | 0.04 / GB | 1 TB 下载 = 40,往返 1 TB = 80 |
| PGP 解密步骤 | 0.10 / GB | 按解密后字节计,单文件最小 1 MB |
| AS2 消息 | 0.01 / 条(前 10 万 / 月),之后 0.005 / 条 | 10 万条 = 1,000 / 月 |
| SFTP 连接器(主动拉取) | 0.001 / 次 + 0.40 / GB | 从伙伴侧主动拉文件时用 |
| 伙伴 Web 门户 | 0.50 / 小时 / 单元 | 1 单元 = 250 个唯一会话 / 5 分钟 |
| 多 AZ 部署 | 免费(最多 3 个 AZ) | 高可用不额外收费 |
这套价格在 36 个区域完全一致(含 GovCloud),所以"哪个区域便宜"在这里是个伪问题——选区域只看伙伴延迟与合规,不看价差。
三个真实场景的月账单(不含存储与出口流量):
| 场景 | 协议 | 月流量 | 报文量 | 计算过程 | 月成本 |
|---|---|---|---|---|---|
| A 单伙伴对账文件 | SFTP | 上传 100 GB | 无 | 216 + 100×0.04 + 100×0.10 | 230 |
| B 零售 EDI 接入 | SFTP + AS2 | 上传 500 GB / 下载 100 GB | 5 万条 | 432 + 20 + 4 + 50 + 500 | 1,006 |
| C 多伙伴 + 高频 EDI | SFTP + FTPS + AS2 | 上传 400 GB | 20 万条 | 648 + 16 + 40 + 1,500 | 2,204 |
看懂这张表,三个结论会自己浮出来:
- 闲置端点也在烧钱。 一个测试用的 SFTP 端点,即使一个月零流量,也是 216 美元。测试完立刻
delete-server,这是最容易拿回来的一笔钱。 - AS2 是成本放大器。 场景 C 里,报文费 1,500 美元占了总成本的 68%,而文件本身只有 400 GB。当 AS2 报文量超过每月 10 万条时,按条计费必然不划算,此时要么自建 OpenAS2,要么走商业 MFT 的包年许可——这是本文最重要的一条成本结论。
- 多 AZ 免费,别自己造 HA。 自建双机要负载均衡、共享存储、会话同步,这些工时远超托管端点的月费。
再给一张自建 vs 托管的年度总成本对照,把"人力"显式计入(这是最常被漏掉的项):
| 项目 | 自建(ECS/CVM + SFTPGo) | 云托管(Transfer Family) |
|---|---|---|
| 计算资源 | 2 台 × 30–45 / 月 ≈ 720–1,080 / 年 | 含在端点费内 |
| 端点/协议费 | 0 | 216 × 12 = 2,592 / 年 |
| 存储与备份 | 100–300 / 年 | 100–300 / 年 |
| 补丁、HA、证书运维人力 | 约 0.15 FTE ≈ 14,400 / 年 | 约 0.02 FTE ≈ 1,900 / 年 |
| 审计报表开发 | 一次性 20–40 人时 | 基本为零(日志现成) |
| 年度合计 | 约 15,300–15,800 | 约 4,600–4,800 |
结论很清楚:在伙伴数量中等、协议不超过两种的情况下,托管方案的年度总成本约为自建的三分之一,差额几乎全部来自人力。反过来说,如果企业已有 7×24 运维团队、自建平台还能被多个系统摊薄(例如同时承载内部批量传输),自建的边际成本会显著下降——这时"自建"不是省钱的错,而是没算清账的错。
合规举证:把"我们加密了"变成"这是证据"
审计现场最无效的回答是"我们用了加密传输"。有效回答必须能当场打开一个查询,给出时间、主体、对象、动作、结果五要素。下表把常见框架的条款映射到可采集的证据。
| 框架 | 关键要求 | 需要的证据 | 采集方式 |
|---|---|---|---|
| PCI DSS 4.0 · 4.2.1 | 持卡人数据经开放网络传输时使用强加密 | 协议版本、密码套件、证书指纹 | 端点 SecurityPolicy 配置快照 + 季度扫描报告 |
| PCI DSS 4.0 · 3.5.1 | 静态存储的 PAN 不可读 | 加密算法、密钥归属 | 对象 ServerSideEncryption=aws:kms + CMK 策略 |
| PCI DSS 4.0 · 8.4.2 | 进入 CDE 的所有访问启用 MFA | 认证方式配置 | 身份源配置(禁用密码 + 密钥/证书) |
| PCI DSS 4.0 · 10.2 | 记录对持卡人数据的访问 | 逐对象读写日志 | CloudTrail S3 数据事件(按前缀过滤) |
| HIPAA · 164.312(e)(1) | 传输过程中的完整性控制 | 传输校验、失败重传记录 | 工作流执行记录 + 对象 ETag/校验和 |
| HIPAA · 164.312(b) | 审计控制 | 主体与动作的关联 | 结构化日志的 username + session_id |
| 等保三级 · 通信传输 | 通信过程完整性与保密性 | 国密/TLS 配置、链路加密 | 端点策略 + 专线加密配置 |
| 等保三级 · 安全审计 | 审计记录留存不少于 6 个月 | 日志保留策略与检索能力 | 日志组保留期 + Athena 查询演示 |
| GDPR · Art.32 | 适当的技术措施保障安全 | 加密、访问控制、可恢复性 | 上述证据 + 恢复演练记录 |
| GDPR · 第五章 | 跨境传输的合法机制 | SCC 签署件与传输清单 | SCC 存档 + 文件流转台账 |
| SOC 2 · CC6.1 / CC7.2 | 逻辑访问控制与监控 | 权限矩阵 + 异常告警记录 | IAM 策略快照 + SIEM 告警样例 |
有了数据事件,"谁在什么时候把哪份文件传上来"就是一条 SQL 的事:
SELECT eventtime,
useridentity.arn AS actor,
element_at(requestparameters, 'bucketName') AS bucket,
element_at(requestparameters, 'key') AS object_key,
element_at(requestparameters, 'bytesTransferredIn') AS bytes_in,
sourceipaddress
FROM cloudtrail_logs
WHERE eventsource = 's3.amazonaws.com'
AND eventname IN ('PutObject', 'GetObject')
AND element_at(requestparameters, 'key') LIKE 'inbound/acme/%'
AND eventtime BETWEEN '2026-10-01' AND '2026-10-31'
ORDER BY eventtime DESC
LIMIT 100;
三份可以直接抄进审计说明书的表述:
- 传输控制:外部伙伴仅可通过 VPC 内网端点接入,协议限定为 SFTP(SSH2)与 AS2,明文 FTP 未启用;源地址受安全组白名单约束;主机密钥与伙伴密钥由密钥管理服务托管并按 90 天周期轮换。
- 数据保护:落地区对象以 KMS 客户托管密钥静态加密,开启版本控制与合规模式对象锁,保留期 X 年;明文仅在受控工作流内生成,且留存原始密文的键与校验和以供追溯。
- 可审计性:所有对象级读写经 CloudTrail 数据事件记录,保留 ≥ 6 个月并可经 Athena 检索;会话级操作记录于结构化日志,字段包含主体、会话标识、传输字节数与执行命令。
这三段话的价值在于"可验证":审计员随手挑一条要求现场演示,你都能在一个查询里给出结果。
90 天落地路线:先收口,再迁移,最后建门户
| 阶段 | 时间 | 关键动作 | 交付物 | 验收口径 |
|---|---|---|---|---|
| 一 · 摸底与试点 | 第 1–3 周 | 盘点全部对外文件通道(含网盘、邮件、微信);选 1 个伙伴试点 | 通道清单、数据分类分级、试点架构图 | 能画出全部伙伴接入路径,无遗漏通道 |
| 二 · 迁移与加固 | 第 4–6 周 | 端点入私网、协议收敛、12 项加固落地 | 加固核验表、端点与角色配置代码 | 非白名单 IP 连不上;越权读取被拒 |
| 三 · 审计与演练 | 第 7–9 周 | 数据事件接入 SIEM、证书到期告警、解密失败演练 | 举证包、告警规则、演练报告 | 抽查任一文件能给出完整读写链 |
| 四 · 门户与多云 | 第 10–13 周 | 伙伴自助申请、审批流、第二云接入 | 门户、审批流、多云接入文档 | 新伙伴开通从 5 天降到 1 天以内 |
三条实践提醒:
- 第一阶段的产出是"通道清单",不是架构图。 现实里最危险的不是自建 SFTP,而是业务私自开的网盘共享链接。
- 不要一次性迁移所有伙伴。 按"文件量 × 伙伴配合度"排序,先做配合度高的小伙伴,把流程跑顺再碰大伙伴。
- 演练必须包含"解密失败"和"证书过期"两个故障。 这两个是 MFT 最常见的线上事故,演练能提前暴露告警缺口。
总结
受监管文件交换的架构决策,本质上是在三个变量之间取舍:伙伴的协议要求、文件与报文的规模、以及你愿意承担多少运维与举证责任。 SFTP 为主、伙伴中等规模的企业,托管端点几乎总是正确答案;有 EDI 且报文高频的企业,商业 MFT 或自建 AS2 更现实;而无论选哪条路,端点入私网、协议收敛、逐对象审计这三件事都不能省——它们不是"最佳实践",是审计现场的入场券。
🚀 企业出海需要云架构咨询?通过 7.chengzicloud.cloud 联系我们,获取专属方案。我们提供多云网络与文件交换通道设计、合规举证包整理、以及从自建 MFT 到托管端点的平滑迁移服务。
相关阅读
- 多云统一出网与私网访问架构 — 出向流量收口与私网端点设计,本文的镜像面
- 混合云存储网关落地 — NAS 与对象存储的协议翻译与缓存调优
- 多云网络互通与 Transit 架构 — 专线、VPN 与跨云骨干的底座
- 跨云对象存储与数据湖 — 落地区的存储选型与生命周期
- GDPR 跨境传输技术落地 — SCC 机制与字段级脱敏的完整做法
- 多云备份与不可变存储防勒索 — 对象锁与 3-2-1-1-0 策略
- 多云 SOC:SIEM 与 SOAR 安全运营 — 把 MFT 日志接进告警与编排
- 多云密钥管理与加密策略 — CMK 分层、轮换与信封加密
本文由 7.chengzicloud.cloud 提供,点击访问首页了解更多
常见问题(FAQ)
托管 SFTP 和自建 SFTP 到底差在哪?
差的不是传输能力,而是三件事的归属:补丁、可用性、审计。托管方案里,操作系统和传输软件的漏洞由厂商修,多可用区由厂商保证,日志天然落到云厂商的审计服务;自建方案里这三件事全在你身上。价格上托管贵得多(单协议 216 美元/月),但把人力算进去,伙伴规模中等的企业用托管通常更便宜。
为什么文件上传成功了,客户端却报错?
十有八九是客户端在上传后发了 SETSTAT(改权限、改时间戳),而 S3 后端不支持 chmod、chown、chgrp、chmtime,也支持不了 rename 覆盖同名对象。把端点的 SetStatOption 设为 ENABLE_NO_OP 即可让客户端不再报错。如果业务真的依赖 POSIX 语义,后端要换成 EFS。
我们是多云架构,可以用一家云的托管端点接所有伙伴吗?
可以,而且这是常见做法:端点放一家云,落地区也放同一家云,再通过跨云专线或对象存储同步把文件送到另一家云的业务系统。但要注意两点——网络出口流量会计费;跨云复制会让"数据驻留"变复杂,如果伙伴来自欧盟,复制到第二朵云等于第二次跨境,需要重新评估合规。
AS2 证书过期会有什么后果?
全量失败,而且往往是静默失败。 证书过期后,对方的签名验证不过、MDN 回执拿不到,报文被拒;如果监控只盯"传输成功数",会看到数字突然归零而不知道原因。务必在证书到期前 30/7/1 天做三级告警,并采用"新旧双证书并行"的轮换方式。
一个账号能建多少端点,成本怎么控?
默认每账号 50 个端点(可申请提升),每端点最多 1 万用户、每用户 50 把 SSH 密钥、单端点 1 万并发会话。成本控制抓四点:删掉测试端点、只开真正需要的协议、AS2 报文量超过 10 万/月时重新评估路线、CloudTrail 数据事件按前缀过滤而不是整桶开启。
已经用 PGP 加密了,还需要存储加密吗?
需要,两者解决不同问题。PGP 保护的是"文件在传输途中和落地区被读取"这一层,密钥在伙伴手里;存储加密保护的是"介质、快照、备份被物理或越权访问"这一层,密钥在你手里。合规框架通常分别要求传输加密与静态加密,缺一项就是一条不符合项。
等保三级或 GDPR 还需要额外做什么?
等保三级除了加密传输,还要求审计记录留存不少于 6 个月、通信双方身份鉴别、数据完整性校验,这三项分别对应日志保留期配置、密钥认证、传输校验和记录。GDPR 维度则要先解决"是否跨境":把端点放在新加坡接欧盟伙伴的文件,本身就是一次传输,需要 SCC 或充分性认定支撑,并提供传输清单。
文件量多大就该考虑自建?
没有绝对的阈值,但可以用两个信号判断:一是每月 AS2 报文超过 10 万条(按条计费开始压倒许可费);二是月流量超过 5 TB 且 PGP 解密成为账单主项。此时自建的边际成本(机器 + 带宽)会低于托管的线性计费,前提是你已经有能承接补丁与双机运维的团队。