Не давайте NetworkManager показывать сохранённый пароль VPN
Спрашивайте каждый раз, передайте в связку ключей или держите файл только для root. У каждого выбора разная экспозиция, и флаг пароля должен ей соответствовать.
NetworkManager может хранить пароль VPN, чтобы подключение поднималось без чьего-либо ввода, и может снова показать это значение в редакторе или через nmcli --show-secrets. Есть три модели владения, а поведение при показе — лишь симптом того, какую вы выбрали. Сначала выберите модель, затем задайте соответствующий ей флаг, вместо того чтобы прятать поле за заполнителем, который запутает следующего человека.
Три модели владения
Первая модель спрашивает каждый раз. Ничего не сохраняется, секрет существует только на время активации, и каждый, кто запускает подключение, должен знать пароль. Это наименее удобный вариант и самый простой для защиты.
Вторая передаёт секрет в связку ключей, принадлежащую пользователю. Агент разблокируется при старте сеанса и выдаёт значение по запросу, что держит его вне файла подключения, но привязывает подключение к сеансу этого пользователя. Отсюда два условия: агент должен работать и должен быть разблокирован.
Третья хранит защищённые учётные данные для системного подключения. Оно переживает перезагрузки и работает до чьего-либо входа, а взамен значение лежит на диске под защитой прав файла, а не шифрования.
Каждая модель разумна в подходящем контексте. Ошибка — смешивать их, и именно так ноутбук оказывается с секретом в двух местах и без ясного ответа, какой из них главный. Запишите, какую модель использует профиль. Одна строка в командном руководстве избавит следующего человека от изобретения четвёртого места для поиска.
Прочитайте текущее состояние перед изменением
Посмотрите на профиль и на состояние секрета как пользователь, который управляет подключением. Вторая команда и есть та, что говорит, действительно ли значение читается.
nmcli connection show "Office VPN"
nmcli --show-secrets connection show "Office VPN"
sudo stat -c '%U %a %n' /etc/NetworkManager/system-connections/*.nmconnection
Файл ключа в этом каталоге обычно принадлежит root с режимом 600. Это не пускает обычных пользователей и не удерживает root, что важно, когда машина общая или когда резервная копия выполняется от root.
Права файла — это граница, а не шифрование. Тот, кто может прочитать файл от root, видит пароль открытым текстом. Это приемлемый обмен для сервера без присмотра и плохой для общей рабочей станции. Однократная запись избавляет от долгого спора о том, защищено ли значение.
Что делает каждое значение флага
Секрет VPN несёт свойство flags, и значения не очевидны из одних чисел.
| Value | Meaning | Practical effect |
|---|---|---|
| 0 | No special flag | Secret is typically saved with the connection |
| 1 | Agent-owned | A keyring or secret agent supplies it |
| 2 | Not saved | Prompted at each activation |
| 4 | Not required | Connection proceeds without asking |
Фактическое поведение зависит ещё и от плагина и от того, работает ли агент, поэтому считайте таблицу договором, а наблюдаемое поведение — тем, что вы проверяете. Значение, работающее на одном рабочем столе, может вести себя иначе на сервере без сеанса. Именно в этом разрыве живёт большинство запутанных заявок.
Задайте свойство явно вместо того, чтобы удалять строку и надеяться. Отсутствующий флаг — не политика, и следующее обновление пакета может заполнить его чем-то, чего вы не предполагали.
Согласуйте модель с моментом, когда запускается подключение
Если подключение запускается только пока пользователь вошёл в систему, владение агентом подходит и держит секрет вне файла. Если оно запускается при загрузке, до появления любого сеанса, агент вам не поможет.
Для большинства машин это и есть всё решение. Это же объясняет класс запутанных отчётов, где подключение работает интерактивно и срывается после перезагрузки. Флаг никогда не менялся; изменился контекст.
Для случая без присмотра практичный ответ — ограниченный файл, принадлежащий root, или одобренный источник учётных данных. Держите его вне профиля подключения, если этот профиль когда-нибудь экспортируется или копируется на другую машину.
Если значение уже было видно, смените его
Изменение флага не затрагивает сам пароль. Значение, появившееся на снимке экрана, в истории shell, в пакете, отправленном в поддержку, или в файле, который могли открыть другие пользователи, следует считать раскрытым.
Смените его на сервере, затем исправьте клиент и завершите любой сеанс, прошедший аутентификацию со старым. Удаление локального подключения ничего не отзывает на той стороне, и именно это упускают.
Затем перестаньте помещать пароль в командную строку. Он попадает в историю shell и может появиться в списке процессов; используйте интерактивный запрос или агент.
Проверьте, подключившись заново
Повторите команду, показавшую секрет, и убедитесь, что поле больше не выводится. Затем отключитесь и подключитесь снова, а если подключение запускается автоматически — перезагрузитесь, потому что интересный сбой появляется только при смене контекста сеанса.
Если секрет всё ещё показывается, его выдаёт другой профиль или другой агент. Осмотрите активное подключение и связку ключей вместо удаления файлов, пока симптом не сместится.