forked from fediversity/meta
		
	evaluate secret management schemes
This commit is contained in:
		
							parent
							
								
									d92c31e376
								
							
						
					
					
						commit
						3bdc08106d
					
				
					 1 changed files with 131 additions and 0 deletions
				
			
		
							
								
								
									
										131
									
								
								secrets-management.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								secrets-management.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,131 @@ | ||||||
|  | # Evaluation of secret management schemes | ||||||
|  | 
 | ||||||
|  | 2024-12-03 Robert, Nicolas, Valentin | ||||||
|  | 
 | ||||||
|  | ## Requirements | ||||||
|  | 
 | ||||||
|  | - Store and manage secrets in a central place | ||||||
|  | - Must be able to rotate keys (some state management) | ||||||
|  | - Minimal state on contributors' end, ideally exactly one per-user credential or even SSO | ||||||
|  | 
 | ||||||
|  | ## Non-requirements | ||||||
|  | 
 | ||||||
|  | - Don't need (or need only very basic) RBAC, all contributors are equal (maybe infra admins have special access) | ||||||
|  | - Components which require secrets don't have to be a secret (this would be a requirement for personal setups, where we don't want to leak e.g. which accounts exist) | ||||||
|  | - No need to retrieve secrets for very old versions | ||||||
|  | - No need for forward secrecy (thoroughly destroying keys as required by e.g. secure messaging protocols) | ||||||
|  | 
 | ||||||
|  | ## Design considerations | ||||||
|  | 
 | ||||||
|  | - Storing secrets | ||||||
|  | 
 | ||||||
|  |   Some secrets need to be persisted, and there are multiple formats and technologies to do that. | ||||||
|  |    | ||||||
|  | - Managing secrets | ||||||
|  | 
 | ||||||
|  |   Secrets need to be shared with contributors, and changed or rotated. | ||||||
|  |   Different systems have different degrees of comfort for these operations. | ||||||
|  | 
 | ||||||
|  | - Deploying secrets | ||||||
|  | 
 | ||||||
|  |   Secrets need to be made available to programs and services. | ||||||
|  |    | ||||||
|  | - Versioning | ||||||
|  | 
 | ||||||
|  |   For key rotation we need at least two versions: old to access the machine, new for rotating in | ||||||
|  | 
 | ||||||
|  | - Setup complexity | ||||||
|  | 
 | ||||||
|  |   Different systems have different requirements to get going, and may require more or less manual intervention for new contributors. This distinguishes: | ||||||
|  | 
 | ||||||
|  |   - complexity to set up for experts | ||||||
|  |   - complexity to contribute as a beginner | ||||||
|  | 
 | ||||||
|  | - Scalability, sustainability | ||||||
|  | 
 | ||||||
|  |   Questions to consider: | ||||||
|  |   - What if a contributor works on 100 such projects? | ||||||
|  |   - What if a project has 100 contributors? | ||||||
|  |   - What if a project runs over 10 years, how much effort does secret handling incur? | ||||||
|  |   - What if someone messes up the central server? | ||||||
|  |   - How fast can we set up a working system? | ||||||
|  |   - How hard is it to migrate from one scheme to another? | ||||||
|  | 
 | ||||||
|  | ## Overview | ||||||
|  | 
 | ||||||
|  | |Name|management|deployment|storage|versioning|setup|scalability| | ||||||
|  | |-|-|-|-|-|-|-| | ||||||
|  | |[agenix]|yes (CLI)|yes (tempfiles)|repo ([age])|Git|[partially manual](#agenix-setup)|[details](#agenix-scalability)| | ||||||
|  | |[sops-nix]|yes (CLI)|yes (tempfiles)|repo ([SOPS])|Git|[partially manual](#sops-nix-setup)|[more moving parts than agenix](#sops-nix-scalability)| | ||||||
|  | |[Vaultwarden]|yes (web GUI)|no|database|yes, on demand|[details](#Vaultwarden-setup)|[more up-front effort](#Vaultwarden-scalability)| | ||||||
|  | |ssh/scp|yes (manual) |yes (manual)|per-user|manually|[details](#sshscp-setup)|[details](#sshscp-scalability)| | ||||||
|  | 
 | ||||||
|  | [agenix]: https://github.com/ryantm/agenix | ||||||
|  | [age]: https://github.com/FiloSottile/age | ||||||
|  | [sops-nix]: https://github.com/Mic92/sops-nix | ||||||
|  | [SOPS]: https://github.com/getsops/sops | ||||||
|  | [LoadCredential]: https://systemd.io/CREDENTIALS/ | ||||||
|  | [Vaultwarden]: https://github.com/dani-garcia/vaultwarden | ||||||
|  | 
 | ||||||
|  | ## Details on setup complexity | ||||||
|  | 
 | ||||||
|  | ### agenix setup | ||||||
|  | 
 | ||||||
|  | - include module into configuration | ||||||
|  | - manage per-user ssh public keys | ||||||
|  | - each user needs to manage their public keys manually  | ||||||
|  | 
 | ||||||
|  | ### sops-nix setup | ||||||
|  | 
 | ||||||
|  | - include module into configuration | ||||||
|  | - manage per-user ssh public keys | ||||||
|  | - each user needs to manage their public keys manually  | ||||||
|  | 
 | ||||||
|  | ### Vaultwarden setup | ||||||
|  | 
 | ||||||
|  | - deploy Vaultwarden, set up backups | ||||||
|  | - manage per-user authentication with Vaultwarden | ||||||
|  | 
 | ||||||
|  | ### ssh/scp setup | ||||||
|  | 
 | ||||||
|  | - each contributor has to manage private keys and ssh config manually  | ||||||
|  | - have to take care of distribution of secrets and deployment separately | ||||||
|  | 
 | ||||||
|  | ## Details on scalability | ||||||
|  | 
 | ||||||
|  | ### agenix scalability | ||||||
|  | 
 | ||||||
|  | - allows reusing ssh key workflows | ||||||
|  | 
 | ||||||
|  | ### sops-nix scalability | ||||||
|  | 
 | ||||||
|  | - some extra complexity due to multiple encryption schemes | ||||||
|  | - allows reusing ssh key workflows | ||||||
|  | - some additional local setup for contributors | ||||||
|  | 
 | ||||||
|  | ### Vaultwarden scalability | ||||||
|  | 
 | ||||||
|  | - allows reusing password handling workflows (typically better automation than for ssh keys) | ||||||
|  | - more up-front work for initial deployment | ||||||
|  | - disaster recovery needs special care, doesn't implicitly distribute copies to contributors | ||||||
|  | - less interaction for managing contributor access | ||||||
|  | - separate source of truth (workflows, audit log, etc.) as opposed to everything in the Git repo | ||||||
|  | - adds an extra security boundary; encrypted secrets are not world-readable | ||||||
|  | 
 | ||||||
|  | ### ssh/scp scalability | ||||||
|  | 
 | ||||||
|  | - requires taking care of distributing keys | ||||||
|  | - per-user key management typically not automated, requires taking care of that separately | ||||||
|  | 
 | ||||||
|  | ## Additional notes | ||||||
|  | 
 | ||||||
|  | - Managing the interface between public confiuration and secrets is a concern of the code | ||||||
|  |     - For a scalable setup you want something like modules that take secrets as settings | ||||||
|  | - It is possible to split the git-stored secret schemes into private repositories | ||||||
|  |     - Then you have to handle synchronisation, e.g. by importing the public part from the secret part | ||||||
|  |     - This would incur extra overhead for managing access, but that would be the same workflow as managing access to the rest of the Git server | ||||||
|  | - With secrets stored in Git there's a potential for running into merge conflicts, which can be avoided but requires extra care | ||||||
|  |     - Probably you want a monorepo for the entire organisation | ||||||
|  |         - Separating public and private parts through git subtrees is possible but requires even more care and automation/tooling when managing outside contributions | ||||||
|  |         - The upfront effort may be similar (but different in nature) to deploying and maintaining a Vaultwarden server | ||||||
|  | - There's an experience and skill issue involved in maintaining a sophisticated Git repo or a live server, and what is more appropriate will depend on who will be responsible for the setup long-term | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue