Генерисање кључа не захтева привремену датотеку, а њено прескакање поправља мање него што већина водича наговештава. Оно што уклања јесте животни циклус датотеке и трка око чишћења око ње. Оно што оставља нетакнуто јесте свака прилика да тајна касније исцури. Проблем исправности у овим скриптама обично седи на другом месту, јер дијагностика и кључни материјал путују различитим токовима.

Датотека никада није била та изложеност коју сте мислили

Привремена датотека је конкретан ризик када је читљива свима, када преживи пад или када се корак чишћења прескочи после изузетка. То је стварно и вреди поправити. Оне су и локалне, видљиве и лаке за тестирање. Наведите сваку у сопственој скрипти пре него што закључите да је промена била само козметичка.

Тиши ризици седе низводно: кључ одштампан током отклањања грешака, изузетак који серијализује цео објекат резултата, руковалац падом који пише дамп меморије, агрегатор дневника који прима путању датотеке и затим садржај. Избегавање привремене датотеке не чини ништа ни за један од њих, а веровање у супротно је начин на који добронамерно преписивање оставља тајну изложенијом него пре. Третирајте промену као једно побољшање у низу, а не као решење.

Шта клијент пише када није дато име датотеке

Тренутне верзије клијента шаљу генерисани кључ на стандардни излаз када се команда за кључ да без излазне путање. Управо то документовано понашање чини приступ у меморији одрживим и уклања потребу за старијим триком усмеравања алата на путању уређаја.

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

Предајте команду као листу. Овде није потребно проширење љуске, а омогућавање љуске учинило би границу аргумената зависном од наводника које не контролишете. Користите предвиђену извршну датотеку по апсолутној путањи ако скрипта може да ради са другачијом путањом претраге од оне коју очекујете.

Провера повратног кода спречава да се пут успеха настави после неуспелог позива. Без ње, празан низ бајтова може да тече даље и да не успе само много касније, у тачки где се кључ користи и где порука о грешци више уопште не помиње генерисање.

Два тока, два значења

Стандардни излаз носи кључ. Стандардна грешка носи све што алат жели да вам каже, укључујући упозорења о конфигурацији, верзији и типу кључа. Преусмеравање оба у један бафер је грешка која производи уверљиво изгледајући кључ са ушивеном реченицом у средини.

Држите одвојено и пут неуспеха. Када позив не успе, пријавите команду која није успела и излазни статус, а затим свесно одлучите да ли је било који део стандардне грешке безбедан за приказ. Исипање целог објекта резултата у дневник је уобичајена пречица и може да однесе кључ са собом.

Читање безбедно за бинарне податке је важно ако касније хеширате или упоређујете материјал. Текстуални режим са неочекиваним кодирањем може да промени бајтове који никада нису били намењени да буду текст, а измењени кључ се не разликује од погрешног док не падне руковање.

Ако га ипак чувате, учините то свесно

Већина распоређивања на крају захтева кључ на диску, на пролазу или у складишту тајни. Запишите га једном, са ограничавајућим дозволама од стварања, а не каснијим chmod-ом, и учините запис атомским да делимична датотека никада не постане она коју услуга чита при покретању. Преименовање са путање у истом директоријуму је обично довољно за то. Уклоните припремну путању на грани неуспеха, јер је неуспешан запис управо копија коју људи забораве.

Поставите режим датотеке при стварању и држите и режим директоријума ограничавајућим. Избегавајте било коју путању под местом које задатак резервне копије помете без размишљања, јер је тајна у ноћној резервној копији тајна у свакој копији те копије. Исто размишљање важи за дељени том који друге услуге могу да читају.

Дељени кључ није идентитет

Генерисање овог материјала не издаје сертификат, не уписује клијента и не утврђује ко се повезује. Дељени кључ штити канал између страна које већ верују једна другој; идентитет и даље долази од сертификата и било које аутентикације испред њега.

Типови кључева такође нису заменљиви. Симетрични кључ за једну функцију није готова замена за другу, а новија издања додају своје варијанте са различитим датотекама на сваком крају. Генеришите тип који ваша конфигурација заиста именује, а затим га користите у улози коју тај тип дефинише.

Тестирајте резултат стварном везом, а не гледањем величине датотеке. Ако се руковање заврши и дневници не покажу упозорења о кључу, пут генерисања је исправан; да је кључ био одсечен спојеним током, веза би пала на начин који указује на другу страну, а не на скрипту.

Повезани чланци