Fedramp Engineering

Production engineering guide for fedramp engineering covering patterns, implementation strategies, and operational best practices.

Fedramp Engineering is the disciplined practice of aligning cloud systems and engineering processes with the Federal Risk and Authorization Management Program (FedRAMP) baseline requirements. It matters when a system must achieve a FedRAMP Authority to Operate (ATO) designation, typically for federal agencies or contractors, and must maintain compliance through continuous monitoring. This is not a one-time audit but a real-time, automated, and repeatable engineering discipline.

Preparing for a FedRAMP ATO

FedRAMP ATO begins with a well-structured system that maps each control to an implementation artifact. The core artifact is the System Security Plan (SSP), which must be machine-readable and versioned in a Git repository. The SSP is not a PDF but a structured document—typically a YAML file—containing a canonical mapping of controls to evidence.


system_name: "SecureData Platform"
acronym: "SDP"
federal_authority: "Department of Homeland Security"
federal_system: true
security_baselines:
  - "FedRAMP High"
  - "NIST SP 800-53 Rev. 4"
  - "FISMA"
controls:
  AC-2:
    description: "Account Management"
    status: "implemented"
    evidence:
      - path: "policies/account-management.md"
        type: "policy"
      - path: "scripts/ensure-account-creation.sh"
        type: "automated"
        id: "ac-2-automated"
      - path: "logs/audit-trail/account-creation.json"
        type: "audit-log"
        format: "JSON"
    owner: "[email protected]"
    implementation:
      - "User provisioning via AWS IAM"
      - "Automated role assignment via Terraform"
      - "Daily account review via CloudWatch alarms"
    references:
      - "NIST SP 800-53, AC-2(1)"
      - "CIO-2021-004"

Each control must be traceable to a technical artifact. The most common failure is a gap between control descriptions and actual implementation: a control says “automated”, but the evidence is a manual checklist. The system must be instrumented so that every control can be verified by a single command.

Ensuring Automated Control Evidence

To validate that a control is truly automated, engineers deploy a control verification script that runs on a schedule. The script must output a standardized JSON report that includes:

# verify-control.sh
#!/bin/bash
set -euo pipefail

CONTROL_ID=$1
OUTPUT_FILE=$2
TIMESTAMP=$(date -Iseconds)

# Run control-specific checks
check_account_creation() {
  local accounts=$(aws iam list-users --query 'Users[].UserName' --output json)
  local expected_count=50

  if [ $(echo "$accounts" | jq -c 'length') -ge $expected_count ]; then
    echo '{"check": "account_creation", "result": true, "message": "All expected users created"}'
  else
    echo '{"check": "account_creation", "result": false, "message": "Only ' $(echo "$accounts" | jq -c 'length') ' users found"}'
  fi
}

check_iam_policy_compliance() {
  local policy_count=$(aws iam list-policies --query 'Policies[].PolicyName' --output json | jq -c 'length')
  if [ $policy_count -ge 10 ]; then
    echo '{"check": "iam_policy_compliance", "result": true, "message": "Minimum 10 IAM policies defined"}'
  else
    echo '{"check": "iam_policy_compliance", "result": false, "message": "Only ' $policy_count ' policies found"}'
  fi
}

# Execute checks and collect results
RESULTS=$(check_account_creation; check_iam_policy_compliance)

# Generate final report
cat << EOF > "$OUTPUT_FILE"
{
  "control_id": "$CONTROL_ID",
  "timestamp": "$TIMESTAMP",
  "status": "pass",
  "evidence_url": "https://artifacts.example.com/evidence/$CONTROL_ID.json",
  "duration_ms": 1247,
  "results": [
    $(echo "$RESULTS" | jq -c 'map(. | {check: .check, result: .result, message: .message}) | .[] | @json')
  ],
  "notes": [
    "Run by cron job on fedramp-worker-01",
    "Environment: production"
  ]
}
EOF

# Update status in a control tracking table
psql -c "
  INSERT INTO control_verification (control_id, status, timestamp, duration_ms, evidence_url)
  VALUES ('$CONTROL_ID', 'pass', '$TIMESTAMP', 1247, 'https://artifacts.example.com/evidence/$CONTROL_ID.json')
  ON CONFLICT (control_id, timestamp) DO UPDATE SET status = EXCLUDED.status
"

This script is registered in a control catalog, and its output is uploaded to a central artifact store—typically a public S3 bucket or a file server accessible via HTTP. The control verification pipeline must be idempotent and produce a consistent output format, so that a compliance dashboard can consume it directly.

Implementing Continuous Monitoring

Continuous monitoring is not a single process but a set of interlocking data flows. The core mechanism is a periodic scan of system state, followed by a comparison against the FedRAMP baseline.

Scanning for Control Compliance

A system runs a daily scan using a standardized command line tool that queries the system state and produces a compliance report. The scan tool is not a custom binary but a standard tool like curl, jq, and psql, orchestrated via systemd or cron.

# /etc/cron.daily/fedramp-scan
#!/bin/bash
set -euo pipefail

export PATH="/usr/local/bin:$PATH"

BASE_DIR="/var/lib/fedramp"
REPORT_DIR="$BASE_DIR/reports"
SCAN_DIR="$BASE_DIR/scans"
DATE=$(date +%Y-%m-%d)
REPORT_FILE="$REPORT_DIR/$DATE.json"

# Create scan directory for this run
mkdir -p "$SCAN_DIR/$DATE"

# Run system checks
{
  echo "Starting FedRAMP scan for $DATE"
  echo "Gathering system state..."

  # Gather audit logs
  curl -s "https://audit.example.com/api/v1/logs?since=$DATE" \
    -H "Authorization: Bearer $AUDIT_TOKEN" \
    -o "$SCAN_DIR/$DATE/audit-logs.json"

  # Gather IAM state
  aws iam list-users --output json > "$SCAN_DIR/$DATE/iam-users.json"
  aws iam list-policies --output json > "$SCAN_DIR/$DATE/iam-policies.json"

  # Gather configuration state
  docker exec -i sdp-webapp /bin/bash -c 'cat /etc/sdp/config.yml' > "$SCAN_DIR/$DATE/config.yml"

  # Gather security state
  psql -c "SELECT * FROM security_alerts WHERE created_at >= '$DATE'" -t -A > "$SCAN_DIR/$DATE/security-alerts.csv"

  # Generate report
  cat << EOF > "$REPORT_FILE"
{
  "scan_id": "scan-$DATE",
  "timestamp": "$(date -Iseconds)",
  "system": "SecureData Platform",
  "baseline": "FedRAMP High",
  "controls": [
    {
      "control_id": "AC-2",
      "status": "pass",
      "details": [
        "User count: 52",
        "All users have MFA enabled",
        "Policy applied: 12"
      ],
      "evidence": [
        "https://artifacts.example.com/scans/$DATE/iam-users.json",
        "https://artifacts.example.com/scans/$DATE/audit-logs.json"
      ]
    },
    {
      "control_id": "SI-2",
      "status": "warning",
      "details": [
        "SI-2: Network monitoring enabled",
        "SI-2: Alert threshold exceeded: 45% of logs missed"
      ],
      "evidence": [
        "https://artifacts.example.com/scans/$DATE/security-alerts.csv"
      ]
    }
  ],
  "summary": {
    "total_controls": 124,
    "pass": 108,
    "warning": 12,
    "fail": 4,
    "pass_rate": 0.871
  }
}
EOF

  # Upload report to central store
  curl -X POST \
    -H "Content-Type: application/json" \
    -d @"$REPORT_FILE" \
    -H "Authorization: Bearer $ARTIFACTS_TOKEN" \
    "https://artifacts.example.com/api/v1/reports"

  echo "Scan completed and uploaded."
} 2>&1 | tee "$BASE_DIR/logs/fedramp-scan-$DATE.log"

The scan outputs a JSON report that is ingested by the compliance monitoring system. The key failure mode is report drift: the report format changes between runs, but the ingestion pipeline assumes a fixed schema. This causes silent failures—control status updates are missed, or the dashboard shows incomplete data.

Handling Control Status Changes

When a scan detects a change in control status—e.g., AC-2 goes from pass to warning—the system must propagate this change through the compliance pipeline. This is achieved via a control status change event, which includes:

The event is published to a message queue (e.g., Kafka or RabbitMQ), and a consumer updates the control status in a database and triggers alerts.

{
  "event_type": "control_status_change",
  "control_id": "AC-2",
  "system": "SecureData Platform",
  "previous_status": "pass",
  "new_status": "warning",
  "timestamp": "2024-05-15T08:32:14Z",
  "details": [
    "User count: 52 (expected: 50)",
    "12 users missing MFA",
    "Last 30 days: 3 failed logins across 5 accounts"
  ],
  "evidence": [
    "https://artifacts.example.com/scans/2024-05-15/audit-logs.json",
    "https://artifacts.example.com/scans/2024-05-15/iam-users.json"
  ],
  "reason": "MFA enforcement policy not applied to legacy users"
}

This event is consumed by a compliance monitoring system that updates a central control tracking database and triggers notifications via email, Slack, or a PagerDuty integration.

Responding to Audit Findings

An audit finding in FedRAMP is not a document but a structured record with a resolution workflow. When a finding is raised—e.g., “AC-2: MFA not enforced for 12 users”—the system must:

  1. Identify the control and its current state.
  2. Generate a root-cause analysis.
  3. Assign the finding to a team.
  4. Track resolution through a lifecycle.

The finding is stored as a JSON document in a database and linked to the system’s artifact store.

{
  "finding_id": "F-2024-05-14-AC2",
  "control_id": "AC-2",
  "system": "SecureData Platform",
  "severity": "medium",
  "status": "open",
  "created": "2024-05-14T10:00:00Z",
  "updated": "2024-05-15T12:30:00Z",
  "description": "MFA not enabled for 12 users in the system.",
  "evidence": [
    "https://artifacts.example.com/scans/2024-05-14/audit-logs.json",
    "https://artifacts.example.com/scans/2024-05-14/iam-users.json"
  ],
  "root_cause": {
    "analysis": "Legacy users were not migrated to the new SSO system, which enforces MFA.",
    "data_sources": [
      "https://sso.example.com/api/v1/users?status=legacy",
      "https://sso.example.com/api/v1/tenant-config?tenant=legacy-users"
    ]
  },
  "resolution": {
    "assigned_to": "[email protected]",
    "due_date": "2024-06-01T00:00:00Z",
    "work_items": [
      {
        "title": "Migrate legacy users to SSO",
        "status": "in_progress",
        "assignee": "[email protected]",
        "notes": "Script to add MFA to 12 users"
      },
      {
        "title": "Update SSO policy to enforce MFA",
        "status": "pending",
        "assignee": "[email protected]"
      }
    ]
  }
}

The system automatically creates a finding when a scan detects a status change that exceeds a threshold (e.g., 5 or more users missing MFA). The finding is then reviewed, and upon resolution, the control status is updated, and the finding is closed.

Automating ATO Submissions

The final step in FedRAMP Engineering is the ATO submission package. This is a collection of documents, artifacts, and evidence, packaged into a single archive—typically a ZIP file.

The submission is generated by a script that compiles:

# generate-ato-submission.sh
#!/bin/bash
set -euo pipefail

SUBMISSION_DIR="/var/lib/fedramp/ato-submission"
DATE=$(date +%Y-%m-%d)
ZIP_FILE="$SUBMISSION_DIR/ato-submission-$DATE.zip"

mkdir -p "$SUBMISSION_DIR"

# Copy core documents
cp system-security-plan.yaml "$SUBMISSION_DIR/SSP.yaml"
cp "docs/architecture-diagram.png" "$SUBMISSION_DIR/architecture.png"
cp "docs/ato-requirements.pdf" "$SUBMISSION_DIR/ATO-Requirements.pdf"

# Gather control reports from last 365 days
find /var/lib/fedramp/reports -name "*.json" -mtime -365 | sort -r | while read report; do
  basename=$(basename "$report")
  cp "$report" "$SUBMISSION_DIR/reports/$basename"
done

# Gather audit logs
mkdir -p "$SUBMISSION_DIR/audit-logs"
find /var/lib/fedramp/logs -name "*.log" -mtime -365 | sort -r | while read log; do
  cp "$log" "$SUBMISSION_DIR/audit-logs/"
done

# Create ZIP
cd "$SUBMISSION_DIR"
zip -r "$ZIP_FILE" . -x "*.DS_Store" -x ".*"

# Upload to central ATO repository
curl -X POST \
  -H "Content-Type: application/zip" \
  -H "Authorization: Bearer $ATO_TOKEN" \
  --data-binary @"$ZIP_FILE" \
  "https://ato.example.com/api/v1/submissions"

The ZIP file is then submitted to the federal agency’s ATO portal, and a confirmation is logged in the system. The submission is tied to a specific scan and control status, creating a traceable lineage from evidence to approval.

Failure Modes and Sharp Edges

FedRAMP Engineering is not a checklist but a real-time, interconnected system of data, automation, and traceability. It is the discipline of making compliance not a burden, but the default state of the system.

This page was rewritten on 18 October 2026. It replaced a templated version that was not specific to its own title. How these pages are written and checked. If anything here is wrong, tell us at [email protected] and we will correct it.