This guide lays out security best practice for GitHub repositories. This set of practices is a minimum (nothing stops you from doing more), and they should be implemented alongside other relevant ones that contribute to security as a whole. These are discussed in more detail as part of the Quality checks.
Publishing code within the Quality checks page lists a minimum set of practices that should be in place before code is published. This implies that:
- Repositories can only be secure once the listed practices meet the relevant amber/green thresholds (which should also be reflected in a Engineering Quality Dashboard).
- The guidelines in this page are a necessary, but not a sufficient, condition for code overall being secure.
- All users must have MFA enabled.
- Baseline visibility for private repositories must be
No Permission
. - Ability to change repository view from private to public must be reserved to admins only.
- In line with the Service Manual, new repositories should be public by default, unless there is good reason not to - this avoids costly rework to secure private information further down the line.
- Private repositories must disable forking.
- There must be no outside collaborators in private repositories.
- Enable abuse reporting by accepting content reports
Because of baseline visibility configurations, you must setup GitHub teams in order to provide team members access to repositories. The minimum recommended setup is as follows:
- Create one team with the name of your product (e.g.
Engineering Quality Framework
). Add all required members to this team. - Create one child team within the team, for admins only (e.g.
Engineering Quality Framework Admins
). Add admins only to this team. - Create a second child team, for code owners (e.g.
Engineering Quality Framework Code Owners
). Add relevant members to this team, and reference in the CODEOWNERS file (example here). - For each of your repositories (e.g.
NHSDigital/software-engineering-quality-framework
), under theCollaborators and teams > Manage Access
option inSettings
, set the general (parent) team to haveWrite
access, code owners to haveMaintain
access, and the admins team to haveAdmin
access.
Child teams inherit the parent's access permissions, simplifying permissions management for large groups. Members of child teams also receive notifications when the parent team is @mentioned
, simplifying communication with multiple groups of people.
Depending on your use case, you may want to create additional teams (e.g. a read-only access team, or different teams granting access to different projects). This is welcomed by the framework, as long as the teams provide clarity on the role they encompass, remain consistent and are applied consistently to your repositories.
- Enable, at a minimum, Dependabot alerts for vulnerabilities and respond to them appropriately.
- Generate SBOM (Software Bill of Materials) for your repository content and all the artefacts that are build as part of the CI/CD process
- Disable ability to push to the default branch for everyone, admins included (
Rules applied to everyone including administrators
option). - Refer to Quality checks for further code security practices.
- Require pull request code reviews, by at least one code owner, to merge a branch.
- Require signed commits, and, accordingly, check that commits are verified before merging. Git treats authentication and identity separately - any authenticated user can impersonate another developer when committing code. This means that even if a junior account is compromised it could have significant consequences, for example impersonating the lead developer in the hope of an easy merge. Only by requiring signing can identity truly be verified. Setup Guides for macOS, Windows, GitHub Actions, and AWS CodePipeline.
- Invalidate existing reviews when new commits are pushed (
Dismiss stale pull request approvals when new commits are pushed
option). - Require adequate automated status checks prior to merging. This should always include checking that branches are up to date.
Teams should take all necessary precautions to ensure that sensitive data does not leak into Source Control Management Systems. Should any sensitive information leak into Source Control then teams should review the steps detailed here.