Призупинити одного клієнта 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, відкликання спрацювало. Усе між цим проблема прав або перезавантаження, і її варто виправити до надходження наступного запиту.