Спиране на един клиент на OpenVPN: защо отнемането е грешният лост
Убиването на сесията е обратимо; отнемането на сертификата не е. Решете кой лост е нужен на случая и преизградете CRL само когато това пасва.
Спирането на достъпа на един клиент и премахването му завинаги изглеждат като една и съща задача, докато не опитате да отмените едното от двете. Отнемането на сертификат записва запис, който сървърът приема за окончателен, а обръщането му означава ръчна редакция на базата данни на издателя. Изхвърлянето на живия тунел е команда за управление, която не променя нищо в доверието. Изберете лоста, като питате дали ключът все още заслужава доверие, а не като питате колко спешна изглежда заявката.
Вярването: отнет и спрян са едно и също
Изпълнител се спира за седмица и рефлексът е да се отнеме, защото отнемането звучи като изключване на нещо. Изглежда подредено, отнема десет секунди и оставя редакция на базата данни като единствения път назад. Рефлексът е разбираем и е по-близо до изгаряне на паспорт, отколкото до затваряне на врата. Спряното устройство и компрометираният ключ изискват различно отношение и само едното от тях е евтино за обръщане.
Разликата е в удостоверението, а не в човека. Ключ, който все още е в правилните ръце, може да бъде спрян и възстановен без загуба на доверие. Ключ, който може да е бил копиран, никога не бива да се възстановява, защото възстановяването твърди, че копието не съществува.
Запишете отговора, преди да докоснете която и да е от двете системи. Ако не можете да кажете дали ключът е разкрит, консервативният отговор е подмяна.
Изхвърлете живата сесия с интерфейса за управление
OpenVPN предоставя интерфейс за управление, който може да изброява сесии и да убие една от тях по общо име. Включете го на localhost, дръжте го далеч от публичния интерфейс и изпратете командата за убиване, когато сесията трябва да изчезне веднага. Командата затваря само този тунел и всеки друг клиент продължава да работи.
Това е отговор на активен проблем, а не политика за спиране. Същият профил може да се свърже отново за минута, защото нищо в удостоверението му не се е променило. Използвайте го, когато сесията трябва да си отиде, а трайното решение още се взема.
Потвърдете, че сесията е била свързана, преди да я убиете, за да не търсите клиент, който никога не се е свързвал. Командата за състояние по-долу отпечатва какво е свързано в момента.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506Ако убиването съобщи, че няма такъв клиент, общото име в сертификата не е низът, който сте въвели. Четете изхода от състоянието, а не името на файла с профила.
Какво всъщност контролира CRL
Сървърът не се допитва до флаг за отнемане, съхранен в сертификата. Той чете списъка с отнети сертификати, посочен в crl-verify, при всяка нова връзка и отхвърля сертификат, чийто сериен номер се среща в този списък. От това следват две последствия и двете са важни оперативно. Файлът трябва да е четим за акаунта, към който сървърът отстъпва права, а вече свързан клиент продължава да работи, докато не се свърже отново.
Второто последствие изненадва хората по време на инциденти. Отнемането на сертификат не затваря тунела, който го използва в момента. Свържете отнемането с управляващо убиване, ако сесията трябва да приключи незабавно, и третирайте двете действия като отделни стъпки в процедурата.
Прегледайте списъка, за да видите какво сървърът наистина ще налага, вместо да се доверявате на времевия печат на последния файл, който сте копирали. Броят на серийните номера е важната част.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemСписък без записи и списък с правилните записи изглеждат еднакво в списък на директория, затова си струва броят на серийните номера да се отпечата. Редът с правата е също толкова важен, защото файл, който демонът не може да прочете, дава отказ, който изглежда като отхвърлен клиент.
Възстановяване на запис, внимателно
Възстановяването на сертификат означава обръщане на запис в базата данни за издаване и публикуване на нов списък. easy-rsa 3 държи тази база като index.txt в директорията PKI, докато по-старите схеми са използвали друго разположение. Редът започва с буква за състояние и дата на изтичане. Отнет ред вмъква времеви печат за отнемането, преди да продължи със серийния номер, името на файла на сертификата и отличителното име. Връщането на реда означава изтриване на този времеви печат и обръщане на буквата, като всичко останало се оставя непокътнато.
Първо архивирайте файла и направете редакцията със скрипт, вместо да пишете в текстов редактор. Печатна грешка, която променя броя на полетата в реда, чупи издаването за всеки сертификат, добавен след това. Затова промяната трябва да се автоматизира и файлът да се копира, преди да се докосне.
Второ отнемане на същото име също често се проваля, защото първото изпълнение е преместило този сертификат и ключа му извън директориите, в които инструментът очаква да ги намери. Тогава инструментът не може да намери това, което е помолен да отнеме, а съобщението за грешка не винаги е ясно защо.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlПубликувайте новия списък, поправете собствеността му и накарайте сървъра да го прочете. Презареждане е достатъчно при повечето инсталации, но потвърждението трябва да дойде от нова връзка, защото съществуващата сесия не е проверявала нищо отново.
Проверете кой лост заслужава случаят
Задайте единствения въпрос, който решава цялата процедура: частният ключ все още ли е само там, където трябва да бъде. Ако е така, убиването на сесията плюс документирано спиране покрива случая и не оставя траен запис. Ако не е, единственият безопасен отговор е нов ключ, а старият сертификат остава отнет.
След това проверете резултата с опит за връзка, а не с разлика в конфигурацията. Разликата ви казва какво сте възнамерявали, а връзката ви казва какво налага сървърът.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506Когато възстановен клиент се свърже и се появи в изхода от състоянието, редакцията на записа е проработила. Когато отнет клиент бъде отказан и журналът назове CRL, отнемането е проработило. Всичко между тях е проблем с права или презареждане и си струва да се поправи, преди да пристигне следващата заявка.