Nyckelgenerering behöver ingen tillfällig fil, och att hoppa över den rättar mindre än de flesta guider antyder. Det den tar bort är en fillivscykel och kapplöpningen om städning runt den. Det den lämnar orört är varje möjlighet att läcka hemligheten efteråt. Korrekthetsproblemet i dessa skript sitter oftast någon annanstans, eftersom diagnostik och nyckelmaterial färdas på olika strömmar.

Filen var aldrig den exponering du trodde

En tillfällig fil är en konkret risk när den är läsbar för alla, när den överlever en krasch eller när ett städsteg hoppas över efter ett undantag. Det är verkligt, och det är värt att rätta. De är också lokala, synliga och lätta att testa. Namnge var och en i ditt eget skript innan du drar slutsatsen att ändringen var kosmetisk.

De tystare riskerna sitter nedströms: nyckeln som skrivs ut under felsökning, undantaget som serialiserar hela resultatobjektet, krashanhanteraren som skriver en kärndump, loggsamlaren som tar emot filvägen och sedan innehållet. Att undvika en tillfällig fil gör ingenting för någon av dem, och att tro motsatsen är hur en välment omskrivning lämnar hemligheten mer exponerad än förut. Behandla ändringen som en förbättring i en serie, inte som lösningen.

Vad klienten skriver när inget filnamn anges

Nuvarande versioner av klienten skickar den genererade nyckeln till standardutdata när nyckelkommandot ges utan en utdatasökväg. Just detta dokumenterade beteende gör minnesmetoden livskraftig, och det tar bort behovet av det äldre tricket att peka verktyget mot en enhetssökväg.

import subprocess
proc = subprocess.run(
    ["openvpn", "--genkey", "tls-crypt"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    check=True,
)
key_material = proc.stdout

Skicka kommandot som en lista. Här behövs ingen skalexpansion, och att aktivera ett skal skulle göra argumentgränsen beroende av citattecken du inte kontrollerar. Använd den avsedda körbara filen via absolut sökväg om skriptet kan köras med en annan sökväg än du förväntar dig.

Returkodskontrollen hindrar framgångsvägen från att fortsätta efter ett misslyckat anrop. Utan den kan en tom bytesträng flöda vidare och misslyckas först mycket senare, vid den punkt där nyckeln används och felmeddelandet inte längre nämner generering alls.

Två strömmar, två betydelser

Standardutdata bär nyckeln. Standardfel bär allt verktyget vill säga dig, inklusive varningar om konfigurationen, versionen och nyckeltypen. Att omdirigera båda till en enda buffert är felet som producerar en trovärdigt utseende nyckel med en mening insydd i mitten.

Håll också felvägen åtskild. När anropet misslyckas, rapportera kommandot som misslyckades och utgångsstatusen, och bestäm sedan medvetet om någon del av standardfelet är säkert att visa. Att dumpa hela resultatobjektet till en logg är den vanliga genvägen, och den kan bära med sig nyckeln.

Binärsäker läsning spelar roll om du senare hashar eller jämför materialet. Textläge med en oväntad kodning kan ändra byte som aldrig var avsedda som text, och en ändrad nyckel går inte att skilja från en felaktig förrän en handskakning misslyckas.

Om du ändå lagrar den, gör det medvetet

De flesta utrullningar behöver så småningom nyckeln på disk, på gatewayen eller i ett hemlighetslager. Skriv den en gång, med restriktiva behörigheter från skapandet i stället för en senare chmod, och gör skrivningen atomär så att en partiell fil aldrig blir den som en tjänst läser vid start. En namnändring från en sökväg i samma katalog brukar räcka för det. Ta bort stagingvägen på felgrenen, för den misslyckade skrivningen är just den kopia folk glömmer.

Sätt filmoden när filen skapas, och håll också katalogmoden restriktiv. Undvik varje sökväg under en plats som ett säkerhetskopieringsjobb sopar upp utan att tänka, för en hemlighet i en nattlig säkerhetskopia är en hemlighet i varje kopia av den säkerhetskopian. Samma resonemang gäller för en delad volym som andra tjänster kan läsa.

En delad nyckel är inte en identitet

Att generera detta material utfärdar inget certifikat, registrerar ingen klient och fastställer inte vem som ansluter. Den delade nyckeln skyddar en kanal mellan parter som redan litar på varandra; identiteten kommer fortfarande från certifikatet och vilken autentisering som helst framför det.

Nyckeltyperna är inte heller utbytbara. En symmetrisk nyckel för en funktion är ingen direkt ersättning för en annan, och nyare utgåvor lägger till egna varianter med olika filer i varje ände. Generera den typ som din konfiguration faktiskt namnger, och använd den sedan i den roll som den typen definierar.

Testa resultatet med en riktig anslutning i stället för att inspektera filstorleken. Om handskakningen slutförs och loggarna inte visar några nyckelvarningar är genereringsvägen rätt; om nyckeln hade trunkerats av en sammanslagen ström skulle anslutningen misslyckas på ett sätt som pekar på motparten i stället för skriptet.

Relaterade artiklar