Приостановить одного клиента 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, отзыв сработал. Всё между этим проблема прав или перезагрузки, и её стоит исправить до прихода следующего запроса.