Geïnspreerd door de vele "supply chain" aanvallen de laatste tijd en door envchain (wat op Mac en Linux werkt, maar niet op Windows) en een paar soortgelijke tools, heb ik een nieuw tooltje gemaakt over de laatste maanden: Envoke.
Maak een bestand aan in je projectmap wat .envoke heet:
Elke "backend" (keychain, aws) kan ook geconfigureerd worden in een globale configuratie op gebruikersnivo, maar dat is voor eenvoudig gebruik niet nodig. De "keychain" en "aws" backends werken zonder configuratie. Er zijn nog meer backends gepland, maar voorlopig zijn "keychain" en "aws" de enigen die geimplementeerd zijn.
Documentatie | Blog post | github.com/gerco/Envoke
Wat doet het?
Geheimen zoals wachtwoorden, API keys, AWS keys en soortgelijke dingen opslaan in je OS Keychain zodat je die niet als environment variables in je shell hebt zitten en ook niet onbeschermd in je ~/.aws/credentials hebt staan. Daarnaast kun je het ook gebruiken om geheimen te delen met je team door een .envoke bestand aan je Git repo toe te voegen waardoor je makkelijk dezelfde geheimen kunt inladen als je teamgenoot zonder dat die veel hoeft te configureren.Hoe begin je?
Een voorbeeld is waarschijnlijk het makkelijkst:Bash:
De waardes voor de AWS variabelen bestaan alleen tijdens de uitvoering van aws s3 ls en zijn daarna weer verdwenen. Je besturingssysteem past de normale beveiliging toe op deze waardes dus ze kunnen op macOS bijvoorbeeld alleen gelezen worden door de applicatie die ze heeft weggeschreven. Je kunt eisen dat je een wachtwoord moet invoeren voor de waardes beschikbaar worden, etc.1
2
3
4
5
6
7
8
9
| $ envoke set aws-test AWS_ACCESS_KEY_ID Value for aws-test/AWS_ACCESS_KEY_ID: ... $ envoke set aws-test AWS_SECRET_ACCESS_KEY Value for aws-test/AWS_SECRET_ACCESS_KEY: ... $ envoke aws-test -- aws s3 ls 2026-04-29 00:15:10 mijn-s3-bucket 2026-04-28 16:13:01 nog-een-s3-bucket |
Geavanceerd gebruik
Het is zo wel makkelijk om één set waardes vanuit één bron te gebruiken, maar dat is ook wat beperkend. Envoke ondersteund ook configuratiebestanden waarmee je een hele set waardes aan een project kan koppelen en je dan niet meer in het commando hoeft te beschrijven welke waardes je wilt gebruiken: een .envoke bestand.Maak een bestand aan in je projectmap wat .envoke heet:
YAML:
Nu kun je in het project al deze geheimen in één keer inladen:1
2
3
4
5
6
7
8
9
| verbose: true namespaces: - name: aws-test - name: application-config backend: aws - name: test-appclient-credentials backend: aws - name: test-rabbitmq-credentials backend: aws |
Bash:
Hier haalt Envoke eerst de "aws-test" waardes uit de OS keychain op en gebruikt die vervolgens om meer waardes in te laden uit AWS Secrets Manager. Daarna start de applicatie op. .envoke is bedoeld om in Git te worden ingecheckt zodat het beschikbaar is voor alle ontwikkelaars in een team.1
2
3
4
5
6
| $ envoke just backend namespace "aws-test": backend "keychain", fetched 2 key(s) namespace "application-config": backend "aws", fetched 26 key(s) namespace "test-appclient-credentials": backend "aws", fetched 5 key(s) namespace "test-rabbitmq-credentials": backend "aws", fetched 5 key(s) running: just backend |
Elke "backend" (keychain, aws) kan ook geconfigureerd worden in een globale configuratie op gebruikersnivo, maar dat is voor eenvoudig gebruik niet nodig. De "keychain" en "aws" backends werken zonder configuratie. Er zijn nog meer backends gepland, maar voorlopig zijn "keychain" en "aws" de enigen die geimplementeerd zijn.
Documentatie | Blog post | github.com/gerco/Envoke
- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!
/f/image/7lWDrFAZbdKc3ouahAcm4aGz.png?f=fotoalbum_tile)
/f/image/eIM6kctpEQrieYGIb2Zjr78S.png?f=fotoalbum_tile)
:strip_exif()/f/image/fAZhhO7nUwefLw355R2uBlGt.jpg?f=fotoalbum_large)
:strip_exif()/f/image/nTGqQuoNgGWJZhRNw129XNoC.jpg?f=fotoalbum_large)
/f/image/s632Wf1fQ3UA2orLPXTc5HJv.png?f=fotoalbum_large)
/f/image/LrEmsdaGO5579WLzJeqyY0EB.png?f=fotoalbum_tile)
/f/image/jjhKJKQlYbZYVv1P9hUOYB7J.png?f=fotoalbum_tile)
/f/image/fOS4qKQ2ROL8bvBTZXRpeto3.png?f=fotoalbum_tile)
/f/image/vPO3KSSd0DeK3LB44qYwfOZc.png?f=fotoalbum_tile)
/f/image/XkZSOatcAVsoczHr7zxNDIPg.png?f=fotoalbum_tile)
/f/image/CtTUu4oB88VyZwjijq9NYjk9.png?f=fotoalbum_tile)
/f/image/ILIn3mpzxBMROBEJZ11QAEm5.png?f=fotoalbum_tile)
/f/image/mVEatmkIOkFpcnZ8qiaHkWyR.png?f=fotoalbum_tile)
/f/image/kkjQJHcJ41jynqqcKBXgkCoY.png?f=fotoalbum_tile)
/f/image/JJIwYno71u76Nmv9LPWsGRL1.png?f=fotoalbum_tile)
/f/image/5lKYxNI2wXJPon0OVPH8bpn1.png?f=fotoalbum_tile)
/f/image/6pkfc0Fj7U68t8tENf08fQnR.png?f=fotoalbum_tile)
/f/image/LfRFNSZ0d0rji7PVPJTepNkb.png?f=fotoalbum_tile)
/f/image/POVHK2OruA7VWOclZOI6X0Wf.png?f=fotoalbum_tile)
/f/image/e38itL3xNhzjdoC5dEHijoKa.png?f=fotoalbum_large)
:strip_exif()/f/image/8haiwBorDsUgDc5eKorJCbry.png?f=user_large)
/f/image/kJx944BHahYxqZKBpkK1Y6Yd.png?f=fotoalbum_large)