Beveiliging
Beveiligingsmodel: de server bewaart alleen versleutelde data
Hoe Crunu omgevingsvariabelen op je apparaten versleutelt, wat de server wel en niet kan zien, hoe sleutels en handtekeningen werken en hoe je een kwetsbaarheid meldt.
Op deze pagina
Crunu versleutelt de inhoud van elke omgeving in je browser of in de agent crunu, voordat er iets wordt verstuurd. De server bewaart versleutelde data, publieke sleutels en ondertekende records, en heeft op geen enkel moment in het protocol een sleutel waarmee hij ze kan ontsleutelen.
Op app.crunu.com beheert Crunu die server. Host je Crunu zelf, dan beheer jij hem. In beide gevallen kan de server je waarden niet lezen. Crunu is in vroege toegang, dus we beschrijven alleen wat de huidige release doet en werken deze pagina bij als dat verandert.
In het kort
- Je omgevingen worden op je apparaten versleuteld. De server bewaart alleen versleutelde data en heeft geen sleutel om die te lezen.
- Je wachtwoord en Secret Key verlaten je apparaat nooit, dus een gestolen database helpt niemand ze te raden.
- Elke omgeving heeft een eigen sleutel. Mensen, machines en CI-tokens krijgen alleen de omgevingen die hun zijn gegeven.
- Toegangslijsten en versies zijn ondertekend, dus de server kan zichzelf niet als ontvanger toevoegen of je data ongemerkt wijzigen.
- De server ziet nog wel metadata: namen, e-mailadressen, de auditlog en wanneer elke versie is opgeslagen.
- Het grootste resterende risico is een gemanipuleerde webpagina. Bekende beperkingen noemt dat risico, samen met elke andere grens die we kennen.
- We publiceren geen SOC 2-rapport of externe audit. Een probleem gevonden? Mail naar security@crunu.com.
Zo reist een secret, stap voor stap
Volg STRIPE_SECRET_KEY vanaf het moment dat Priya hem opslaat tot de programma’s die hem lezen.
- De browser van Priya versleutelt en ondertekent. Haar wachtwoord en Secret Key, 26 willekeurige tekens die op haar apparaat zijn gemaakt, worden gecombineerd tot haar accountsleutel, en geen van beide wordt ooit verstuurd. Bij het opslaan versleutelt de browser de hele nieuwe versie van de omgeving, met elk bestand en elke variabele erin, als één record met de sleutel van die omgeving (AES-256-GCM). Hij vult het record aan tot hele blokken van 4 KB, zodat de precieze grootte niet zichtbaar is, en ondertekent de versie als Priya (Ed25519).
- De server bewaart wat hij niet kan openen. Hij bewaart één versleuteld record per versie, niet één per waarde, samen met de ondertekende toegangslijst die zegt wie het mag lezen. Hij beslist aan wie hij de versleutelde data geeft, maar heeft geen sleutel om die te ontsleutelen.
- Een collega krijgt alleen de omgevingen die hem zijn gegeven. Jonas ontvangt de omgevingssleutels van development en staging, elk versleuteld voor zijn eigen publieke sleutel (X25519). Production staat niet op zijn toegangslijst, dus hij krijgt die sleutel nooit. Zijn browser controleert elke handtekening en elk versienummer voordat hij ontsleutelt.
- Een server krijgt zijn omgeving op dezelfde manier. De agent op
api-prod-1ontvangt de sleutel van production, versleuteld voor die machine, controleert wat de server heeft gestuurd en houdt de ontsleutelde omgeving in het geheugen. Je programma krijgt die viacrunu run, of als bestanden waar je erom vraagt metcrunu pull. - Een CI-job krijgt precies zijn deel. Het servicetoken voor GitHub Actions kan alleen
web-app / staginglezen. Met een CI-binding (OIDC) werkt het alleen vanuit de repository en branch die je hebt gekozen.
Op app.crunu.com draait de server bij Cloudflare. De pagina Subverwerkers noemt elk bedrijf dat voor de dienst data verwerkt, en wat elk ervan kan zien.
In de documentatie: Zo werkt de versleuteling
Sleutels en algoritmen
Crunu gebruikt standaardbouwstenen: AES-256-GCM om te versleutelen, X25519 om sleutels voor een ontvanger te versleutelen, Ed25519 om te ondertekenen, en HKDF-SHA256 en PBKDF2-SHA256 om sleutels af te leiden. De browser gebruikt de ingebouwde WebCrypto en de agent de standaardbibliotheek van Go. Beide worden getest met dezelfde testvectoren.
| Sleutel | Wat hij doet | Waar hij staat |
|---|---|---|
| Wachtwoord | De ene helft van je accountsleutel. Je apparaat rekt het op met PBKDF2-SHA256 en 1.000.000 iteraties. | In je hoofd. Nooit verstuurd. |
| Secret Key | De andere helft: 26 willekeurige tekens, ongeveer 128 bits, gemaakt op je apparaat. | Op je apparaten en in je afgedrukte Emergency Kit. Nooit verstuurd. |
| Accountsleutels | De ene ontvangt omgevingssleutels (X25519). De andere ondertekent je wijzigingen (Ed25519). | Op de server, versleuteld met een sleutel die is afgeleid van je wachtwoord en Secret Key. |
| Omgevingssleutel | Versleutelt elke versie van één omgeving (AES-256-GCM). Toegang tot development geeft geen toegang tot production. | Apart versleuteld voor elke persoon, machine en elk token met toegang. |
| Ondertekeningssleutel van de organisatie | De basis van het vertrouwen. Hij certificeert leden en machines en ondertekent de intrekkingslijst (Ed25519). | Bij eigenaren en admins, versleuteld voor hun accountsleutels. |
| Herstelsleutel van de organisatie | Elke gedeelde omgevingssleutel wordt ook voor deze sleutel versleuteld, zodat eigenaren en admins toegang kunnen herstellen (X25519). | Bij eigenaren en admins. |
| Machinesleutels | Identificeren een machine en ontvangen de omgevingssleutels ervan. Worden op de machine gemaakt bij het inschrijven. | In een bestand op de machine dat alleen de agent en root kunnen lezen. |
| Servicetoken | Het token is de sleutel. Het wordt in de browser van een admin gemaakt en één keer getoond. | In de secretopslag van je CI. De server kent alleen de publieke sleutels ervan. |
| Sleutel van een deellink | Ontsleutelt de bestanden die via één link zijn gedeeld. | In het deel van de link na #, dat browsers niet naar servers sturen. |
| Releasesleutel | Ondertekent elke release van de agent en de webapp (Ed25519). | Bij Crunu, dat de releases publiceert. |
Lekt er een kopie van de database uit, dan lukt het niet om je wachtwoord daaruit te raden: elke gok heeft ook je Secret Key nodig, die nooit op de server stond, dus één gok controleren betekent zoeken tussen ongeveer 2¹²⁸ mogelijkheden. Tokens worden alleen als hashes met sleutel bewaard.
In de documentatie: Emergency Kit en Secret Key · Herstelcode
Elke omgeving wordt apart versleuteld
- Organisaties blijven gescheiden door hun eigen sleutels. Eén server kan veel organisaties hosten. Elke organisatie heeft eigen ondertekenings- en herstelsleutels, en haar omgevingssleutels worden alleen versleuteld voor leden en machines die die organisatie heeft gecertificeerd.
- Toegang tot development opent production niet. Elke omgeving heeft een eigen sleutel, en wie de sleutel van production niet heeft, kan production niet lezen.
- Specific files betekent ook echt specifieke bestanden. Een persoon met die rol, of een machine die op Selected files staat, ontvangt een versleutelde kopie van alleen de gekozen bestanden.
- Operators richten machines in zonder waarden te zien. Ze hebben helemaal geen omgevingssleutel. Iemand die de sleutel wel heeft, keurt de toegang van elke machine goed.
- Netwerkregels beperken waar inhoud naartoe gaat. Een omgeving kan alleen aan toegestane IP-bereiken worden geleverd, voor mensen, machines en tokens. Een regel versoepelen wacht 15 minuten met een waarschuwing, tenzij een tweede admin ondertekent. Aanscherpen geldt meteen. Dit is een regel die de server afdwingt, geen versleuteling.
In de documentatie: Rollen in organisaties en omgevingen · Netwerkregels
Wat de server wel en niet kan zien
Ook een blinde server heeft een paar gegevens nodig: aan wie hij versleutelde data levert en wat hij in de auditlog schrijft. Dit is de volledige lijst.
Leesbaar voor de server
- Namen van organisaties, projecten, omgevingen, machines, servicetokens, toegangsprofielen en netwerklijsten
- Namen en e-mailadressen van leden, en de adressen waar uitnodigingen naartoe gaan
- Wie welke rol heeft in welke omgeving, volgens de ondertekende toegangslijst
- Per versie: het nummer, wie de versie opsloeg, wanneer, en de grootte, naar boven afgerond op een veelvoud van 4 KB
- Welke versie elke persoon, machine en elk token heeft ontvangen, wanneer en vanaf welk IP-adres
- De auditlog, je apparaten en sessies, en de IP-adressen die ze gebruiken
- Je netwerkregels: de IP-bereiken die je toestaat
- Het geheim van je authenticator-app, als je er een gebruikt. De server controleert je codes, dus hij bewaart dat geheim versleuteld met een eigen sleutel.
Alleen versleuteld
- Alles binnen een omgeving: namen en waarden van variabelen, bestandsnamen, paden, inhoud en notities. Elke versie is één versleuteld record van de hele omgeving, dus de server ziet geen afzonderlijke variabelen en ook niet welke er is gewijzigd.
- Bestanden die je via deellinks verstuurt
- De privésleutels van accounts en van de organisatie
Wordt nooit naar de server gestuurd
- Je wachtwoord en je Secret Key
- Je herstelcode. De server heeft een kopie van je accountsleutel die alleen met de code te ontsleutelen is.
- Privésleutels van machines, die op de machine worden gemaakt en daar blijven
- De sleutel in een deellink, die na de
#staat die browsers niet versturen - De servicetokens zelf. De server kent alleen hun publieke sleutels.
Dat bedoelen we met een blinde server: hij ziet wie en wanneer, maar niets binnen je omgevingen. Op app.crunu.com is de leesbare lijst precies wat Crunu kan zien, en het Privacybeleid zegt hoe lang we het bewaren. Houd secrets uit namen: een project dat naar een nog niet aangekondigde deal is vernoemd, vertelt de server over die deal, ook al blijft elke waarde erin versleuteld.
In de documentatie: Wat de server ziet
Wie je secrets kan lezen
- Mensen aan wie je toegang geeft. Leden krijgen alleen de omgevingen die hun zijn gegeven. Waarden verbergen in de app is een weergavekeuze: wie een waarde kan ontsleutelen, kan die ook kopiëren.
- Eigenaren en admins. Zij hebben de herstelsleutel van de organisatie, dus ze kunnen elke gedeelde omgeving openen. Ze kunnen ook de persoonlijke omgevingen van leden openen zolang de instelling van de organisatie voor herstel van persoonlijke omgevingen aanstaat, en dat is standaard zo.
- Machines en CI. Elke machine en elk token leest alleen wat het is gegeven. Inschrijfcodes zijn standaard 15 minuten geldig en vervallen bij het eerste gebruik, en je keurt een machine pas goed nadat je de vingerafdruk hebt vergeleken die
crunu enrollerop toont. Een ingetrokken machine laat haar omgevingen binnen enkele minuten los, zolang ze online is. - Niet de medewerkers van Crunu. Op app.crunu.com beheert Crunu de server, en de server heeft geen sleutel. Wij zien de metadata hierboven. Om bij je waarden te komen, zou de code die op je apparaat draait moeten worden gewijzigd, bijvoorbeeld via een gemanipuleerde webpagina. Bekende beperkingen legt dat risico uit.
- Iedereen die probeert in een account te komen. Inloggen staat in 15 minuten 10 mislukte pogingen per IP-adres en 5 per account toe, en een onbekend e-mailadres en een verkeerd wachtwoord krijgen hetzelfde antwoord. Een nieuw apparaat heeft je tweede factor nodig, een authenticator-app of een passkey, zodra je er een aanzet. Sessies eindigen na 12 uur zonder activiteit en na hooguit 7 dagen, en met een gestolen sessie kun je je wachtwoord, Secret Key of accountsleutels niet wijzigen.
In de documentatie: Machines en leases · Een servicetoken via OIDC aan CI binden · Inloggen vanuit de terminal
Hoe releases worden gebouwd en gecontroleerd
- Elke release van de agent
crunuen de webapp is ondertekend met een Ed25519-releasesleutel. - Releases van de agent worden gepubliceerd op releases.crunu.com: binaries,
.deb-pakketten,install.shen een ondertekend manifest. Het installatiescript controleert de SHA-256 van de binary van de agent, encrunu self-updatecontroleert de releasehandtekening met een sleutel die in de agent is ingebouwd. De installatieopdracht die de webapp toont, bevat checksums uit de ondertekende release. - Crunu publiceert het ondertekende manifest van de webapp op app.crunu.com. Bij het laden controleert de app die handtekening en de eigen build tegen het manifest, en toont Signed build in de zijbalk. Klik op dat label om elk bestand van de site te controleren. Klopt er iets niet, dan zegt de app dat je je wachtwoord niet moet invoeren.
- Die controle draait in code die dezelfde server heeft geleverd. Ze vangt een kapotte of door elkaar geraakte uitrol, maar geen server die de pagina en de controle samen aanpast.
- De build van de webapp is reproduceerbaar: één broncommit levert altijd dezelfde bestanden op. De pagina staat geen scripts van derden toe en laadt haar eigen code met integriteitschecksums (CSP en SRI).
- Weinig afhankelijkheden: de agent gebruikt alleen de standaardbibliotheek van Go, en de browsercode bevat één npm-pakket,
yaml.
In de documentatie: crunu bijwerken met self-update
Back-ups, beschikbaarheid en vertrekken
- Op app.crunu.com bewaart de database bij Cloudflare tot 30 dagen herstelgeschiedenis. Tijdens de vroege toegang beloven we geen bepaalde beschikbaarheid. Zie de Servicevoorwaarden.
- Bewaar je eigen kopie. De app kan een offline kopie downloaden van elke omgeving waartoe je toegang hebt. Die opent met je wachtwoord en Secret Key, zonder server. Omgevingen met netwerkbeperkingen zitten er niet in.
- Draai het zelf, of verhuis. Dezelfde server draait in Docker op je eigen machine, op Cloudflare Workers, Vercel en Google Cloud Run, en op AWS App Runner in accounts die daar nog toegang toe hebben. Eén archief zonder onversleutelde waarden verhuist hem daartussen, en hetzelfde archief is je back-up. Zie Zelf hosten.
In de documentatie: Export en offline kopie · Back-ups en herstel
Wat er wordt bewaard en hoe lang
- Versies. Elke omgeving bewaart haar laatste 100 versies, tot 64 MB. Een oude versie terugzetten slaat die op als een nieuwe.
- Auditlog. Inlogs, uitnodigingen, rolwijzigingen, opgeslagen versies, sleutelrotaties, machines, tokens, deellinks en geweigerde verzoeken komen in een log waarvan de regels een hashketen vormen. Een regel wijzigen, verwijderen of invoegen breekt de keten, en Verify integrity laat dat zien. De log wordt standaard 365 dagen bewaard, en eigenaren kunnen dat verlengen. Waarden komen er nooit in, want de server heeft ze niet.
- Leveringsgegevens en verwijdering. Het overzicht van wie elke versie heeft ontvangen, wordt bewaard tot 90 dagen na de laatste levering en daarna samengevoegd tot een samenvatting. Je account verwijderen vraagt je wachtwoord en Secret Key. Een verwijderde organisatie is meteen onbeschikbaar en wordt kort daarna in delen verwijderd. Het Privacybeleid heeft de volledige tabel.
In de documentatie: Auditlog · Versies en geschiedenis
Als de server zelf is overgenomen
We ontwerpen voor het ergste geval: een gelekte database, een kwaadwillende beheerder of een gekaapt cloudaccount, waarna de server kan antwoorden wat hij wil. Je apparaten controleren wat hij stuurt, dus ook dan kan hij je waarden niet lezen, zichzelf niet als ontvanger toevoegen, geen sleutel verwisselen, geen versie wijzigen, production niet hernoemen, geen eigen organisatie voor de jouwe laten doorgaan en geen andere sleutel ertussen schuiven als iemand erbij komt. Apps en agents onthouden ook de nieuwste staat die ze hebben geaccepteerd en weigeren alles wat ouder is, dus een opnieuw afgespeelde toegangslijst haalt iemand die je hebt verwijderd niet terug. Een gloednieuw apparaat heeft niets om mee te vergelijken, dus bij het eerste bezoek merkt het een terugdraaiing niet op.
Wat hij nog wel kan: dienst weigeren, metadata lezen en een gemanipuleerde webpagina leveren. Waarschuwingen melden inlogs vanaf nieuwe apparaten, hergebruikte inschrijfcodes, hergebruikte CI-tokens en herhaalde weigeringen. Vertrekt iemand, dan roteert de app de sleutels die die persoon had en noemt de waarden om opnieuw uit te geven. Bij een gestolen apparaat vervangt Device compromised je accountsleutels en roteert elke omgeving waarvan je een sleutel had.
Horen we dat app.crunu.com is gehackt, dan mailen we de getroffen accounthouders zonder onnodige vertraging: wat er is gebeurd, om welke data het gaat en wat je nu moet doen. Een inbraak op de dienst legt versleutelde data en metadata bloot, niet de waarden in je omgevingen, die zonder je wachtwoord en Secret Key niet te ontsleutelen zijn. Het Privacybeleid bevat dezelfde toezegging.
In de documentatie: Offboarding van een collega · Omgevingssleutels roteren · Waarschuwingen
Wat aan jou is
Versleuteling haalt de server van de lijst van dingen die je secrets kunnen lezen. Een paar dingen kun alleen jij doen.
- Druk je Emergency Kit af als je je aanmeldt en bewaar hem uit de buurt van je apparaten. Niemand, ook wij niet, kan je wachtwoord resetten of je Secret Key herstellen.
- Maak een herstelcode aan en bewaar die apart van de Emergency Kit. Hij opent je account na een wachttijd, standaard één uur, zonder je tweede factor.
- Zet een tweede factor aan en houd de vergrendeling bij inactiviteit kort. Standaard vergeet de app je sleutels na 10 minuten zonder activiteit.
- Geef elke persoon en machine alleen wat nodig is, en houd het aantal eigenaren en admins klein.
- Vertrekt iemand, geef de waarden die die persoon zag dan opnieuw uit bij elke provider. Rotatie beschermt nieuwe versies, niet wat iemand al heeft gezien.
- Waarschuwt de app ‘Build signature doesn’t match: do not enter your password’, voer je wachtwoord dan niet in en meld het aan je admin.
In de documentatie: Beperkingen · Vergrendeling en time-out bij inactiviteit
Audits en documenten
Crunu is nieuw en in vroege toegang. We hebben geen certificeringen zoals SOC 2 of ISO 27001 en hebben geen externe audit gepubliceerd.
Deze documenten beschrijven hoe de dienst met data omgaat:
- Privacybeleid: wat we bewaren, waarom en hoe lang
- Subverwerkers: wie de dienst samen met ons draait, en waar
- Servicevoorwaarden en Beleid voor aanvaardbaar gebruik
Voor je eigen controles kunnen eigenaren en admins de auditlog als JSONL exporteren en de hashketen buiten Crunu controleren. Vertrekt iemand, dan toont het blootstellingsrapport welke versies van welke omgevingen die persoon heeft ontvangen, wanneer en vanaf waar, en kun je het downloaden.
Een kwetsbaarheid melden
Mail naar security@crunu.com met de stappen om het probleem te reproduceren. Laat echte secrets uit je melding.
Als je test:
- test alleen met accounts en organisaties die je zelf hebt aangemaakt, of met toestemming van de eigenaren;
- open en bewaar geen data van anderen, en laat het ons weten als je er per ongeluk bij komt;
- voer geen denial-of-servicetests uit, stuur geen spam en gebruik geen social engineering;
- houd geautomatiseerd scannen licht genoeg om andere gebruikers niet te hinderen.
We bevestigen dat we je melding hebben ontvangen en houden je op de hoogte terwijl we eraan werken. We spreken met je een datum voor openbaarmaking af, normaal binnen 90 dagen na je melding.
Het Beleid voor aanvaardbaar gebruik heeft de volledige regels, inclusief onze toezegging geen juridische stappen te nemen tegen onderzoek te goeder trouw. Hetzelfde contact staat in security.txt.