Quick answer
Secure cloud delivery is the ability to answer, with evidence: what code was deployed, how it was built, which dependencies it contains, who was allowed to change it, and how the team would respond if something goes wrong.
That is a supply-chain problem as much as a runtime problem. A hardened container is not enough if an attacker can change the build workflow, steal a deployment credential, or introduce a vulnerable dependency without detection.
The U.S. Cybersecurity and Infrastructure Security Agency (CISA) continues to frame secure-by-design as a responsibility of software manufacturers and publishes practical material on supplier risk, software bills of materials, and secure development. Start with its updated product security bad practices guidance and software supply-chain recommendations.
Key takeaways
- Protect the path from source commit to production, not only the running workload.
- Use short-lived, narrowly scoped credentials for build and deployment systems.
- Produce and retain evidence: build records, dependency inventories, approvals, and deployment history.
- Make secrets inaccessible to logs, pull requests, and normal developer workflows.
- Practice rollback and incident response before the next urgent release.
Map the delivery path before buying controls
Every team should be able to draw its real delivery path:
Developer → source repository → CI build → artifact registry → deployment control plane → runtime
For each step, document:
- who can change it
- which identity it runs as
- what it can read and write
- what evidence it produces
- how it is monitored
This map exposes the gaps that generic checklists hide. A team may have strong runtime permissions but a broadly scoped CI token. Another may scan images but allow direct production changes that bypass the pipeline.
1. Protect source and change control
Source code is not secure merely because it is hosted in a Git repository. Establish a baseline for protected branches, peer review on production-facing changes, and multi-factor authentication for privileged accounts.
Keep automation permissions separate from personal developer access. A build job that can publish artifacts does not need broad administrative access to the organization or cloud account.
Useful evidence includes a pull request, a linked issue or decision record where appropriate, the commit SHA, and the approval that allowed a release. The objective is traceability, not bureaucracy.
2. Make builds reproducible enough to investigate
A production artifact should be connected to a source revision, a build definition, and the dependency set used to create it. Record the following with each release:
| Evidence | Why it matters |
|---|---|
| Commit SHA and repository | Identifies the source used for the build |
| Build workflow revision | Shows the instructions that created the artifact |
| Artifact digest | Identifies the exact deployable output |
| Dependency inventory | Speeds vulnerability and license response |
| Deployment record | Connects the artifact to an environment and time |
Do not rely on a mutable tag such as latest as the only production identifier. Tags can be convenient for people; an immutable digest is better evidence for a deployment record.
3. Use least privilege for machines as well as people
The most important cloud identity is often the least visible one: the identity used by CI, a deployment controller, or a running workload.
Use separate identities for build, deploy, and runtime tasks. Give each identity only the permissions it needs for its current role. Prefer short-lived credentials and workload identity mechanisms over long-lived secrets stored in CI settings.
Review these questions regularly:
- Can a build identity read production data? It usually should not.
- Can a runtime service modify deployment settings? It usually should not.
- Can a developer bypass protected deployment paths? If yes, is that access temporary, logged, and reviewed?
- Does an emergency role have a clear owner and break-glass process?
4. Treat secrets as runtime configuration, not source material
Secrets appear in more places than .env files: CI logs, test fixtures, shell history, issue attachments, client-side bundles, and copied configuration examples.
Use a dedicated secret-management path, inject secrets only where needed, and rotate them after a suspected exposure. Log metadata about a secret reference or version when it helps operations, but never log the secret value.
For a new service, keep a short inventory: which secrets it needs, why it needs them, which environment owns them, and who is responsible for rotation. This is often more useful during an incident than a sophisticated tool that no one has documented.
5. Generate an SBOM and make it usable
An SBOM is useful when it supports a response. It should be connected to the artifact, retained long enough to investigate, and readable by the people who handle vulnerabilities and procurement questions.
CISA’s supply-chain guidance discusses open-source selection, risk assessment, maintenance, vulnerability response, and secure delivery. The practical lesson is simple: a dependency list is not the finish line. Teams need a way to determine whether a component is present, whether it is reachable or relevant, who owns the response, and how a fixed artifact will reach production.
Start with a policy that is easy to keep:
- Generate an inventory during the build.
- Store it with the artifact or release record.
- Subscribe to dependency and vulnerability notifications.
- Define severity, ownership, and remediation expectations.
- Document how to verify that the corrected artifact is deployed.
6. Secure the runtime with containment and visibility
Runtime controls are still essential. Use network boundaries, encrypted traffic, hardened base images, protected configuration, and meaningful audit logs. But avoid a checklist that creates an unmaintainable set of exceptions.
Focus on the service’s real blast radius:
- Which data can it read or modify?
- Which outbound destinations does it need?
- Which identities can invoke it?
- What would alert the team to unusual behavior?
- How can the team disable or roll back the service safely?
The answers should appear in a service runbook, not only in the memory of the person who deployed it.
7. Rehearse incident response and rollback
The time to discover that a rollback requires a missing permission is not during a security incident. Practice a low-risk exercise: revoke a compromised credential, roll back a release by immutable artifact identifier, and locate the dependency inventory for a deployed service.
Measure the questions that matter:
- How long did it take to identify the affected artifact?
- Could the team tell which environments received it?
- Could it rotate the relevant identity without interrupting unrelated services?
- Did the logs contain enough evidence without exposing sensitive data?
A minimum release checklist
- Protected source branch and reviewed change
- Build identity and deployment identity are separate
- Immutable artifact identifier recorded
- Dependency inventory generated and retained
- Secrets injected through an approved runtime path
- Production permissions limited to the service’s role
- Deployment record links artifact, environment, and time
- Rollback and incident owner documented
Sources and further reading
- CISA and FBI: Product Security Bad Practices
- CISA: Recommended Practices for Managing Open Source Software and SBOMs
- CISA: Secure-by-design and software supply-chain resources
Editorial note
This checklist is a practical starting point, not a substitute for threat modeling, legal requirements, security testing, or qualified security advice. Apply controls according to the data, users, and risk profile of the specific service.