Security and access

What we read, what we change, what we never touch.

The questions a platform team asks before granting access, answered up front, with the exact policies. Read-only to start, every change approved by a person, and everything revocable by deleting one role.

Customers backed by
Y CombinatorSequoiaTiger Global
One change, start to finish Under policy
  1. Finly AI

    Proposal: resize 6 API nodes from m5.2xlarge to m5.xlarge on 30 days of p95 utilization. Saves $1,120 a month. Dry run attached.

    Pull request opened in infra-live. No change applied.
  2. Engineer

    Reviewed the plan and the rollback. Approved for the Tuesday change window, one node group at a time.

    Approval recorded on the pull request
  3. Sage AI

    Applied to node group api-a. Latency and error rate unchanged after 30 minutes. Proceeding to api-b.

    Blast-radius limit: one group per hour
  4. Sage AI

    Console edit detected on a security group outside Terraform. Reverted and the diff posted to #infra.

    Confirmed by the on-call engineer
  5. Summary

    2 changes applied, 2 approvals, 0 rollbacks. Audit log exported to your bucket.

    Posted to #ops

How access is used

From a read-only role to an approved change.

  1. Read-only accessA cross-account role and Datadog read keys
  2. 30 days analysedCost, utilization and Datadog usage
  3. Findings rankedBy annual savings and blast radius
  4. Approved, then appliedAn engineer signs off. Changes land as pull requests.

What we read on day one

  • Cost: Cost and Usage Report, Cost Explorer, commitment coverage and utilization
  • Utilization: CloudWatch CPU, network and memory at p95 over 30 days
  • Datadog usage: custom metric series by tag, log volume by index, host and APM counts
  • Inventory: idle volumes, snapshots, NAT gateways, load balancers, untagged resources

What we change, after approval

  • Compute: instance sizes, autoscaling bounds, non-production schedules, commitments
  • Datadog: log exclusion and archive routing, metric tag allow-lists, monitor thresholds
  • Delivery: a pull request where Terraform owns the resource, otherwise an API change with a record and a rollback
  • Guardrails: a named approver, blast-radius limits, your change windows, an exportable audit log
AccessFree auditManaged plan
AWSCross-account role: ReadOnlyAccess, Cost Explorer, Cost and Usage Report, CloudWatch GetMetricDataSame, plus write scoped to each approved change. Pull requests where Terraform owns the resource.
DatadogAPI key and application key with usage, metrics, logs configuration, monitors and dashboards readSame, plus logs configuration and monitors write for approved changes
KubernetesMetrics through your existing Datadog or Prometheus. No cluster credentials.Read-only kubeconfig, or your GitOps repository for node group changes
Data we handleMetadata and utilization onlyMetadata and utilization only. Never application data or log contents.
RevocationDelete the role or the keySame. The plan runs month to month.

The exact access, as policy

What you create, word for word.

Two steps, about ten minutes, both reversible by deleting what you create. The account id and external id come from the call.

AWS: a cross-account role named DevLiftAudit

Attach the AWS managed policy ReadOnlyAccess, trust our account with an external id, and add the inline policy for billing data. Send us the role ARN.

Trust policy

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": { "AWS": "arn:aws:iam::DEVLIFT_ACCOUNT_ID:root" },
    "Action": "sts:AssumeRole",
    "Condition": { "StringEquals": { "sts:ExternalId": "EXTERNAL_ID" } }
  }]
}

Inline policy for cost data

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "ce:Get*", "ce:Describe*", "ce:List*",
      "cur:DescribeReportDefinitions",
      "cloudwatch:GetMetricData", "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics",
      "savingsplans:Describe*", "compute-optimizer:Get*",
      "organizations:Describe*", "organizations:List*"
    ],
    "Resource": "*"
  }]
}

This allows no write, no read of object contents in S3 and no secrets. We read utilization metrics, inventory and billing data.

Datadog: read-scoped keys

An API key named devlift-audit and an application key with these scopes only.

  • usage_read
  • metrics_read
  • logs_read_config
  • monitors_read
  • dashboards_read
  • apm_read

We use them to read usage by product, metric cardinality by tag, log volume by index and service, host and APM counts, and which metrics and logs your dashboards and monitors actually query. We never read log contents.

Keys travel through a one-time secret link, not email.

Revoking accessDelete the role and the keys. There is nothing else to remove. The managed plan runs month to month.

What we never do

Six things the access does not allow, by design.

The role and the keys are scoped so these are not possible, not merely promised.

  • Read application data or log contents
  • Read S3 object contents
  • Read secrets, keys or credentials
  • Write anything without an approved change
  • Hold standing admin access
  • Keep access after the engagement ends

Guardrails on every change

The same six rules, whether an agent or an engineer proposes it.

A named approver

Every change carries the name of the engineer who approved it and the person on your side who can veto it.

Blast-radius limits

Changes land one resource group at a time, with a ceiling on how much can change in a window.

Your change windows

Nothing ships outside the hours you set, and production waits for staging where one exists.

A dry run and a rollback path

The plan is attached before approval and the rollback is written before the change is applied.

An exportable audit log

Who proposed, who approved, what changed and when, exported to a bucket you own.

Pull requests where Terraform owns the resource

Changes land in your repositories, reviewed the same way as your own. Otherwise an API change with a record and a rollback.

The people holding the keys

Engineers who break systems for a living, on the defending side.

OSWE-certified engineers, DEF CON and Black Hat speakers and former CTF leads, with five discovered CVEs between them. A shared pager. Someone is reachable when it breaks, under an SLA, and the same engineers approve every agent change.

Frameworks we build to

SOC 2 Type IIControls enforced on every deploy
ISO 27001Information security management
PCI DSSCard data environments
HIPAAHealth data safeguards
SLSA Level 3Signed, verifiable builds
GDPREU data protection

Questions

Before you grant access.

Do you need write access to start?

No. The audit runs on a read-only IAM role and a Datadog API key with read scope. Write access comes later, scoped to the changes you approve, and you can revoke it at any time.

Who approves changes?

A DevLift engineer signs off on every change the agents prepare, and your team keeps a veto. Nothing is applied on the strength of an agent's judgement alone.

Can our team review every change?

Yes. Where Terraform owns the resource the change is a pull request in your repository, reviewed the way you review your own. Elsewhere it is an API change with a record and a rollback you can read before it ships.

What data do you handle?

Metadata and utilization only: cost and usage reports, CloudWatch metrics, inventory, and Datadog usage by product, index and tag. Never application data or log contents.

How do we revoke access?

Delete the role and the keys. There is nothing else to remove. The managed plan runs month to month, so leaving is a matter of removing our role and taking the pager back.

Walk through it with an engineer.

Book a demo and bring your platform team. We will go through the role, the scopes and the approval flow on a live account.