Published on: March 4, 2026
10 min read
GitLab's Security Compliance team created a custom control framework to scale across multiple certifications and products — here's why and how you can, too.

GitLab's Security Compliance team discovered that existing security control frameworks lacked the customization to fit the platform's multi-product, cloud-native environment.
So we built our own.
Here's what we learned and why creating your own custom security control framework might be the right move for your compliance program.
When I joined GitLab's Security Compliance team in November 2022, we were using the Secure Controls Framework to manage controls across our external certifications and internal compliance needs. But as our requirements grew, we realized we needed something more comprehensive.
With FedRAMP authorization on our roadmap, we chose to adopt NIST SP 800-53 next. NIST SP 800-53 includes more than 1,000 controls, but its comprehensiveness isn’t perfectly suited to GitLab’s environment.
We didn't need to implement every NIST control, only those applicable to our specific requirements. Our focus was on the quality of controls rather than quantity. Implementing unnecessary controls doesn't improve security; in fact, too many can make an environment less secure as individuals find ways to circumvent overly restrictive or irrelevant controls.
Some controls also lacked the necessary granularity for our needs. For example, NIST’s AC-2 “Account Management” control covers account creation and provisioning, account modification and disabling, account removal and termination, shared and group account management, and account monitoring and reviews.
In practice, these are at least six distinct controls with different owners, testing procedures, and risks. For attestations like SOC 2, each activity is tested as a separate control because they have different evidence requirements and operational contexts. NIST's all-encompassing AC-2 didn't match how we actually operate controls or how auditors actually assess us, and we needed controls granular enough to reflect our operational environment.
We found ourselves constantly customizing, adding, and adapting NIST controls to fit our environment. At some point, we realized we weren't really using NIST SP 800-53 anymore, we were building our own framework on top of it. We decided a custom control framework, one tailored to GitLab’s environment, would best accommodate our multi-product offering and each product’s unique compliance needs.
Through five methodical steps, we built our own common controls framework: the GitLab Control Framework (GCF).
We reviewed our existing controls and mapped every requirement from external certifications we already maintained, certifications on our roadmap, and our internal compliance program:
External certifications:
Internal compliance needs:
This gave us the baseline: what controls must exist to meet our compliance obligations.
Next, we compared our requirements against industry-recognized frameworks:
Having adopted frameworks in the past, we wanted to learn from their structure and ensure we weren't missing critical security domains, controls, or best practices.
Through this analysis, we created 18 custom control domains tailored to GitLab's environment:
| Abbreviation | Domain | Scope of controls |
|---|---|---|
| AAM | Audit & Accountability Management | Logging, monitoring, and maintaining audit trails of system activities |
| AIM | Artificial Intelligence Management | Specific to AI system development, deployment, and governance |
| ASM | Asset Management | Identifying, tracking, and managing organizational assets |
| BCA | Backups, Contingency, and Availability Management | Business continuity, disaster recovery, and system availability |
| CHM | Change Management | Managing changes to systems, applications, and infrastructure |
| CSR | Customer Security Relationship Management | Customer communication, transparency, and security commitments |
| DPM | Data Protection Management | Protecting data confidentiality, integrity, and privacy |
| EPM | Endpoint Management | Securing end-user devices and workstations |
| GPM | Governance & Program Management | Security governance, policies, and program oversight |
| IAM | Identity, Authentication, and Access Management | User identity, authentication mechanisms, and access control |
| INC | Incident Management | Detecting, responding to, and recovering from security incidents |
| ISM | Infrastructure Security Management | Network, server, and foundational infrastructure security |
| PAS | Product and Application Security Management | Security capabilities built into the GitLab product that are dogfooded to secure GitLab's own development, such as branch protection & code security scanning |
| PSM | People Security Management | Personnel security, training, and awareness |
| SDL | Software Development & Acquisition Life Cycle Management | Secure SDLC practices and third-party software acquisition |
| SRM | Security Risk Management | Risk assessment, treatment, and management |
| TPR | Third Party Risk Management | Managing security risks from vendors and suppliers |
| TVM | Threat & Vulnerability Management | Identifying and remediating security vulnerabilities |
Each domain groups related controls into logical families that align with how GitLab's security program is actually organized and operated. This structure provides a methodical approach for adding, updating, or removing controls as our needs evolve.
With our domains defined, we needed to address two critical challenges: how to represent controls across multiple products without duplicating the framework, and how to capture meaningful implementation context to actually operate and audit at scale.
GitLab provides multiple product offerings: GitLab.com (multi-tenant SaaS on GCP), GitLab Dedicated (single-tenant SaaS on AWS), and GitLab Dedicated for Government (GitLab’s single-tenant FedRAMP offering on AWS). Each offering has different infrastructure, compliance scopes, and audit requirements. We needed to support product-specific audits without creating entirely separate frameworks.
We designed a control hierarchy where Level 1 controls are the framework, defining what should be implemented at the organizational level. Level 2 controls are the implementation, capturing the product-specific details of how each requirement is actually fulfilled.
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
accTitle: Control Hierarchy
accDescr: Level 1 requirements cascade to Level 2 implementations.
L1["Level 1: Framework<br/>What must be implemented"];
L2A["Level 2: GitLab.com<br/>How it's implemented"];
L2B["Level 2: Dedicated<br/>How it's implemented"];
L2C["Level 2: Dedicated for Gov<br/>How it's implemented"];
L2D["Level 2: Entity<br/>(inherited by all)"];
L1-->L2A;
L1-->L2B;
L1-->L2C;
L1-->L2D;
This separation allows us to maintain one framework with product-specific implementations, rather than managing duplicate frameworks for each offering. Entity controls apply organization-wide and are inherited by GitLab.com, GitLab Dedicated, and GitLab Dedicated for Government.
Traditional control frameworks track minimal information: a control ID, description, and owner. The GCF takes a different approach and its superpower is the extensive metadata we track for each control. Beyond just stating the control description or implementation statement, we capture:
This context transforms the GCF from a simple control list into an operationalized control inventory.
With this structure, we can answer questions like:
The GCF isn't static and was designed to evolve with our business and compliance landscape.
Because we've operationalized context into the GCF, we can quickly determine the scope and gaps when pursuing new certifications (ISMAP, IRAP, C5, etc.):
When new regulations emerge or existing requirements change:
The framework adapts to various changes:
Securing once and complying with many isn't just a principle, it has tangible benefits across how we prepare for audits, support control owners, and pursue new certifications. Here's what that looks like in practice, both qualitatively and in the numbers.
Since implementing the GCF, we've seen significant improvements in how we manage compliance:
The GCF enables us to maintain one framework with controls mapped to multiple certification requirements, instead of managing separate control sets for each audit. One control can satisfy SOC 2, ISO 27001, and PCI DSS requirements simultaneously.
Through the GCF, we maintain one consolidated request list instead of separate lists for each audit. Because we've defined controls with specific context, our request lists say "Okta user list" instead of generic "production user list," eliminating ambiguity and interpretation. We're not collecting “N/A” evidence or leaving it up to auditors to interpret what "production" means in our environment. Everything is already scoped to our actual systems.
This integration directly reduces burden on our stakeholders. Control owners provide evidence once instead of responding to separate requests from SOC 2, ISO, and PCI auditors. When we collect evidence for access controls, it satisfies SOC 2, ISO 27001, and PCI DSS requirements simultaneously. One control, one test, one piece of evidence with multiple certifications and requirements satisfied.
When pursuing new certifications or launching new features, the operationalized context enables more efficient gap analysis. We can determine which controls already exist, what's missing, and what implementation is required.
Control efficiency:
Audit efficiency:
Framework scale:
The GCF continues to evolve as we add security and AI controls, pursue new certifications, and refine our approach.
For security compliance practitioners: Don't be afraid to build your own framework if industry standards don't fit. The upfront investment pays dividends in scalability, efficiency, and controls that actually make sense for your environment. Sometimes the best framework is the one you design yourself.
If you found this helpful, check out our complete GitLab Control Framework documentation, where we detail our framework methodology, control domains, and field structures.
Enjoyed reading this blog post or have questions or feedback? Share your thoughts by creating a new topic in the GitLab community forum.
Share your feedback