Файл с расширением .conf выглядит скромно: несколько десятков строк текста, ни иконки, ни пароля, ни окна с предупреждением. Но по своей роли он ближе к пропуску в здание, чем к документу. Тот, кто скопировал этот файл, получил возможность подключаться к вашей сети от имени сотрудника, которому он предназначался. Никто не спросит его фамилию, никто не попросит второй фактор, если вы сами его не добавили. Сервер видит только ключ.

Поэтому вопрос «как отправить человеку конфиг» на самом деле звучит иначе: как выдать пропуск нужному человеку и не оставить дубликатов в местах, о которых вы потом забудете. Разберём это по порядку: что внутри файла, каким путём его передавать, чем QR-код отличается от файла, где оседают временные копии и что делать, когда уверенности в сохранности профиля больше нет.

Что на самом деле лежит в файле

Типичный клиентский профиль состоит из двух блоков: [Interface] и [Peer]. В первом описано то, что относится к самому устройству: закрытый ключ, адрес внутри туннеля, иногда DNS. Во втором описан сервер: его открытый ключ, адрес и порт, куда подключаться, список сетей, которые нужно направлять в туннель, и при необходимости параметр поддержки соединения.

С точки зрения секретности эти строки очень неравноценны. Открытый ключ сервера, его адрес и порт не являются тайной в том смысле, который нас сейчас интересует: они нужны любому клиенту, и их утечка сама по себе не даёт доступа. Единственная по-настоящему чувствительная строка — закрытый ключ клиента. Согласно краткому руководству WireGuard, у каждого peer есть пара из закрытого и открытого ключей. Открытая половина лежит на сервере и служит там опознавательным знаком; закрытая остаётся у владельца и доказывает, что он тот, за кого себя выдаёт.

Отсюда следует практический вывод, который часто упускают. Сервер не хранит закрытый ключ клиента и не нуждается в нём. Если этот ключ оказался в чужих руках, сервер не заметит подмены: он увидит корректно аутентифицированные пакеты от известного открытого ключа. В справочнике wg(8) прямо сказано, что peer идентифицируется именно открытым ключом, а адрес его конечной точки обновляется по пакетам, прошедшим аутентификацию. То есть злоумышленник с копией файла может подключаться из любой сети, и сервер аккуратно запомнит его новый адрес.

Остальные строки тоже кое-что рассказывают

Даже если закрытый ключ не считать, профиль раскрывает устройство вашей сети. По параметру AllowedIPs видно, какие подсети находятся за туннелем. Этот параметр, как описано в wg(8), задаёт разрешённые адреса входящего трафика от peer и одновременно направления исходящего; IPv4 и IPv6 перечисляются отдельно. Для постороннего это готовая карта того, что стоит искать за VPN-шлюзом. Внутренний адрес клиента показывает, как устроена адресация. Поэтому профиль нельзя считать безобидным документом даже мысленно вынув из него ключ: он годится как разведывательные данные.

Строка PersistentKeepalive, если она есть, секретов не содержит. Руководство поясняет, что она поддерживает состояние NAT, по умолчанию выключена и нужна не каждой конфигурации. Для разговора о выдаче профилей важно другое: это пример параметра, который зависит от устройства и сети получателя, а значит, универсальный «золотой» файл для всех сотрудников вы не получите. Лучше с самого начала привыкнуть, что у каждого человека и каждого устройства свой профиль со своим ключом и своим адресом.

Один профиль на одно устройство

Соблазн понятен: сделать один хороший файл и раздать его всей команде. Это удобно ровно до первого вопроса «кто подключился в три часа ночи». Если ключ общий, сервер видит один и тот же peer, и отличить Анну с рабочего ноутбука от её коллеги, получившего файл из чата, невозможно. Отозвать доступ одному человеку тоже нельзя, не отключив всех.

Когда у каждого устройства свой ключ, картина другая. В журналах и в выводе wg show видны отдельные peer, у каждого свой открытый ключ и своё последнее рукопожатие. Увольнение, потеря телефона или подозрение на утечку превращаются в локальную операцию: убираем один peer, остальные продолжают работать. Это и есть главная причина, по которой безопасная выдача начинается не с канала передачи, а с вопроса, сколько профилей вы создаёте.

Выбор канала: чем ответ на вопрос «куда отправить» отличается от вопроса «кому»

Общий чат с названием вроде «ИТ-поддержка» или «Весь офис» — худший кандидат. Файл, отправленный туда, видят все участники, он остаётся в истории, попадает в резервные копии мессенджера, синхронизируется на телефоны и планшеты людей, которые к этому профилю не имеют отношения. Даже если вы удалите сообщение, вы не знаете, у кого оно уже скачано. Личная переписка лучше, но тоже несовершенна: история остаётся на двух устройствах и на сервере сервиса, а учётную запись человека могут скомпрометировать независимо от VPN.

Разумный подход — думать не о «самом защищённом канале вообще», а о двух отдельных задачах: передать секрет и убедиться, что он попал к нужному человеку. Они решаются по-разному.

Подтверждение получателя

Прежде чем выдавать профиль, администратору нужно удостовериться, что запрос пришёл от того, кто его якобы отправил. Просьба «пришлите мне конфиг, я работаю из дома» в мессенджере с незнакомой аватаркой — классика. Несколько приёмов, которые не требуют ничего экзотического:

  • запрос создаётся в трекере задач или почтовой системе компании, где уже есть учётная запись сотрудника, а не в случайном чате;
  • для новичков профиль выдаётся при личной встрече или во время видеозвонка, где вы видите человека и сразу просите подтвердить импорт;
  • если человек в другом городе, перезвоните ему по номеру из кадровой системы, а не по номеру из просящего сообщения;
  • руководитель подтверждает необходимость доступа, особенно для подрядчиков и временных сотрудников.

Ни один из этих приёмов не является технической защитой. Это организационная проверка, и нужна она потому, что WireGuard сам по себе ничего не знает о людях: он знает только ключи.

Короткая сцена выдачи

Представим небольшую компанию, где к VPN-шлюзу нужно подключить нового бухгалтера, Ирину. Пример условный, но хорошо показывает последовательность действий. Администратор получает заявку в трекере от руководителя отдела. Он создаёт для Ирины отдельную пару ключей на её рабочем ноутбуке, если это возможно, или генерирует профиль у себя и назначает ему отдельный внутренний адрес. Затем он назначает короткий звонок. По видеосвязи Ирина показывает экран своего ноутбука, администратор называет путь, куда сохранить файл или как отсканировать QR-код, и ждёт, пока профиль появится в клиенте. После этого он просит Ирину включить туннель и сам смотрит на сервере в wg show: появился ли у нужного peer свежий момент последнего рукопожатия. Только когда это видно, заявка закрывается. Файл, из которого шёл импорт, удаляется сразу, а в карточке заявки остаётся запись: кому, на какое устройство, когда и под каким открытым ключом выдан доступ.

Заметьте, что в этой сцене ничего не было отправлено «на всякий случай» и не осталось висеть в чате. Подтверждение получателя и подтверждение импорта слились в один разговор. А проверка по wg show закрыла вопрос, который иначе остался бы открытым: добрался ли профиль до устройства и работает ли он.

Идеальный вариант: ключ не покидает устройство

Самый надёжный способ уменьшить число копий — не создавать их вовсе. Если закрытый ключ создаётся на самом устройстве сотрудника, а администратору передаётся только открытый ключ, то секрет вообще не путешествует по каналам. Администратор добавляет peer по открытому ключу и присылает в ответ всё остальное: адрес сервера, его открытый ключ, назначенный внутренний адрес. Эти данные не секретны, и их можно отправить обычным письмом. Такой порядок требует чуть большей подготовки от пользователя, зато убирает целый класс проблем: нет файла с закрытым ключом, нет что чистить, нет что терять.

Если это нереально, потому что сотрудники не технари, а клиентское приложение умеет только импортировать готовый профиль, остаётся передача секрета в готовом виде. Тогда всё, о чём пойдёт речь дальше, становится особенно важным.

Ссылка не равна одноразовой

Часто для передачи профиля используют облачное хранилище, файлообменник или внутренний портал со ссылкой на скачивание. Звучит удобно: человек получает адрес, открывает, скачивает. Но здесь легко совершить ошибку мысли: назвать такую ссылку одноразовой, не проверив, что именно умеет сервис.

Свойства ссылки определяет не слово «временная» в вашей инструкции, а настройки конкретного сервиса. Часть сервисов позволяет ограничить срок действия, часть — число скачиваний, часть — защитить ссылку паролем, а часть ничего из этого не делает, и ссылка живёт, пока вы вручную не отключите общий доступ. Бывает и так, что ссылка формально перестаёт работать, а файл остаётся в корзине или в версиях и доступен владельцу учётной записи. Поэтому правило простое: описывайте ссылку только теми свойствами, которые вы реально увидели в настройках, и сами проверяйте их на тестовом файле. Если сервис не гарантирует, что файл скачивается один раз, называйте такую ссылку «ссылкой с ограниченным сроком» или «ссылкой по доступу», а не одноразовой, и действуйте так, будто она может быть открыта повторно.

Из этого же следует требование к самому порядку действий. Если ссылка может быть использована несколько раз, то после подтверждения импорта её нужно отключить вручную, а не ждать, что она «сама истечёт». А если сервис не позволяет надёжно убрать файл, это сигнал не пользоваться им для профилей с закрытыми ключами.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации Россия, США, Франция и Великобритания. Оплата картой РФ и по СБП.

АРЕНДОВАТЬ СЕРВЕР

QR-код и файл: две оболочки одного секрета

QR-код нередко воспринимают как нечто более безопасное: он «картинка», его вроде бы нельзя случайно переслать как документ. Это заблуждение. QR-код профиля WireGuard — просто закодированный текст того же конфигурационного файла, включая закрытый ключ. Любой, кто сфотографировал экран, сделал снимок или получил картинку, получил тот же профиль. Разница лишь в удобстве импорта и в том, где остаются следы.

У QR-кода есть реальное преимущество для телефонов: не нужно передавать файл через мессенджер или почту, достаточно навести камеру приложения на экран администратора или распечатку. Но это преимущество работает только при очной выдаче. Если QR отправили картинкой в чат, вы получили все недостатки файла плюс новые: изображение попадает в галерею, облачную фотосинхронизацию и предпросмотры уведомлений.

Файл и QR-код как формы одного секрета
СвойствоФайл .confQR-код
Что внутриПолный профиль, включая закрытый ключТот же профиль в закодированном виде
Где обычно оседает копияЗагрузки, почта, мессенджер, облачная папкаГалерея, снимки экрана, история чата, распечатка
Когда удобнееНастольные клиенты, удалённая настройка по звонкуТелефон рядом с администратором
Что нужно сделать после импортаУбрать файл из мест, куда он попалЗакрыть экран, уничтожить распечатку, убрать снимок

Если вы показываете QR на экране в офисе, стоит помнить, кто смотрит через плечо и что висит над монитором в виде камеры. Если печатаете, распечатка должна жить минуты, а не недели. А если QR создавался на экране администратора и сотрудник сфотографировал его вместо сканирования приложением, этот снимок надо найти и убрать вместе с облачной копией.

Временные копии: где остаётся то, что вы не отправляли

Самое неприятное в выдаче профилей — не то, как вы отправили файл, а то, что при этом создалось само. Копии появляются в местах, о которых думаешь в последнюю очередь:

  • Папка загрузок. Браузер или мессенджер сохраняет файл туда без вопросов, и он лежит месяцами, пока кто-нибудь не наведёт порядок.
  • Переписка. Вложение остаётся в истории чата на обоих устройствах, а нередко и в веб-версии на третьем компьютере.
  • Почтовые вложения. Письмо хранится в отправленных у администратора, во входящих у получателя и на почтовом сервере.
  • Резервные копии и синхронизация. Папка «Документы» или «Рабочий стол» может уезжать в облако, и тогда профиль живёт там, куда вы его не отправляли.
  • Рабочий каталог администратора. Каталог, где генерировались профили, годами копит чужие закрытые ключи.
  • Вывод диагностики. По справочнику wg(8), wg showconf и машинный дамп могут включать секреты, поэтому вставка такого вывода в заявку или чат ничем не лучше пересылки самого файла.

Последний пункт заслуживает отдельного внимания. Администраторы привыкли копировать в чат вывод команд, когда просят помощи, и забывают, что некоторые формы вывода содержат ключи. Перед тем как вставить результат, просмотрите его глазами и замените секретные значения. Обычный wg show удобен для проверки состояния, но и его вывод стоит читать, а не слепо пересылать.

Почему «удалил» не означает «стёр»

Удаление файла через интерфейс системы обычно лишь убирает его из видимости или переносит в корзину. Содержимое может сохраняться в версиях облачного хранилища, в снимках файловой системы, в резервных копиях, на других синхронизированных устройствах. Обещать, что после удаления копий больше нет, нельзя, и в регламенте такое обещание писать не стоит. Честнее строить политику так, чтобы она не опиралась на полное стирание: считать, что любой профиль, который побывал в неконтролируемом месте, потенциально скомпрометирован, и при сомнении заменять его, а не пытаться «зачистить следы».

Тем не менее разумная гигиена работает и снижает риск: убрать файл из загрузок, очистить корзину, удалить вложение из чата, отключить общий доступ у ссылки, проверить, не попал ли файл в синхронизируемую папку. Это уменьшает поверхность, но не заменяет решения о замене профиля, если есть причина сомневаться.

Короткий срок жизни временной копии

Полезно заранее договориться о сроке, в течение которого любая промежуточная копия допустима. Например: файл существует только до подтверждения импорта, а подтверждение происходит в тот же день или в ту же встречу. Срок не волшебный, он просто делает ожидания явными. Администратор знает, что после подтверждения нужно убрать исходник у себя. Сотрудник знает, что после импорта файл из загрузок надо убрать. В заявке стоит отметка, что это сделано обеими сторонами. Без такой договорённости копии живут «до лучших времён», а лучшие времена наступают после инцидента.

Подтверждение, что профиль работает и что он на месте

Импорт файла ещё не доказывает, что человек подключился. Видимый ответ сервера — свежее рукопожатие у соответствующего peer в wg show. Это действие занимает полминуты и закрывает сразу три вопроса: файл попал на нужное устройство, ключ рабочий, а маршрут и адрес назначены без ошибок. Если рукопожатия нет, не спешите пересылать файл ещё раз «на всякий случай»: повторная отправка создаёт ещё одну копию секрета. Сначала разберитесь с причиной: порт, адрес конечной точки, часы, фильтры. Особенно внимательно проверьте, что вы смотрите на тот peer, которому выдавали профиль, а не на соседний с похожим именем.

Обратите внимание и на содержимое AllowedIPs. Если вы выдаёте профиль, который направляет в туннель только внутренние сети, сотрудник не заметит разницы в обычном интернете. Если в файле записан маршрут на весь трафик, поведение устройства изменится существенно, и об этом лучше предупредить заранее. Это не вопрос секретности, но вопрос ожиданий: человек, не понимающий, почему поменялась скорость или перестали открываться локальные устройства, начнёт «чинить» сам, и, возможно, пришлёт вам файл вместе с жалобой.

Когда профилю больше нельзя доверять

Рано или поздно возникает ситуация, в которой нельзя уверенно сказать, что профиль не покидал контролируемого круга. Поводы разные: файл отправили не в тот чат, ноутбук потерян, телефон сдан в ремонт, сотрудник признался, что пересылал конфиг себе на личную почту, подрядчик закончил работу. Нужно решить, считать ли профиль скомпрометированным. Здравый критерий — не доказанность утечки, а невозможность её исключить. Если файл с закрытым ключом побывал там, где вы не контролируете доступ, правильное решение — заменить профиль.

Замена состоит из нескольких шагов, и порядок важен:

  1. Создать новую пару ключей для этого устройства и подготовить новый профиль. Закрытый ключ нового профиля не должен совпадать со старым, иначе замена теряет смысл.
  2. Выдать новый профиль нужному человеку по той же процедуре подтверждения получателя, что и первый раз, и убедиться по wg show, что новый peer подключается.
  3. Удалить старый peer. Справочник wg(8) указывает, что peer идентифицируется открытым ключом и может быть удалён командой вида wg set ... peer ... remove. После этого сервер перестаёт принимать пакеты с этим ключом, и копия старого файла становится бесполезной.
  4. Зафиксировать результат в записи о выдаче: какой ключ отозван, когда и почему.

Различие между работающим интерфейсом и файлом конфигурации здесь принципиально. В wg(8) подчёркнуто, что изменение запущенного интерфейса и правка конфигурационного файла — разные действия. Если вы убрали peer командой на живом интерфейсе, но не изменили файл, при следующем перезапуске интерфейса старый peer может вернуться, и отозванный ключ снова заработает. Поэтому отзыв нужно проводить в обоих местах: и на работающем интерфейсе, и в сохранённой конфигурации. Для применения изменений без пересоздания всех peer документация описывает syncconf: он применяет различия, не трогая остальные подключения. Конкретную последовательность стоит один раз отработать на тестовом сервере, прежде чем использовать её в бою, чтобы не обнаружить расхождение между файлом и интерфейсом в момент инцидента.

Порядок «сначала новый, потом удалить старый» нужен, чтобы человек не остался без доступа посреди рабочего дня. Но при явной утечке и подозрении на злоупотребление можно сделать наоборот: сначала отозвать старый, а новый выдать следом. Это решение о риске, а не о технике, и его лучше принимать по заранее написанному правилу, а не в стрессе.

Если замена ключей становится регулярной практикой, а не разовой реакцией, имеет смысл посмотреть на автоматизацию. Об этом подробнее в статье про ротацию ключей WireGuard: регулярная замена снимает вопрос «а вдруг где-то остался старый файл», потому что срок его полезности и так конечен.

Где всё это должно работать

Для самого шлюза не нужны большие ресурсы: он принимает и пересылает пакеты, а вся «тяжесть» процесса выдачи — человеческая. Тем не менее место, где хранятся данные о выданных профилях и откуда администратор управляет peer, должно быть под вашим контролем. На VPS MAATRIX с root-доступом вы сами решаете, как устроено хранение конфигурации, кто имеет доступ к каталогу с ключами и как оформлены права на файлы. Среди локаций в публичном предложении указаны UK, US, RU и FR, а самые небольшие тарифы начинаются с конфигурации 1 vCPU, 2 ГБ RAM и 40 ГБ NVMe. Это отправная точка для проверки на вашем числе клиентов и вашем трафике, а не обещание ёмкости: сколько устройств комфортно обслужит выбранный план, покажет только тест под реальной нагрузкой.

Отдельный совет, связанный с тематикой статьи: не держите на сервере каталог, где лежат готовые профили всех сотрудников «на случай, если кто-то потеряет». Это превращает шлюз в склад чужих закрытых ключей и делает его самой привлекательной целью. Лучше хранить только открытые ключи и записи о выдаче, а потерянный профиль заменять новым, а не восстанавливать из архива.

Жизненный цикл профиля

Если сжать всё сказанное, у каждого профиля есть три состояния, и полезно, чтобы у вас в записях они были видны явно.

Выдан. Создан для одного человека и одного устройства, получатель подтверждён, передача прошла по выбранному каналу, импорт подтверждён рукопожатием в wg show, исходные копии убраны, в записи указан открытый ключ.

Используется. Профиль живёт на устройстве, сервер видит регулярные рукопожатия, а сотрудник знает, что файл нельзя пересылать, а при потере устройства или сомнении нужно сразу сообщить. Если появляется причина не доверять профилю, он не «чинится», а переходит в следующее состояние.

Отозван. Peer убран и с работающего интерфейса, и из сохранённой конфигурации, замена выдана при необходимости, в записи отмечены дата и причина. Старый файл, где бы он ни лежал, превратился в набор строк, которым нечего открывать.

В этой простой схеме нет ничего сложного, и именно в этом её сила: она не требует идеальной зачистки следов, потому что опирается на возможность отзыва. Копии неизбежно появляются, и вопрос только в том, что вы сделаете, когда одна из них окажется там, где ей не место.