Ik plaats dit in programming, omdat het echt zo'n dingetje is waar programmeurs veel mee bezig (zouden moeten) zijn.
Stel een applicatie moet inloggen bij een database, hoe gaat deze applicatie zich authenticeren?
Dan heb ik grofweg de volgende manieren gevonden:
Plaintext wachtwoorden in environment variabelen
Dit zie ik vaak terug op internet, ook in combinatie met Docker containers. Een container moet natuurlijk zo "ephemeral" mogelijk zijn, dus geef je configuratie aan hem mee (in plaats van dat de configuratie in de container staat).
Er bestaat echter het gevaar dat het wachtwoord dan lekt, getuige het volgende topic (wat ook deels inspiratie is voor dit topic, maar vooral een discussie over Laravel is / wordt):
[Laravel] Security
Gebruik je een Docker management tool als Portainer, dan staan je wachtwoorden ook plaintext in beeld en dat vind ik niet zo tof.
Plaintext wachtwoorden in configuratiebestanden
Dit zie ik ook vaak, zowel meegeleverd met de applicatie, als ook los van de applicatie.
Het eerste is natuurlijk niet aan te raden, want het zal er ook vaak toe leiden dat programmeurs deze configuratiewaarden ook committen naar een hun source control en het daarmee (onbedoeld) overal en nergens naartoe verspreiden. Getuige de verhalen over mensen die hun AWS keys op github plaatsen:
https://medium.com/@naggu...l-experience-960be7aad039

Een (iets betere) oplossing is dan om de configuratiebestanden buiten de application root te plaatsen. Ze komen niet meer onbedoeld in source control terecht en de kans dat je ze per ongeluk exposed is daarmee een stuk kleiner. Ook kun je de rechten vergaand instellen. Op Linux kun je bijvoorbeeld Mandatory Access Control (selinux) gebruiken en configureren dat alleen bepaalde processen bepaalde bestanden kunnen lezen.
Dit is een oplossing die ik nog wel aardig vind.
White box cryptography
Dit kom ik ook nog weleens tegen. Credentials worden dan symmetrisch versleuteld met een key die embedded is in de applicatie en weer ontsleuteld op het moment dat het nodig is. Eigenlijk schiet je hier niet zoveel mee op, want als iemand de embedded key weet, kan hij de rest ook ontsleutelen. Bovendien loert het gevaar dat je die key weer commit naar source control.
Wat mij betreft geeft dit vooral schijnveiligheid.
Integrated Windows security (op Windows)
Vanuit mijn werk als .NET ontwikkelaar ben ik bekend met Integrated Security (SSPI). Kortom, ik stel in dat SQL Server in mixed mode draait en configureer voor bepaalde Windows accounts dat ze bepaalde rechten hebben op SQL Server.
Vervolgens draai ik mijn applicaties met die accounts en stel de connection string zo in dat hij Integrated Security moet gebruiken.
Windows regelt dan de authenticatie voor mij en ik hoef helemaal geen wachtwoorden in mijn configuratie te plaatsen. Zolang ik er maar voor zorg dat de Windows authenticatie werkt (dus zowel app server als db server moeten dezelfde account + wachtwoord hebben, of je gebruikt Active Directory).
Kerberos
Dit is de achterliggende techniek die Integrated Security op Windows gebruikt. Kerberos kun je natuurlijk ook op Linux gebruiken:
https://help.ubuntu.com/lts/serverguide/kerberos.html.en
Zelf heb ik hier nog geen ervaring mee, maar het lijkt me een aardige oplossing. Al moet ik nog wat verder er induiken hoe het nou precies zit met die tickets en hoe je nou elke keer een nieuwe krijgt (dat zal de PAM module waarschijnlijk doen?).
HashiCorp Vault
Na een tijdje Google-fu kwam ik op spring.io de volgende blog entry tegen:
https://spring.io/blog/20...naging-secrets-with-vault
Dit klinkt op zich ook wel goed. De grap is dat de vault zelf onvoldoende gegevens bevat om de informatie te ontsleutelen. Na een reboot moet er altijd iemand handmatig de vault "unsealen" door een passphrase in te voeren.
Ik ben nog niet in de implementatiedetails gedoken, maar ik vermoed dat het met een random gekozen master key werkt + meerdere sub key slots voor elke operator (zoals het bij LUKS werkt). Omdat je de passphrase nodig hebt om de master key te ontsleutelen, kun je er helemaal niks mee zolang de vault niet "unsealed" is.
Alsnog moeten de clients wel tickets hebben en kun je hiermee wel bij de configuratiewaarden...
Een service van het besturingssysteem (Data Protection API / Keychains)
Als ik bijvoorbeeld voor een Windows client applicatie een wachtwoord moet opslaan, kan ik daarvoor de Data Protection API gebruiken:
https://docs.microsoft.co...a?view=netframework-4.7.2
Op de Mac heb je Keychain Access. Is er ook zoiets voor Linux? Mijn eerste zoekopdrachten leveren weinig positiefs op:
https://github.com/dotnet/corefx/issues/22510
Conclusie / vraag
Hoe gaan jullie om met wachtwoorden en overige secrets bij het ontwikkelen en deployen van applicaties?
Vinden jullie het zinvol om zoiets als HashiCorp Vault te gebruiken? Of gebruiken jullie losse configuratiebestanden met vergaande access control? Of leef je in een corporate environment met een Kerberos server? (op Linux of Active Directory op Windows)
Of doe je iets wat ik hier nog niet noem?
Wat vinden jullie het beste, maar ook meest praktische?
Stel een applicatie moet inloggen bij een database, hoe gaat deze applicatie zich authenticeren?
Dan heb ik grofweg de volgende manieren gevonden:
Plaintext wachtwoorden in environment variabelen
Dit zie ik vaak terug op internet, ook in combinatie met Docker containers. Een container moet natuurlijk zo "ephemeral" mogelijk zijn, dus geef je configuratie aan hem mee (in plaats van dat de configuratie in de container staat).
Er bestaat echter het gevaar dat het wachtwoord dan lekt, getuige het volgende topic (wat ook deels inspiratie is voor dit topic, maar vooral een discussie over Laravel is / wordt):
[Laravel] Security
Gebruik je een Docker management tool als Portainer, dan staan je wachtwoorden ook plaintext in beeld en dat vind ik niet zo tof.
Plaintext wachtwoorden in configuratiebestanden
Dit zie ik ook vaak, zowel meegeleverd met de applicatie, als ook los van de applicatie.
Het eerste is natuurlijk niet aan te raden, want het zal er ook vaak toe leiden dat programmeurs deze configuratiewaarden ook committen naar een hun source control en het daarmee (onbedoeld) overal en nergens naartoe verspreiden. Getuige de verhalen over mensen die hun AWS keys op github plaatsen:
https://medium.com/@naggu...l-experience-960be7aad039

Een (iets betere) oplossing is dan om de configuratiebestanden buiten de application root te plaatsen. Ze komen niet meer onbedoeld in source control terecht en de kans dat je ze per ongeluk exposed is daarmee een stuk kleiner. Ook kun je de rechten vergaand instellen. Op Linux kun je bijvoorbeeld Mandatory Access Control (selinux) gebruiken en configureren dat alleen bepaalde processen bepaalde bestanden kunnen lezen.
Dit is een oplossing die ik nog wel aardig vind.
White box cryptography
Dit kom ik ook nog weleens tegen. Credentials worden dan symmetrisch versleuteld met een key die embedded is in de applicatie en weer ontsleuteld op het moment dat het nodig is. Eigenlijk schiet je hier niet zoveel mee op, want als iemand de embedded key weet, kan hij de rest ook ontsleutelen. Bovendien loert het gevaar dat je die key weer commit naar source control.
Wat mij betreft geeft dit vooral schijnveiligheid.
Integrated Windows security (op Windows)
Vanuit mijn werk als .NET ontwikkelaar ben ik bekend met Integrated Security (SSPI). Kortom, ik stel in dat SQL Server in mixed mode draait en configureer voor bepaalde Windows accounts dat ze bepaalde rechten hebben op SQL Server.
Vervolgens draai ik mijn applicaties met die accounts en stel de connection string zo in dat hij Integrated Security moet gebruiken.
Windows regelt dan de authenticatie voor mij en ik hoef helemaal geen wachtwoorden in mijn configuratie te plaatsen. Zolang ik er maar voor zorg dat de Windows authenticatie werkt (dus zowel app server als db server moeten dezelfde account + wachtwoord hebben, of je gebruikt Active Directory).
Kerberos
Dit is de achterliggende techniek die Integrated Security op Windows gebruikt. Kerberos kun je natuurlijk ook op Linux gebruiken:
https://help.ubuntu.com/lts/serverguide/kerberos.html.en
Zelf heb ik hier nog geen ervaring mee, maar het lijkt me een aardige oplossing. Al moet ik nog wat verder er induiken hoe het nou precies zit met die tickets en hoe je nou elke keer een nieuwe krijgt (dat zal de PAM module waarschijnlijk doen?).
HashiCorp Vault
Na een tijdje Google-fu kwam ik op spring.io de volgende blog entry tegen:
https://spring.io/blog/20...naging-secrets-with-vault
Dit klinkt op zich ook wel goed. De grap is dat de vault zelf onvoldoende gegevens bevat om de informatie te ontsleutelen. Na een reboot moet er altijd iemand handmatig de vault "unsealen" door een passphrase in te voeren.
Ik ben nog niet in de implementatiedetails gedoken, maar ik vermoed dat het met een random gekozen master key werkt + meerdere sub key slots voor elke operator (zoals het bij LUKS werkt). Omdat je de passphrase nodig hebt om de master key te ontsleutelen, kun je er helemaal niks mee zolang de vault niet "unsealed" is.
Alsnog moeten de clients wel tickets hebben en kun je hiermee wel bij de configuratiewaarden...
Een service van het besturingssysteem (Data Protection API / Keychains)
Als ik bijvoorbeeld voor een Windows client applicatie een wachtwoord moet opslaan, kan ik daarvoor de Data Protection API gebruiken:
https://docs.microsoft.co...a?view=netframework-4.7.2
Op de Mac heb je Keychain Access. Is er ook zoiets voor Linux? Mijn eerste zoekopdrachten leveren weinig positiefs op:
https://github.com/dotnet/corefx/issues/22510
Conclusie / vraag
Hoe gaan jullie om met wachtwoorden en overige secrets bij het ontwikkelen en deployen van applicaties?
Vinden jullie het zinvol om zoiets als HashiCorp Vault te gebruiken? Of gebruiken jullie losse configuratiebestanden met vergaande access control? Of leef je in een corporate environment met een Kerberos server? (op Linux of Active Directory op Windows)
Of doe je iets wat ik hier nog niet noem?
Wat vinden jullie het beste, maar ook meest praktische?
[ Voor 6% gewijzigd door Lethalis op 10-12-2018 11:21 ]
Ask yourself if you are happy and then you cease to be.