在 AWS 上生产化部署 EDC:隔离、托管服务与分层安全

2026-07-18 33 预计阅读时间: 1 分钟
来源: aws.amazon.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

把 Eclipse Dataspace Components(EDC)连接器部署到 AWS,真正困难的部分通常不是启动容器,而是划清信任边界:哪些接口可以暴露、控制流与数据流如何隔离、状态保存在哪里,以及某一层防护失效后还有什么机制可以阻止横向移动。面向生产环境,架构应围绕隔离、托管服务和分层安全做明确取舍。

先拆开控制流与数据流

EDC 连接器通常同时承载协商、策略执行、资产管理和数据传输等职责。生产架构不宜把所有能力塞进一个拥有广泛权限的运行单元。可以按职责拆成两类工作负载:

  • 控制平面处理目录、合同协商、策略与传输编排,只开放必要的协议和管理接口。
  • 数据平面执行实际的数据读取与传输,只获得访问指定数据源和目标端的权限。

这种拆分的价值不只是扩缩容。控制平面保存业务协议状态,而数据平面接触真实数据;两者的攻击面、资源消耗和 IAM 权限并不相同。数据平面发生流量突增时,可以独立扩容,也不必把控制平面的数据库凭证交给每个传输实例。

在 AWS 上可以这样实践:将两类工作负载部署到不同的 EKS Namespace、节点组或 ECS Service,并分别绑定 IAM Role。对隔离要求更高的场景,可以进一步使用独立 AWS 账户或 VPC,但这会增加网络、可观测性和发布流程的复杂度。

托管服务不是替代架构,而是缩小运维面

生产连接器通常需要持久化状态、保存密钥并访问对象或关系型数据。一个可落地的 AWS 组合可以包括:

  • 使用 Amazon RDS for PostgreSQL 保存需要持久化的连接器状态,并启用多可用区、备份和静态加密。
  • 使用 AWS Secrets Manager 保存数据库口令、OAuth 客户端密钥等敏感配置。
  • 使用 AWS KMS 管理加密密钥,并通过独立密钥策略限制管理者与使用者。
  • 使用 Amazon S3 承载适合对象存储的数据资产,通过 bucket policy 和 IAM 限制数据平面只能访问指定前缀。
  • 使用 CloudWatch、OpenTelemetry 或现有监控平台收集日志、指标和追踪,但避免记录令牌、合同敏感字段和数据内容。

需要注意,采用托管服务并不会自动形成最小权限。RDS 如果允许整个 VPC 访问、S3 权限写成 s3:*,或者多个连接器共用同一个 Secrets Manager 密钥,隔离仍然只是表面上的。

用多层控制收窄每条访问路径

分层安全应覆盖入口、工作负载、网络、身份和数据,而不是只在公网入口放一个负载均衡器。

入口层可以通过 ALB、WAF、TLS 和访问日志保护公开协议端点;管理 API 则应放在私有网络中,通过 VPN、专线或受控运维入口访问。工作负载层使用非 root 容器、只读根文件系统和镜像扫描。身份层应让 Pod 或 Task 通过短期凭证访问 AWS 服务,避免把长期 Access Key 写入环境变量。

网络层需要同时考虑 Kubernetes NetworkPolicy、安全组和子网路由。它们解决的问题不同:NetworkPolicy 控制 Pod 间通信,安全组控制 ENI 或服务边界,私有子网与路由表决定流量是否能够直接到达互联网。

下面是一个可改造的 EKS 示例。它为控制平面建立默认拒绝规则,只允许入口命名空间访问协议端口,并允许数据平面访问内部编排端口。运行前需要把 Namespace、标签和端口替换为实际部署值,并确认集群网络插件支持 NetworkPolicy。

apiVersion: v1
kind: Namespace
metadata:
  name: edc
  labels:
    purpose: edc
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: control-plane-default-deny
  namespace: edc
spec:
  podSelector:
    matchLabels:
      app: edc-control-plane
  policyTypes:
    - Ingress
  ingress: []
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: control-plane-allowed-callers
  namespace: edc
spec:
  podSelector:
    matchLabels:
      app: edc-control-plane
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: ingress-system
      ports:
        - protocol: TCP
          port: 8080
    - from:
        - podSelector:
            matchLabels:
              app: edc-data-plane
      ports:
        - protocol: TCP
          port: 8181

保存为 edc-network-policy.yaml 后可以执行:

kubectl apply -f edc-network-policy.yaml
kubectl -n edc get networkpolicy
kubectl -n edc describe networkpolicy control-plane-allowed-callers

这段配置只演示入站隔离。生产环境还应设计出站白名单,并验证 DNS、RDS、S3、身份令牌端点和可观测性出口。直接启用默认拒绝出站规则可能中断名称解析或凭证获取,因此应先在预生产环境记录真实依赖,再逐项放行。

把 AWS 身份绑定到单个组件

如果运行在 EKS 上,可以使用面向 ServiceAccount 的 AWS 身份机制,让控制平面和数据平面获得不同角色。数据平面访问 S3 时,应把权限限制到具体 bucket 和前缀。下面是一份可改造的 IAM Policy;请替换账户中的 bucket 名称和数据路径。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListOnlyApprovedPrefix",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::partner-data-prod",
      "Condition": {
        "StringLike": {
          "s3:prefix": ["exports/customer-a/*"]
        }
      }
    },
    {
      "Sid": "ReadApprovedObjects",
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::partner-data-prod/exports/customer-a/*"
    }
  ]
}

不要把这份策略附加到整个集群节点角色。应将它绑定到数据平面的专用角色,并让对应 ServiceAccount 使用该角色。这样即使控制平面容器被利用,攻击者也不能直接继承读取数据资产的权限。

上线前检查架构是否真的隔离

生产评审可以围绕几条具体问题展开:公开入口是否只有协议必需端点;管理 API 是否保持私有;控制平面与数据平面是否使用不同身份;数据库、对象存储和密钥权限是否限制到单个连接器;网络规则是否经过连通性测试;日志是否会泄露令牌或业务数据;备份能否恢复;密钥和证书是否有轮换流程。

更强的隔离通常意味着更多账户、VPC、角色和部署流水线。不要一开始就追求最复杂的拓扑,而应根据数据敏感度、合作方数量和故障影响范围选择边界。最低要求是让每条访问路径都有明确所有者、最小权限和可审计记录,并确保任意一层失效时,下一层仍能限制影响范围。


相关推荐