Генерирането на ключ не се нуждае от временен файл и пропускането му поправя по-малко, отколкото повечето ръководства внушават. Това, което премахва, е жизненият цикъл на един файл и състезанието за почистване около него. Това, което оставя недокоснато, е всяка възможност за изтичане на тайната след това. Проблемът с коректността в тези скриптове обикновено се намира другаде, защото диагностиката и ключовият материал пътуват по различни потоци.

Файлът никога не е бил излагането, което сте си мислили

Временният файл е конкретен риск, когато е четим за всички, когато преживява срив или когато стъпка за почистване е пропусната след изключение. Тези рискове са реални и си струва да бъдат поправени. Те са и локални, видими и лесни за тестване. Назовете всеки един в собствения си скрипт, преди да заключите, че промяната е била козметична.

По-тихите рискове стоят надолу по веригата: ключът, отпечатан по време на отстраняване на грешки, изключението, което сериализира целия обект с резултат, манипулаторът на срив, който записва дъмп на паметта, агрегаторът на журнали, който получава пътя до файла и след това съдържанието. Избягването на временен файл не прави нищо за нито един от тях и вярата в обратното е начинът, по който добронамерено пренаписване оставя тайната по-изложена отпреди. Третирайте промяната като едно подобрение в поредица, а не като поправката.

Какво пише клиентът, когато не е дадено име на файл

Текущите версии на клиента изпращат генерирания ключ към стандартния изход, когато командата за ключ е дадена без изходен път. Точно това документирано поведение прави подхода в паметта жизнеспособен и премахва нуждата от по-стария трик да насочвате инструмента към път на устройство.

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

Подайте командата като списък. Тук не е нужно разгръщане от черупка и включването на черупка би направило границата на аргументите зависима от кавички, които не контролирате. Използвайте предвидения изпълним файл по абсолютен път, ако скриптът може да работи с различен път за търсене от очаквания.

Проверката на кода за връщане не позволява на пътя на успеха да продължи след неуспешно извикване. Без нея празен байтов низ може да продължи напред и да се провали едва много по-късно, в точката, където ключът се използва, а съобщението за грешка вече изобщо не споменава генериране.

Два потока, две значения

Стандартният изход носи ключа. Стандартната грешка носи всичко, което инструментът иска да ви каже, включително предупреждения за конфигурацията, версията и типа ключ. Пренасочването на двете в един буфер е грешката, която произвежда правдоподобно изглеждащ ключ с пришито изречение по средата.

Дръжте пътя на неуспеха също отделно. Когато извикването се провали, съобщете командата, която се е провалила, и статуса на изход, а след това решете съзнателно дали някоя част от стандартната грешка е безопасна за показване. Изхвърлянето на целия обект с резултат в журнал е обичайният пряк път и може да отнесе ключа със себе си.

Безопасното за двоични данни четене е важно, ако по-късно хеширате материала или го сравнявате. Текстовият режим с неочаквано кодиране може да промени байтове, които никога не са били предназначени да бъдат текст, а променен ключ е неразличим от грешен, докато не се провали ръкостискането.

Ако все пак го запазите, направете го съзнателно

Повечето внедрявания в крайна сметка се нуждаят от ключа на диск, на шлюза или в хранилище за тайни. Запишете го веднъж, с ограничителни права от създаването, а не с по-късен chmod, и направете записа атомарен, така че частичен файл никога да не стане този, който услуга чете при стартиране. Преименуване от път в същата директория обикновено е достатъчно за това. Премахнете подготвителния път в клона за неуспех, защото неуспешният запис е точно копието, което хората забравят.

Задайте режима на файла при създаването му и дръжте режима на директорията също ограничителен. Избягвайте всеки път под място, което задача за архивиране помита без да се замисли, защото тайна в нощен архив е тайна във всяко копие на този архив. Същото разсъждение важи за споделен том, който други услуги могат да четат.

Споделеният ключ не е идентичност

Генерирането на този материал не издава сертификат, не записва клиент и не установява кой се свързва. Споделеният ключ защитава канал между страни, които вече си вярват; идентичността все още идва от сертификата и от всякаква автентикация пред него.

Типовете ключове също не са взаимозаменяеми. Симетричен ключ за една функция не е готова замяна за друга и по-новите издания добавят свои варианти с различни файлове от всяка страна. Генерирайте типа, който вашата конфигурация действително назовава, след което го използвайте в ролята, която този тип определя.

Тествайте резултата с реална връзка, а не с оглед на размера на файла. Ако ръкостискането завърши и журналите не показват предупреждения за ключ, пътят на генериране е правилен; ако ключът беше отрязан от слят поток, връзката щеше да се провали по начин, който сочи към отсрещната страна, а не към скрипта.

Подобни статии