~/blog/devops-for-fintech-pipeline-architecture-2026
zsh
DEVOPS

DevOps for Fintech: The Pipeline Architecture We Built for PCI Workloads

Engineering Team 2026-03-19

Fintech DevOps is regular DevOps with one critical constraint: every pipeline, every deployment, and every infrastructure change must be auditable, traceable, and compliant with financial regulations.

PCI DSS 4.0 changed the game in 2024. CI/CD pipelines are now explicitly in scope if they contribute to software running in the cardholder data environment. This means your build system, your container registry, your deployment tooling — all of it needs to meet PCI requirements.

We build DevOps pipelines for fintech companies. Here is the architecture that passes audits without slowing down delivery.

Why Fintech DevOps Is Different

Standard DevOps priorities: ship fast, iterate, automate everything.

Fintech DevOps priorities: ship fast, iterate, automate everything — and prove you did it correctly to auditors.

The key constraints:

RequirementWhat It Means for DevOps
Audit trailEvery deployment must be traceable to a commit, reviewer, approver, and timestamp
Separation of dutiesThe person who writes code cannot approve it. The person who approves cannot deploy it
Change managementEvery production change needs documented approval
Vulnerability managementContainer images and dependencies must be scanned before deployment
Access controlInfrastructure access must be role-based with MFA
EncryptionData at rest and in transit must be encrypted everywhere
LoggingAll access and changes must be logged and retained for 12+ months

The Pipeline Architecture

Here is the pipeline we build for fintech clients. Every stage produces audit evidence automatically:

Developer → PR → Code Review (2 approvers) → Merge


              ┌─────────────────────┐
              │   Build Stage       │
              │  • Compile/bundle   │
              │  • Unit tests       │
              │  • SAST scan        │
              │  • License check    │
              └──────────┬──────────┘


              ┌─────────────────────┐
              │   Security Stage    │
              │  • Container scan   │
              │  • Dependency audit │
              │  • Secret detection │
              │  • SBOM generation  │
              └──────────┬──────────┘


              ┌─────────────────────┐
              │   Compliance Gate   │
              │  • OPA policy check │
              │  • Approval required│
              │  • Evidence logged  │
              └──────────┬──────────┘


              ┌─────────────────────┐
              │   Deploy Stage      │
              │  • Staging first    │
              │  • Integration tests│
              │  • Production deploy│
              │  • Rollback ready   │
              └──────────┬──────────┘


              ┌─────────────────────┐
              │   Post-Deploy       │
              │  • Smoke tests      │
              │  • Audit log entry  │
              │  • Notification     │
              └─────────────────────┘

The Pipeline in Code

# .github/workflows/deploy.yml
name: Fintech CI/CD Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  id-token: write
  contents: read
  security-events: write

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Run unit tests
      run: npm test -- --coverage

    - name: SAST scan (Semgrep)
      uses: semgrep/semgrep-action@v1
      with:
        config: p/owasp-top-ten

    - name: License compliance check
      run: npx license-checker --failOn 'GPL-3.0'

  security-scan:
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Build container image
      run: docker build -t myapp:${{ github.sha }} .

    - name: Scan container (Trivy)
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: myapp:${{ github.sha }}
        severity: CRITICAL,HIGH
        exit-code: 1    # Fail on critical/high vulnerabilities

    - name: Secret detection (Gitleaks)
      uses: gitleaks/gitleaks-action@v2

    - name: Generate SBOM
      uses: anchore/sbom-action@v0
      with:
        image: myapp:${{ github.sha }}
        artifact-name: sbom-${{ github.sha }}.spdx.json

    - name: Dependency audit
      run: npm audit --audit-level=high

  compliance-gate:
    needs: security-scan
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production    # Requires manual approval in GitHub
    steps:
    - name: OPA policy check
      run: |
        # Verify deployment meets compliance policies
        conftest test deployment/ --policy policies/ --output json \
          > compliance-report.json

    - name: Log compliance evidence
      run: |
        echo '{
          "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
          "commit": "${{ github.sha }}",
          "actor": "${{ github.actor }}",
          "approvers": "${{ github.event.pull_request.requested_reviewers }}",
          "security_scan": "passed",
          "compliance_check": "passed"
        }' | aws s3 cp - s3://audit-logs/deployments/${{ github.sha }}.json

  deploy:
    needs: compliance-gate
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Configure AWS (OIDC - no stored keys)
      uses: aws-actions/configure-aws-credentials@v4
      with:
        role-to-arn: arn:aws:iam::123456789:role/github-deploy
        aws-region: eu-west-1

    - name: Deploy to EKS
      run: |
        kubectl set image deployment/app app=myapp:${{ github.sha }} \
          -n production --record
        kubectl rollout status deployment/app -n production --timeout=300s

    - name: Smoke tests
      run: |
        sleep 10
        curl -f https://api.myapp.com/health || exit 1

    - name: Notify
      if: always()
      uses: slackapi/slack-github-action@v2
      with:
        webhook: ${{ secrets.SLACK_WEBHOOK }}
        payload: |
          {"text": "Deploy ${{ job.status }}: ${{ github.sha }} by ${{ github.actor }}"}

PCI DSS 4.0: What Changed for DevOps

PCI DSS 4.0 (enforced March 2025) brought significant changes:

CI/CD Is Now In Scope

Previously, only the cardholder data environment (CDE) was in scope. Now, any system that “contributes to the software” running in the CDE is in scope — including your build servers, CI/CD pipelines, and container registries.

What this means:

  • GitHub Actions runners that build CDE-bound code must be hardened
  • Container registries storing CDE images need access controls and audit logs
  • Terraform state files containing CDE infrastructure are in scope
  • Secrets used in pipelines must be managed through approved secret managers

Software Bill of Materials (SBOM)

PCI DSS 4.0 Requirement 6.3.2 requires maintaining an inventory of custom and third-party software components. Generate SBOMs automatically in your pipeline and store them alongside deployment artifacts.

Automated Vulnerability Management

Requirement 6.3.1 requires identifying and managing security vulnerabilities in custom and third-party software. Integrate vulnerability scanning at every stage:

StageToolWhat It Catches
Pre-commitGitleaksHardcoded secrets
Pull requestSemgrep/SonarQubeCode vulnerabilities (SAST)
Buildnpm audit / pip auditDependency vulnerabilities
Container buildTrivy / GrypeOS and library CVEs
Pre-deployOPA / KyvernoPolicy violations
RuntimeFalcoSuspicious container behaviour

PCI Scope Reduction Strategies

Smart architecture reduces what falls under PCI scope — cutting audit effort by 40-70%:

Network Segmentation

Isolate the CDE from the rest of your infrastructure:

┌──────────────────────────────────────────┐
│  Non-CDE (out of PCI scope)             │
│  ├── Marketing website                   │
│  ├── Internal tools                      │
│  ├── Analytics                           │
│  └── Development environments            │
└──────────────┬───────────────────────────┘
               │ firewall / network policy

┌──────────────────────────────────────────┐
│  CDE (in PCI scope)                     │
│  ├── Payment processing service          │
│  ├── Card data storage (tokenised)       │
│  ├── Payment gateway integration         │
│  └── Audit logging                       │
└──────────────────────────────────────────┘

In Kubernetes, use network policies and separate namespaces:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: cde-isolation
  namespace: payment-processing
spec:
  podSelector: {}
  policyTypes: [Ingress, Egress]
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          pci-scope: "true"
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          pci-scope: "true"
    - ports:
      - port: 443    # Payment gateway

Tokenisation

Replace card numbers with tokens at the earliest possible point. If your services only handle tokens, they are out of PCI scope:

Customer → Payment Form (Stripe.js) → Stripe → Token

Your Backend receives TOKEN only ──────────────────┘
(never sees card numbers = reduced PCI scope)

Using Stripe, Adyen, or similar payment processors as the tokenisation layer keeps most of your infrastructure out of PCI scope.

Separate CI/CD for CDE

Run CDE deployments through a dedicated pipeline with stricter controls:

  • Separate GitHub environments with required reviewers
  • Dedicated self-hosted runners (not shared with non-CDE)
  • Separate container registry with stricter access controls
  • Enhanced logging sent to a tamper-proof audit store

Infrastructure Architecture

The infrastructure we build for fintech clients:

┌─ AWS Account (Production) ─────────────────────────┐
│                                                     │
│  VPC (10.0.0.0/16)                                 │
│  ├── Private Subnets (CDE)                          │
│  │   ├── EKS Node Group (payment services)          │
│  │   ├── RDS (encrypted, multi-AZ)                  │
│  │   └── ElastiCache (encrypted)                    │
│  │                                                   │
│  ├── Private Subnets (Non-CDE)                      │
│  │   ├── EKS Node Group (general services)          │
│  │   └── Internal ALB                               │
│  │                                                   │
│  └── Public Subnets                                  │
│      ├── External ALB (WAF-protected)               │
│      └── NAT Gateway                                │
│                                                     │
│  Cross-cutting:                                      │
│  ├── CloudTrail (all API calls logged)              │
│  ├── GuardDuty (threat detection)                   │
│  ├── Config (compliance monitoring)                 │
│  ├── KMS (encryption key management)               │
│  └── Secrets Manager (credential storage)           │
└─────────────────────────────────────────────────────┘

Provisioned with Terraform (or OpenTofu), every infrastructure change is version-controlled and auditable:

# RDS with encryption (PCI requirement)
resource "aws_db_instance" "main" {
  engine               = "postgres"
  engine_version       = "16.2"
  instance_class       = "db.r6g.large"
  storage_encrypted    = true         # PCI: encrypt at rest
  kms_key_id           = aws_kms_key.db.arn
  multi_az             = true         # High availability
  deletion_protection  = true

  # PCI: audit logging
  enabled_cloudwatch_logs_exports = ["postgresql", "upgrade"]
}

Kubernetes Security for Fintech

If you run on Kubernetes, these are non-negotiable:

RBAC with Least Privilege

Every team gets access to their namespace only. Nobody gets cluster-admin outside the platform team:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: payment-team
  namespace: payment-processing
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch"]     # Read-only for most
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get"]                       # Can view logs

See our Kubernetes RBAC audit guide for the full setup.

Pod Security Standards

Enforce restrictive pod security at the namespace level:

apiVersion: v1
kind: Namespace
metadata:
  name: payment-processing
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pci-scope: "true"

This prevents containers from running as root, using host networking, or escalating privileges — all critical for PCI compliance.

Image Signing and Verification

Only deploy verified, scanned images:

# Kyverno policy: only allow signed images
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-images
spec:
  rules:
  - name: verify-signature
    match:
      resources:
        kinds: [Pod]
        namespaces: [payment-processing]
    verifyImages:
    - imageReferences: ["registry.example.com/*"]
      attestors:
      - entries:
        - keyless:
            rekor:
              url: https://rekor.sigstore.dev

Deployment Patterns for Fintech

Blue-Green Deployments

For payment processing services where zero downtime is critical, use blue-green deployments. Two identical environments run simultaneously, with traffic switched after validation:

  1. Deploy new version to “green” environment
  2. Run integration tests against green
  3. Shift traffic from blue to green
  4. Monitor for errors for 15-30 minutes
  5. If issues detected, instantly shift back to blue

Change Freeze Windows

Implement deployment freezes during peak transaction periods (month-end, payroll dates, holiday shopping). Automate this in your pipeline:

- name: Check deployment window
  run: |
    DAY_OF_WEEK=$(date +%u)
    HOUR=$(date +%H)
    # No deployments on Fridays after 2 PM or weekends
    if [[ $DAY_OF_WEEK -ge 5 && $HOUR -ge 14 ]]; then
      echo "::error::Deployment blocked: outside change window"
      exit 1
    fi

Audit Readiness Checklist

When your PCI auditor asks “show me how deployments work,” you should produce:

  • Git commit history with PR reviews and approvals
  • CI/CD pipeline logs showing security scans passed
  • SBOM for every deployed artifact
  • Container vulnerability scan results
  • OPA/Kyverno policy check results
  • Deployment approval evidence (GitHub environment protection)
  • CloudTrail logs showing who deployed what and when
  • Rollback evidence (if applicable)

Every item should be automated. If your team manually creates audit evidence, you are doing it wrong.


Building Compliant DevOps for Your Fintech?

We build PCI-compliant DevOps pipelines for fintech companies — from early-stage startups getting their first PCI certification to established platforms scaling their infrastructure.

Our DevOps consulting services for fintech include:

  • Pipeline architecture — design CI/CD with built-in compliance gates and audit trails
  • PCI scope reduction — network segmentation, tokenisation strategy, and architecture isolation
  • Kubernetes securityRBAC, network policies, pod security, and secrets management
  • Infrastructure as CodeTerraform with compliance controls for AWS/Azure/GCP
  • Audit preparation — automated evidence collection and compliance reporting

Talk to our fintech DevOps team →

Continue exploring these related topics

$ suggest --service

Concerned about security?

We help teams implement security best practices across their infrastructure and applications.

Get started
Chat with real humans
Chat on WhatsApp