This is a Controlled Document
Inline with GitLab's regulatory obligations, changes to controlled documents must be approved or merged by a code owner. All contributions are welcome and encouraged.
The Cryptography Standard defines approved cryptographic algorithms, settings, and cryptographic modules for the purposes of encrypting data at rest or in transit within the various systems and subsystems used by the GitLab product.
The Cryptography Standard allows for a more consistent approach to cryptographic usage within GitLab, easier adaptation to industry standards and compliance frameworks (such as FedRAMP), and an overall more secure product and working environment. In addition, most of the standards are based off of recommendations from NIST (National Institute of Standards and Technology) as many of the compliance frameworks are based off of NIST standards, and NIST consistently makes solid recommendations that are adopted by many organizations globally.
The Cryptography Standard applies to all GitLab team members, contractors, consultants, vendors and other service providers that handle, manage, store or transmit GitLab data.
This is required for coding best practices as well as client and server configurations involving cryptography for the GitLab product itself. Currently, there are numerous efforts internally by numerous Engineering teams ensuring these standards are met and maintained. The scope includes third party modules and software settings where cryptographic settings are required. Basically if it touches GitLab or GitLab customer data, the standard applies.
Role | Responsibility |
---|---|
GitLab Team Members | Responsible for adhering to the requirements outlined in this standard |
Security Management and Cryptographic Officer (Code Owners) | Responsible for approving significant changes and exceptions to this standard |
While we consider these standards to be a security baseline to improve the overall security of the GitLab product, for compliance and certification efforts we will be using the following general guidelines.
Meeting these standards will help meet objectives such as FedRAMP compliance, but as standards such as FIPS and SP 800-53 are considered de facto global standards, it will help with compliance needs in multiple countries and industries.
For regulatory requirements (such as FIPS), all cryptographic modules should be publicly available (open source) to ensure compliance with the Bureau of Industry and Security's Export Administration Regulations regarding encryption. As this compliance meets international standards per the Wassenaar Arrangement this should meet any requirements that might be encountered globally, should the situation arise.
The choice of cryptographic modules is important. It is possible that GitLab features that have cryptographic elements could find themselves having to meet stringent module requirements (FedRAMP standards, running in FIPS mode, etc) so adherence to specific modules is recommended. This includes the following:
For the gitlab-fips package, all FIPS-validated cryptographic modules are documented on the "FIPS Compliance" Docs page, currently located here. This documentation must be kept up to date to maintain GitLab's FedRAMP and FIPS 140-2 compliance posture.
Note to developers and contributors, regardless of FIPS/FedRAMP compliance or not, coding should use the cryptographic modules mentioned above. Development with a non-FIPS version of the same module (e.g. openssl-x.y.x
vs openssl-x.y.z-fips
) is fine. The important point is to not introduce new code that is dependent on cryptographic modules that do not have a FIPS version or have written their own cryptographic implementations of algorithms.
aes-256-gcm
).
/dev/random
. While /dev/urandom
is not as secure, historically it performed quicker on much older systems. When the underlying operating system is running in FIPS mode, calls to /dev/urandom
are directed to /dev/random
, and starting with Linux kernel version 5.18 both /dev/random
and /dev/urandom
will function the same anyway. Therefore the standard should be /dev/random
.Exceptions to this policy will be tracked as per the Information Security Policy Exception Management Process.