sharnsimon-devops/PayCore

GitHub: sharnsimon-devops/PayCore

一个以 Terraform 为核心的 PCI-DSS 合规支付基础设施模板,解决云上支付系统的安全与合规默认配置问题。

Stars: 0 | Forks: 0

# PayCore — PCI-DSS 合规支付微服务基础设施 ## PayCore 的功能 PayCore 提供一个完整的、生产级别的 AWS 基础设施,用于支付微服务。所有 PCI-DSS 所需的安全控制都以 Terraform 编码,确保合规性是系统的默认状态,而不是事后添加。 | 问题 | PayCore 解决方案 | |---|---| | 共享基础设施上的支付 API | 隔离的 EKS 命名空间 + 拒绝所有网络策略 | | 明文硬编码的密钥 | IRSA — Pod 获取临时 AWS 凭证,零静态密钥 | | 缺乏网络隔离 | 三层 VPC + NACL + VPC 端点(流量永不离开 AWS) | | 无审计追踪 | 多区域 CloudTrail + 7 年 S3 对象锁定(合规模式) | | 部署期间停机 | 带健康检查门的蓝/绿 Jenkins 流水线 | | 开发团队自行配置基础设施 | 所有基础设施即代码,CI/CD 阻止不合规配置 | ## 架构 ``` Internet │ HTTPS only ▼ AWS WAF + Shield ←── DDoS, OWASP top 10, rate limiting, SQLi │ API Gateway ←── auth, throttling, usage plans, access logging │ Public Subnets (ALB) ←── EKS ingress, multi-AZ │ Private Subnets (EKS) ←── deny-all network policy, IRSA, KMS secrets │ payment namespace │ transactions namespace │ Isolated Data Subnets ←── no routing from internet │ Aurora MySQL (KMS) │ ElastiCache Redis (KMS) │ Secrets Manager │ Compliance Layer │ CloudTrail (all regions) │ AWS Config (rules) │ Security Hub (PCI-DSS standard) ``` ## PCI-DSS 覆盖 | 需求 | 控制项 | 状态 | |---|---|---| | 需求 1 — 网络控制 | 三层 VPC、NACL、拒绝所有 Kubernetes 网络策略 | 通过 | | 需求 3 — 保护存储数据 | Aurora 上的 KMS CMK、ElastiCache、S3、EKS 密钥 | 通过 | | 需求 4 — 传输加密 | Aurora、Redis、API Gateway 强制 TLS | 通过 | | 需求 6 — 安全系统 | WAF OWASP + SQL 注入 + 速率限制 | 通过 | | 需求 7 — 最小权限 | IRSA、作用域化的 IAM 策略、无通配符操作 | 通过 | | 需求 8 — 访问控制 | 无共享账户、所有 API 使用 IAM 认证 | 通过 | | 需求 10 — 审计日志 | 多区域 CloudTrail、VPC 流日志、7 年 S3 对象锁定 | 通过 | | 需求 11 — 安全测试 | CI/CD 中的 tfsec + checkov,合规性门控阻止部署 | 通过 | ## 项目结构 ``` paycore/ ├── modules/ │ ├── networking/ # VPC, 3-tier subnets, NACLs, VPC Flow Logs │ ├── eks/ # EKS cluster, node groups, OIDC, IRSA roles │ ├── api-gateway/ # API Gateway, WAF Web ACL, usage plans │ ├── database/ # Aurora MySQL encrypted, ElastiCache Redis │ ├── secrets/ # Secrets Manager + KMS CMK + rotation │ ├── compliance/ # CloudTrail, Config rules, Security Hub │ └── zero-trust/ # VPC endpoints, ALB security group │ ├── kubernetes/ │ ├── namespaces/ # payment and transactions namespace manifests │ └── network-policies/ # deny-all baseline, allow-payment, allow-transactions │ ├── environments/ │ ├── dev/ # Dev wiring: smaller instances, single NAT, 1yr retention │ └── prod/ # Prod wiring: HA, Multi-AZ, 7yr retention, deletion protection │ ├── ci-cd/ │ ├── Jenkinsfile # Blue/green pipeline with compliance gate │ └── .github/workflows/terraform.yml # GitHub Actions alternative │ ├── scripts/ │ ├── bootstrap-backend.sh # Creates S3 + DynamoDB for remote state │ ├── pci-compliance-check.sh # Pre-deploy compliance gate │ └── health-check.sh # Post-deploy health verification │ ├── .tfsec.yml ├── .pre-commit-config.yaml ├── .gitignore └── README.md ``` ## 先决条件 | 工具 | 版本 | 安装方式 | |---|---|---| | Terraform | >= 1.6.0 | `brew install terraform` 或 [tfenv](https://github.com/tfutils/tfenv) | | AWS CLI | >= 2.0 | `curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip` | | kubectl | >= 1.29 | `curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"` | | eksctl | >= 0.170 | `curl --silent --location "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz"` | | tfsec | 最新版 | `curl -s https://raw.githubusercontent.com/aquasecurity/tfsec/master/scripts/install_linux.sh \| bash` | | checkov | 最新版 | `pip install checkov --break-system-packages` | | helm | >= 3.0 | `curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 \| bash` | AWS 账户要求: - 具有 `AdministratorAccess` 权限的 IAM 用户或角色(初始设置后缩小范围) - 已配置的 AWS CLI:`aws configure` - 验证:`aws sts get-caller-identity` ## 部署流程 ### 步骤 1 — 仅一次:引导远程状态 ``` chmod +x scripts/bootstrap-backend.sh ./scripts/bootstrap-backend.sh ``` 这会创建用于存储 Terraform 状态的 S3 桶和 DynamoDB 表。 ### 步骤 2 — 设置敏感变量 不要在 `.tfvars` 中放置密钥。使用环境变量: ``` export TF_VAR_db_master_username="paycoreAdmin" export TF_VAR_db_master_password="YourStr0ngP@ssword1" export TF_VAR_payment_api_key_value="sk_test_your_key_here" ``` ### 步骤 3 — 部署开发环境 ``` cd environments/dev terraform init terraform plan terraform apply ``` ### 步骤 4 — 连接 kubectl 到集群 ``` aws eks update-kubeconfig \ --region us-east-1 \ --name paycore-cluster ``` ### 步骤 5 — 应用 Kubernetes 清单 ``` kubectl apply -f kubernetes/namespaces/ kubectl apply -f kubernetes/network-policies/ ``` ### 步骤 6 — 验证合规性 ``` ./scripts/pci-compliance-check.sh ``` ### 步骤 7 — 部署生产环境 ``` cd environments/prod terraform init terraform plan terraform apply ``` ## 开发环境与生产环境对比 | 资源 | 开发环境 | 生产环境 | |---|---|---| | EKS 节点类型 | t3.medium | t3.large | | EKS 最小节点数 | 2 | 3 | | Aurora 实例 | db.t3.medium | db.r6g.large | | Aurora 实例数量 | 1(仅写入) | 2(写入 + 读取) | | Aurora 多可用区 | 否 | 是 | | Aurora 删除保护 | 关闭 | 开启 | | Redis 副本 | 1 | 2 | | NAT 网关 | 单节点(节省成本) | 每可用区一个(高可用) | | 审计日志保留 | 1 年 | 7 年 | | S3 对象锁定 | 合规模式 | 合规模式 | | WAF 规则 | 核心 + 速率限制 | 核心 + SQL 注入 + 恶意输入 | | KMS 密钥轮换 | 启用 | 启用 | | 密钥轮换 | 禁用 | 启用(30 天) | ## 安全设计 ### 零静态凭证 EKS Pod 从不持有 AWS 访问密钥。IRSA(服务账户 IAM 角色)的工作机制如下: 1. EKS 为集群创建 OIDC 提供者 2. 每个服务账户通过信任策略绑定到作用域化的 IAM 角色 3. Pod 使用投影服务账户令牌假设该角色 4. AWS STS 验证令牌并返回临时凭证 支付服务只能调用其自身密钥的 `secretsmanager:GetSecretValue` 和其自身密钥的 `kms:Decrypt`。除此之外无权访问其他资源。 ### 网络分段 三层子网,默认无跨层路由: - 公共子网:仅 ALB,不包含 EKS 节点或数据库 - 私有子网:EKS 节点,无互联网可路由 IP,通过 NAT 出站 - 数据子网:仅 Aurora 和 Redis,无互联网路由,无来自公网的路由 Kubernetes 网络策略提供第二层防护:每个 Pod 默认拒绝所有访问,必须显式允许才能与任何资源通信。 ### 全面加密 | 数据 | 加密方式 | 密钥 | |---|---|---| | Aurora 存储 | AES-256 | KMS CMK(自动轮换) | | Aurora 传输 | TLS(数据库级别强制) | ACM | | ElastiCache 存储 | AES-256 | KMS CMK | | ElastiCache 传输 | TLS | ACM | | EKS 密钥 | 信封加密 | KMS CMK | | EKS 节点卷 | AES-256 | KMS CMK | | S3 审计日志 | SSE-KMS | KMS CMK | | Secrets Manager | AES-256 | KMS CMK | ### 审计追踪 CloudTrail 将所有 AWS API 调用记录到 S3 桶,包含: - 对象锁定处于合规模式(生产环境保留 7 年)——连 root 也无法删除日志 - 启用日志文件完整性验证——可检测任何篡改 - 桶使用 KMS 加密 ## CI/CD 流水线 Jenkins 流水线强制执行严格的阶段顺序。前一阶段未通过前,后续阶段无法继续: ``` Security Scan (tfsec + checkov) ↓ [any HIGH or CRITICAL = abort] PCI-DSS Compliance Gate (pci-compliance-check.sh) ↓ [any FAIL = abort] Terraform Validate ↓ Terraform Plan ↓ Deploy Green Environment ↓ Health Check (health-check.sh) ↓ [any failure = abort, blue stays active] Manual Approval (prod only) ↓ Switch Traffic ↓ Generate Compliance Report ``` 蓝绿环境保持运行,直到绿环境的健康检查通过。只有在主分支上获得手动批准后,流量才会切换。 ## 本地运行安全扫描 ``` # tfsec — Terraform 静态分析 tfsec . --minimum-severity HIGH # checkov — 策略即代码 checkov --directory . --framework terraform # 手动运行合规门控 ./scripts/pci-compliance-check.sh # 生成模块文档 terraform-docs markdown table modules/networking/ terraform-docs markdown table modules/eks/ terraform-docs markdown table modules/database/ ``` ## 生成合规报告 成功执行 `terraform apply` 后,合规报告会自动包含在输出中: ``` cd environments/dev terraform output pci_dss_compliance_report ``` 输出: ``` { "environment" = "dev" "overall_compliance_score" = "100%" "pci_req_1_network_segmentation" = "PASS — 3-tier VPC, NACLs, deny-all default" "pci_req_10_audit_logging" = "PASS — CloudTrail all regions, VPC Flow Logs" "pci_req_11_security_scanning" = "PASS — tfsec + checkov in CI/CD pipeline" "pci_req_3_encrypted_storage" = "PASS — Aurora KMS CMK, EKS secrets encrypted" "pci_req_4_encrypted_transit" = "PASS — TLS enforced, HTTPS-only API Gateway" "pci_req_6_waf_protection" = "PASS — WAF OWASP ruleset + rate limiting" "pci_req_7_least_privilege_iam" = "PASS — IRSA, no static credentials in cluster" "pci_req_8_mfa_access_control" = "PASS — AWS IAM, no shared accounts" } ``` ## 拆除环境 开发环境(可安全销毁): ``` cd environments/dev terraform destroy ``` 生产环境(需先禁用删除保护): ``` # 步骤 1:在 variables.tf 中禁用删除保护,然后: cd environments/prod terraform apply -target=module.database # apply the deletion_protection=false change terraform destroy ``` 远程状态3 桶和 DynamoDB 表不由 Terraform 管理——如需完全清理,请通过 AWS 控制台或 CLI 手动删除。 ## 模块文档 ### 网络 | 变量 | 描述 | 默认值 | |---|---|---| | `vpc_cidr` | VPC 的 CIDR 块 | `10.0.0.0/16` | | `availability_zones` | 可用区列表 | `["us-east-1a", "us-east-1b"]` | | `single_nat_gateway` | 单 NAT(开发)或多可用区 NAT(生产) | `true` | | `flow_log_retention_days` | 流日志的 CloudWatch 保留天数 | `90` | ### EKS | 变量 | 描述 | 默认值 | |---|---|---| | `kubernetes_version` | EKS 集群版本 | `1.29` | | `node_instance_type` | 节点的 EC2 实例类型 | `t3.medium` | | `node_desired_count` | 期望节点数量 | `2` | ### API 网关 | 变量 | 描述 | 默认值 | |---|---|---| | `waf_rate_limit` | 每 IP 每 5 分钟请求数上限,超过后阻断 | `100` | | `api_burst_limit` | 突发限制(请求/秒峰值) | `50` | | `api_rate_limit` | 稳态速率限制(请求/秒) | `25` | ### 数据库 | 变量 | 描述 | 默认值 | |---|---|---| | `aurora_instance_class` | RDS 实例类型 | `db.t3.medium` | | `aurora_instance_count` | Aurora 实例数量 | `1` | | `backup_retention_days` | Aurora 备份窗口(天) | `7` | | `deletion_protection` | 防止意外销毁 | `false` | *PayCore — 旨在展示高级 DevOps 工程实践:以安全为先的 IaC、零信任网络、分阶段 PCI-DSS 合规从第一条代码开始。*
标签:ALB, API 网关, Aurora MySQL, AWS, AWS Config, AWS Shield, CloudTrail, DDoS 防护, DPI, EC2, ECS, EKS, ElastiCache Redis, Elastic Kubernetes Service, IaC, IAM 角色服务账户, IRSA, Jenkins, KMS, NACL, PCI-DSS, S3 对象锁定, Secrets Manager, Security Hub, Terraform, TLS, VPC, WAF, Web 应用防火墙, 临时凭证, 人体姿态估计, 健康检查, 合规, 合规存储, 多租户隔离, 子域名突变, 子网, 安全组, 审计日志, 持续交付, 支付系统, 最小权限, 服务器监控, 流量加密, 漏洞利用检测, 生产环境, 网络隔离, 蓝绿部署, 请求拦截, 金融科技, 防御工具, 零信任网络, 静态密钥防护