Wat zijn geheimen en hoe ze moeten worden verwerkt in Java

Voltooid

Geheimen zijn tekenreeksen die niet mogen worden gedeeld met de buitenwereld: ze kunnen databasewachtwoorden, persoonlijke versleutelingssleutels, persoonlijke toegangstokens enzovoort zijn. Voor verbeterde beveiliging beschouwen veel mensen ook dat alles wat een aanvaller kan helpen, als geheim moet worden beschouwd: de URL naar uw productiedatabase kan bijvoorbeeld worden gezien als een geheim. Uw database mag niet openbaar toegankelijk zijn. De reden hiervoor is dat dit soort informatie van nature gevoelig is en hoe minder informatie beschikbaar is in uw code, hoe beter.

Wat is Zero Trust en Zero Secrets?

Het concept van Zero Trust is dat niemand blind vertrouwd mag worden en toegang mag krijgen tot bedrijfsresources zonder te worden gevalideerd en geautoriseerd.

Dit concept is ook van toepassing op webtoepassingen: ze mogen geen geheimen hebben die zijn opgeslagen in hun code of in hun uiteindelijke binaire bestanden. Het is wat we Zero Secrets noemen.

Geheimen moeten worden beheerd door een extern systeem, met strikte toegangsregels en validatie, om het risico op aanvallen te verminderen.

Geheimen niet in Git-opslagplaatsen plaatsen

Zelfs als uw Git-opslagplaats privé is, is het plaatsen van een geheim in uw broncode een slechte gewoonte:

  • Iedereen met toegang tot uw opslagplaats kent uw gevoelige gegevens
  • Iedereen met toegang tot uw toepassing binair bestand kan er geheimen uit extraheren

Zodra een geheim is opgeslagen in een Git-opslagplaats, kunnen aanvallers het altijd vinden door te kijken naar de geschiedenis van de opslagplaats, waar het na lange tijd kan worden vergeten.

Zelfs als het praktisch lijkt om dit te doen, moet u nooit geheimen opslaan in uw broncodeopslagplaats. Om dit probleem te voorkomen, kunt u automatische hulpprogramma's gebruiken die regelmatig uw opslagplaats controleren en waarschuwingen verzenden als ze per ongeluk een wachtwoord of database-URL vinden die is opgeslagen.

Omgevingsvariabelen gebruiken

De eenvoudigste oplossing voor het beheren van geheimen is het gebruik van omgevingsvariabelen. Ze hebben verschillende voordelen:

  • Ze zijn eenvoudig te gebruiken
  • Ze werken op alle systemen (zelfs in on-premises systemen)
  • Iedereen kent ze en begrijpt hoe ze werken

Ze zijn echter niet veilig genoeg: alle processen op uw systeem kunnen ze lezen en ze worden eenvoudig weergegeven met behulp van Java Management Extensions (JMX) op een Java-systeem.

Als gevolg hiervan worden omgevingsvariabelen vaak gezien als een eerste stap in de richting van Zero Trust: ze zijn veiliger dan het rechtstreeks opslaan van geheimen in de broncode, maar ze hebben geen beheermogelijkheden en zijn gemakkelijk toegankelijk voor aanvallers.

Kubernetes-geheimen gebruiken

Kubernetes heeft een idee van secrets, wat een andere goede oplossing is. Deze geheimen kunnen worden geladen als een bestand in het bestandssysteem van de toepassing: een Java-programma kan dat bestand vervolgens tijdens het opstarten lezen om toegang te krijgen tot deze geheimen. Hulpprogramma's zoals de Spring Frameworks hebben zelfs standaardondersteuning voor dit mechanisme, zodat ze deze geheimen op een eenvoudige en efficiënte manier kunnen gebruiken.

Dit mechanisme is veiliger dan omgevingsvariabelen, omdat deze bestanden alleen kunnen worden gelezen door het proces waarvoor ze zijn vereist. Ze profiteren ook van het rijke Kubernetes-ecosysteem en ze kunnen worden beheerd door verschillende beheerhulpprogramma's, waaronder de hulpprogramma's van uw cloudprovider.

Hoewel Kubernetes-geheimen een goede oplossing zijn voor Kubernetes, zijn ze ook beperkt tot Kubernetes en ontbreken geavanceerde beheermogelijkheden, afhankelijk van de hulpprogramma's die worden gebruikt voor het beheren van de Kubernetes-infrastructuur.

Een geheimenarchief gebruiken

Een geheimenarchief, zoals Hashicorp Vault of Azure Key Vault, is speciale software voor het beheren van geheimen. Het biedt een uitgebreid beheersysteem om gebruikers te autoriseren, beveiligingssleutels te roteren en te valideren welke toepassing toegang heeft tot welk geheim.

Ze bieden ook een externe API, zodat ze op elk systeem kunnen worden gebruikt. U kunt bijvoorbeeld Azure Key Vault gebruiken voor alle Azure-services, waaronder Virtual Machines, Azure-app Services, Azure Kubernetes Services of Azure Spring Apps.

Een geheimenarchief is de veiligste oplossing voor het beheren van geheimen, maar ze vereisen het gebruik van een speciaal hulpprogramma.