Эффективно используем бесплатный менеджер паролей KeePass. Часть 1

Как настроить KeePass для входа на сайты. Автоматическое определение адреса. Эквивалентные домены. Нестандартная авторизация, автонабор отдельных полей. Облачная синхронизация между устройствами. Резервное копирование базы.

Речь пойдет об использовании KeePass, в основном, на Windows. При этом сама программа кросплатформенная, а также имеет ряд адаптаций, из которых уделим внимание KeePass2Android. Чтобы база была общей на разных устройствах, обеспечим облачную синхронизацию.

Эта статья касается, в первую очередь, самого типичного применения менеджера паролей — авторизации на сайтах. Более узкие темы, как то авторизацию в разнообразных приложениях, использование нескольких баз, дополнительную защиту и т.д., рассмотрим в отдельной статье. И еще одну статью посвятим параметрам запуска KeePass'а.

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

Обычному пользователю™ достаточно прочитать пункт Основы, не раскрывая в нем спойлеры.

Достоинства и недостатки предлагаемой конфигурации

Предложенный вариант использования KeePass'а — лишь один из многих. Его достоинства:

  • портативность;
  • защищенный ввод мастер-пароля;
  • быстрая разблокировка коротким паролем (плагин KeePassQuickUnlock);
  • автонабор паролей с защитой от слежения за клавиатурой;
  • копирование паролей с частичной защитой от слежения за буфером обмена;
  • автоматическое резервное копирование без плагинов;
  • автоматическая облачная синхронизация без плагинов, в т.ч. с несколькими хранилищами;
  • фоновое выполнение синхронизации, не мешающее работе;
  • ускоренный автонабор;
  • нестандартный автонабор, в т.ч.:
    • двухстраничная авторизация,
    • набор произвольного поля,
    • набор произвольной последовательности,
    • набор с задержкой и без усложнения (плагин TCATO_Placeholder);
  • интеграция в браузеры, не требующая их настройки (плагин WebAutoType);
  • автоматический переход к подходящей записи (плагин AutoTypeShow);
  • поддержка эквивалентных доменов;
  • меню выбора браузера (в т.ч. портативного или браузера в песочнице);
  • запуск из KeePass'а приложений с одновременным автонабором (монтирование томов VeraCrypt, соединение по AmmyyAdmin и др.);
  • защищенный процесс KeePass'а (запрет чтения памяти и т.п.);
  • возможность KeePass'а работать с правами администратора, но понижать права открываемых им браузеров и других приложений;
  • работа с несколькими базами, в т.ч. автооткрытие нескольких баз;
  • использование KeePass'а как менеджера закладок;
  • возможность открывать базу без ввода пароля.

Недостатки:

  • автонабор запускается вручную;
  • глобальный автонабор вызывается медленно;
  • записи создаются по шаблонам;
  • не используется подхват данных из браузера;
  • при импорте данных из другой базы необходимо выполнять XML-замену.

Если эти недостаки для вас критичны, вы можете отказаться от глобального автонабора и поддержки эквивалентных доменов и предпочесть интеграцию с браузерами посредством плагинов, наподобие KeeFox, ChromeIPass и т.д.

Основы

Подготовка программы

Распакуем в какую-нибудь пустую папку архив с portable-вариантом KeePass версии 2.x, туда же — архив KeePass_Settings.zip (пароль 1), в подпапку Languages распакуем архив с русским переводом. Добавим плагины Favicon Downloader, TCATO Placeholder, WebAutoType, AutoTypeShow, KeePassQuickUnlock и KPSourceForgeUpdateChecker — просто поместим файлы с расширением .plgx в подпапку Plugins.

KeePass 2.x требует .NET Framework 2 или выше, а плагин WebAutoType — .NET Framework 4. В отсутствие .NET Framework 4 можно использовать плагин WebAutoType версии 3.x (работает медленно) или отказаться от этого плагина.

Если используются жесткие средства защиты, наподобие Comodo Internet Security, понадобится добавить в доверенные файлы из каталога Scripts.

Содержимое каталога KeePass

Проверка подлиности

Чтобы убедиться, что программа не поддельная, проверим подписи, как рекомендует ее автор. У каждого exe- и dll-файла откроем окно свойств и перейдем на вкладку «Цифровые подписи». Удостоверимся, что имя подписавшего — Open Source Developer, Dominik Reichl. Затем нажмем Сведения и удостоверимся, что подпись действительна. Не иметь подписи могут только файлы плагинов в папке PluginCache.

Настройка ориентирована на максимально портативную и автономную работу. Данные размещаются в каталоге программы и не привязаны к его расположению. Этот каталог можно перемещать, а также переносить на другие ПК.

Как это настроено

KeePass сам по себе обеспечивает портативность, в частности, запоминает именно относительный путь к базе данных. Поэтому базу удобно держать в папке программы и переносить вместе с ней. Однако по умолчанию KeePass помещает скомпилированные плагины в папку %LOCALAPPDATA%\KeePass, что несколько отступает от портативности. Чтобы они помещались в папку программы, отредактирован файл KeePass.config.xml (в кодировке UTF-8): после строки <Application> вставлена строка <PluginCachePath>{APPDIR}{ENV_DIRSEP}PluginCache</PluginCachePath>.

Чтобы опробовать настройку смогли даже те пользователи, у которых уже запущен свой KeePass, в разделе Сервис → Параметры → Дополнительно отключена опция Ограничивать одним экземпляром.

Открытие базы и изменение мастер-пароля. Быстрая разблокировка

Запустим KeePass и введем мастер-пароль 1.

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

Изменим мастер-пароль (меню Файл → Изменить основной пароль): зададим свой сложный пароль и, при желании, ключевой файл. Этот файл можно сгенерировать, но вообще, можно взять любой личный файл, который доступен на всех синхронизируемых устройствах и ни в коем случае не может быть утерян или изменен. Данные учетной записи Windows не будем использовать для авторизации.

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

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

Смена мастер-пароля

Чтобы облегчить разблокировку базы, зайдем в группу <service>, откроем запись QuickUnlock и назначим ей какой-нибудь простой пароль, например, последние 3 символа мастер-пароля. Теперь повторная разблокировка будет выполняться этим коротким паролем, в случае ошибки потребуется ввести мастер-пароль целиком.

Случился сбой?

Если в работе KeePass'а возникли проблемы, попробуйте переименовать файл compatibility-KeePass.config.enforced.xml в KeePass.config.enforced.xml и перезапустить программу. Это повысит совместимость за счет отключения некоторых опций:

  • защищеного рабочего стола для ввода пароля,
  • DACL-защиты,
  • защиты буфера обмена от логирования,
  • ускоренного автонабора.
Как это настроено

Чтобы обычные килоггеры не могли перехватить ввод мастер-пароля, в разделе Сервис → Параметры → Безопасность включена опция Вводить основной пароль в защищенном режиме. На вкладке Дополнительно включена опция Запоминать и автоматически открывать последнюю базу данных при запуске, как и по умолчанию; но в то же время отключены опции Запоминать источники ключа и Запоминать рабочие папки, поскольку некоторые пользователи считают расположение ключевого файла секретной информацией.

Функцию быстрой разблокировки обеспечивает плагин KeePassQuickUnlock. Для него создана запись QuickUnlock, в ней отключена опция Автонабор → Разрешить автонабор для этой записи, а в настройке программы в разделе Сервис → Параметры → QuickUnlock выбран режим 'QuickUnlock' Entry only и снят лимит времени. (Режим Part of Master Password не используется, так как он пригоден лишь для однократной быстрой разблокировки.)

Поиск нужной записи и авторизация

Опробуем разные способы ввода учетных данных. Воспользуемся «учебной» учетной записью, которая имеет название Учебный аккаунт, логин myLogin, пароль myPassword, ссылку http://keepass.info/help/kb/testform.html, тег демо и заметки Тренировка

Заодно проверим, перехватываются ли данные тестами, следящими за нажатием клавиш и буфером обмена, а также утилитой Ditto, запоминающей буфер обмена.

Начнем с клавиатурного способа. Откроем KeePass сочетанием клавиш Ctrl+Alt+Shift+K и сразу же наберем фрагмент названия записи, или логина, или ссылки, или тега, или даже заметок, нажмем Enter. Стрелками выберем нужную запись из найденных и нажмем Ctrl+U — ссылка откроется. Поставим курсор в поле ввода логина и нажмем Ctrl+Alt+Shift+F9. Нажмем кнопку Submit — и страница покажет сообщение с введенными данными.

Аналогичное можно проделать одной мышью: сделаем двойной клик по полю URL нужной записи. Когда ссылка откроется, кликнем по полю ввода (не обязательно очищать поле — KeePass сделает это сам). Вернемся к KeePass'у и нажмем на панели инструментов кнопку Выполнить автонабор.

Кликать по полю ввода желательно всегда, даже если там уже мигает курсор. В частности, этого требует авторизация в Google через Firefox.

Автонабор на тестовой странице KeePass

Если понадобится отдельно набрать логин или пароль — вызовем на записи контекстное меню и в разделе Начать автонабор выберем пункт {USERNAME} или {PASSWORD}.

Вместо автонабора можно перетащить логин и пароль в браузер прямо из списка записей KeePass'а.

Еще один вариант — временно скопировать учетные данные в буфер обмена: это делается двойным кликом по ним либо через контекстное меню записи. Контекстное меню позволяет копировать и дополнительные поля, например, Secret. При этих способах копирования через 20 секунд буфер обмена автоматически очищается.

Посмотрим, удался ли перехват пароля килоггер-тестом. В случае автонабора мы увидим просто мешанину символов — это достигнуто двойным усложнением автонабора. Таким образом, простые килоггеры не смогут разобрать наши учетные данные, хотя это возможно при целенаправленной атаке на KeePass. Если не пользоваться автонабором, а перетаскивать логин и пароль в поля ввода, то обычным килоггерам вообще ничего не достанется. Но если копировать учетные данные в буфер обмена, пусть и с последующей его очисткой, — тестовая программа их перехватит. В то же время утилита Ditto не перехватывает данные, скопированные двойным кликом.

Как это настроено

В разделе Сервис → Параметры → Политика включены опции Автонабор, Автонабор без контекста, Перетаскивание и Копирование, как и по умолчанию.

На вкладке Интеграция заданы глобальные горячие клавиши Ctrl+Alt+Shift+F9 для автонабора выбранной записи и Ctrl+Alt+Shift+K для показа KeePass'а. Можно сделать комбинации и более простыми, но возрастет риск случайного нажатия и конфликта с другими программами.

Чтобы упростить поиск, на вкладке Интерфейс в разделе Быстрый поиск включены все три опции вида Помещать фокус на...

На вкладке Безопасность включена автоочистка буфера обмена через 20 секунд. Также включена опция Использовать формат буфера обмена 'Clipboard Viewer Ignore', чтобы некоторые легальные программы, следящие за буфером обмена, не запоминали учетные данные.

В самой базе изменена верхняя группа: на вкладке Автонабор задано использование последовательности {CLEARFIELD}{UserName}{TAB}{DELAY 100}{Password}, как самой универсальной. В учебной записи включена опция Двойное усложнение автонабора.

Чтобы активировать подменю Начать автонабор, в разделе Сервис → Параметры → Интерфейс включена опция Показывать дополнительные команды меню автонабора.

Для ускорения автонабора отредактирован файл KeePass.config.xml: после строки <Integration> вставлена строка <AutoTypeInterKeyDelay>10</AutoTypeInterKeyDelay>

Глобальный автонабор

До сих пор мы своими руками отыскивали подходящую запись для авторизации на сайте. Однако KeePass способен найти ее сам, сообразно открытому сайту, и запустить автонабор: достаточно кликнуть в поле ввода, нажать клавиши Ctrl+Alt+Shift+A (или кнопку [G] на панели инструментов KeePass'а) и в появившемся окне подтвердить выбор учетной записи.

Запуск глобального автонабора KeePass мышью

Если вместо обычной последовательности понадобится набрать один пароль — нажмем Ctrl+Alt+Shift+P и аналогично подтвердим выбор записи.

Как это настроено

Глобальному автонабору и набору пароля назначены горячие клавиши Ctrl+Alt+Shift+A и Ctrl+Alt+Shift+P соответственно (Сервис → Параметры → Интеграция).

Добавлен плагин WebAutoType, считывающий адрес фрейма. В его настройке включена опция Use the URL field value for matching.

Работу кнопки [G] обеспечивают триггеры (Сервис → Триггеры) и скрипт HideExecActivate.js.

Сначала создан триггер Добавить кнопки на панель инструментов:

  • событие: Приложение запущено и готово;
  • условия: отсутствуют;
  • действие: Добавить свою кнопку на панель инструментов:
    • идентификатор: btn_GlobalAutoType,
    • имя: [G],
    • описание: Выполнить глобальный автонабор.

Затем создан триггер Глобальный автонабор кнопкой [G]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_GlobalAutoType,
  • действие: Выполнить команду/ссылку:
    • файл/ссылка: %windir%\System32\wscript.exe,
    • аргументы: "{APPDIR}\Scripts\HideExecActivate.js" /cmd:{T-CONV:/"{APPDIR}\KeePass.exe" -auto-type/Uri/} /win:{T-CONV:/Выбор записи для автонабора/Uri/},
    • опция Ждать выхода отключена.

Скрипт HideExecActivate.js симулирует нажатие клавиш Alt+Esc, чтобы убрать окно KeePass'а на задний план, командной строкой инициирует глобальный автонабор, а затем активизирует окно выбора записи. Код скрипта:

var WshShell = WScript.CreateObject("WScript.Shell");
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var NamedArgs = WScript.Arguments.Named;
var cmd = NamedArgs.Exists("cmd") ? decodeURIComponent(NamedArgs("cmd")) : "";
var win = NamedArgs.Exists("win") ? decodeURIComponent(NamedArgs("win")) : "";
WScript.Sleep(100);
WshShell.SendKeys("%{ESC}");
if (cmd) {
 WScript.Sleep(100);
 WshShell.Run(cmd);
}
if (win) {
 for (var attempt = 1; attempt != 600; ++attempt) {
  WScript.Sleep(100);
  if (WshShell.AppActivate(win)) {
   break;
  }
 }
}

Во избежание фишинга в разделе Сервис → Параметры → Дополнительно → Автонабор отключены все четыре опции вида Считать запись подходящей....

Для перестраховки от случайного нажатия горячих клавиш включена опция Всегда показывать окно выбора записи для глобального автонабора.

Определение адреса браузерными расширениями

За считывание адреса отвечает плагин WebAutoType, использующий интерфейс IAccessible, с чем связан ряд недостатков:

  • этот интерфейс доступен только на Windows;
  • в некоторых браузерах (K-Meleon, Pale Moon) он отсутствует;
  • в браузерах на основе Chromium он по умолчанию отключен, хотя:
    • для включения можно запускать браузер с аргументом командной строки --force-renderer-accessibility,
    • плагин WebAutoType самостоятельно включает этот интерфейс в браузерах;
  • включение этого интерфейса в Chromium-браузерах повышает потребление ресурсов, может приводить к зависаниям;
  • также в этих браузерах наблюдается некорректная работа: вместо текущего может определяться адрес страницы, открытой в фоновой вкладке;
  • адрес не определяется, если браузер работает в песочнице (Sandboxie, Comodo).

Поэтому возможно, вы предпочтете удалить плагин WebAutoType и воспользоваться другим решением — установить в браузер расширение, добавляющее к оконному заголовку адрес открытой страницы. Тогда KeePass будет подбирать записи на основании этого заголовка.

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

Браузер, в который установлено расширение, понадобится отметить в базе: в группе <service> открыть запись <Associations> и вписать название браузера в поле Логин. Название должно быть тем самым, которое браузер добавляет в конец своего заголовка. Можно перечислить несколько браузеров, разделяя их знаком |:

Pale Moon|K-Meleon

Если какой-либо браузер запускается в песочнице Sandboxie, понадобится дополнительно указать его название с символами [#] на конце, например:

Pale Moon|K-Meleon|Pale Moon [#]|K-Meleon [#]|Tor Browser [#]

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

Как эта функция реализована, рассмотрим позже, вместе с поддержкой эквивалентных доменов.

Создание записи

Создавать записи будем на основе шаблонов: щелкнув по стрелке справа от кнопки добавления записи и выбрав нужный шаблон.

Что такое шаблоны

Шаблоны — это просто записи, заготовленные в группе templates: в них могут быть проставлены названия, ссылки, добавлены дополнительные поля, установлены значки, включено усложнение автонабора, заданы его последовательности и т.д. Некоторые шаблоны содержат в Заметках инструкцию по своему использованию, ее можно удалить.

Можно создавать в группе templates новые шаблоны, желательно на основе шаблона _Обычная_запись_.

Чтобы редко используемые шаблоны не занимали место в выпадающем списке, можно переместить их в подгруппу unused: когда они понадобятся, просто вернем их в группу templates.

Откроем в браузере какой-нибудь форум и попробуем на нем зарегистрироваться. Войдем в группу Общие и добавим запись по шаблону _Обычная_запись_. Дадим ей желаемое название, в поле URL-ссылка скопируем адресную строку браузера.

Перейдем на страницу регистрации и заполним требуемые поля, кроме пароля. Скопируем в соответствующее поле KeePass'а выбранный логин, а в поле Заметки укажем прочие данные, которые использовали для регистрации: имейл, имя и т.п. Теперь нажмем Ok, чтобы закрыть окно создания записи. Чтобы запись обрела значок сайта, выберем в ее контекстном меню пункт Download Favicons.

Если идентичный логин уже содержится в базе, то необязательно набирать его и копировать — достаточно ввести первые символы в окне создания записи и выбрать подходящий вариант из выпадающего списка. Затем логин можно будет перетащить на страницу регистрации.

Перетащим пароль из KeePass'а в положенное место на странице регистрации (как вариант, можем воспользоваться автонабором или копированием). Готово.

Пароль при этом генерируется автоматически. Он формируется из 20 символов: букв нижнего регистра, верхнего регистра, цифр и спецсимволов (_-,.;:), причем гарантируется присутствие знаков каждого из этих 4 видов.

Автоматический подхват данных из браузера

Можно было сделать проще и быстрее: ввести желаемый логин на странице регистрации, кликнуть по нему, нажать Ctrl+Alt+Shift+W — и откроется окно добавления записи с уже готовым заголовком, логином и ссылкой. Останется лишь перетащить пароль в форму регистрации.

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

В то же время удобно воспользоваться клавишами Ctrl+Alt+Shift+W, чтобы узнать адрес фрейма, в котором находится форма авторизации. Дело в том, что при поиске записи учитывается адрес фрейма, куда вводятся данные, а не адресная строка браузера, — поэтому именно адрес фрейма следует указывать в поле URL-ссылка (или в списке эквивалентных доменов). Например, авторизация на странице https://e.mail.ru в действительности происходит через фрейм https://account.mail.ru.

Горячие клавиши задаются в настройке плагина WebAutoType.

Если вы захотите сгенерировать другой пароль, откройте запись, нажмите кнопку рядом с полем Пароль и выберите вариант Автосоздаваемые пароли для новых записей. Если сайт не принимает слишком сложные пароли, выберите вариант Simple.

Вариант Simple дает пароль из 14 алфавитно-цифровых символов, гарантируется присутствие букв разного регистра и цифр. Вариант Strong дает пароль из 30 почти любых ASCII-символов.

Создание пароля в KeePass

Теперь опробуем регистрацию на Яндексе. Добавим запись по шаблону Yandex, перейдем на страницу регистрации, укажем имя, определимся с логином. Занесем в KeePass логин, укажем в коммментарии имя, фамилию и нажмем Ok. Перетащим пароль на страницу регистрации.

Однако Яндекс требует также придумать ответ на секретный вопрос. Этот ответ должен быть таким же секретом, как и пароль, поэтому мы и сгенерируем его подобно паролю.

Войдем в группу <service> и вызовем контекстное меню на записи <Генератор паролей>. Выберем Копировать строковое поле → Создать обычный пароль. Вставим свежесозданный «ответ на вопрос» на страницу регистрации, это нужно сделать за 20 секунд. Теперь сохраним наш «ответ» в KeePass: сделаем двойной клик по полю Пароль записи <Генератор паролей>, чтобы еще раз скопировать тот же «ответ»; потом откроем свою запись Yandex, перейдем на вкладку Дополнительно и вставим «ответ» в поле Secret — на все про все снова 20 секунд. Готово.

Создание записи KeePass

Помимо поля Secret, вы можете добавлять на вкладку Дополнительно свои поля с произвольными названиями, чтобы хранить, например, телефонные номера, коды восстановления и т.п. Если содержимое дополнительного поля секретно, включите опцию Защита в памяти — тогда это поле не будет расшифровываться без надобности, в частности, его не будет видно в панели просмотра. Впоследствии содержимое этих полей можно будет копировать через контекстное меню записи, а также набирать.

Например, имейл, использованный для регистрации на форуме или указанный резервным на Яндексе, имело бы смысл перенести из заметок в дополнительное поле Email.

Если вы уже пользуетесь каким-нибудь менеджером паролей, то можете перенести свою базу в KeePass, выполнив импорт и небольшую обработку данных.

Как это настроено

В окне Сервис → Генератор паролей заданы профили паролей. Чтобы гарантировать наличие символов каждого типа, использован режим Создать, используя шаблон (с обязательно включенной опцией Случайно переставлять символы в пароле).

Для профиля Simple задан шаблон dul[dul]{11}, который означает одну цифру, одну букву в верхнем регистре, одну в нижнем и еще 11 любых алфавитно-цифровых символов. Профиль добавляется кнопкой Сохранить...

Для основного профиля задан шаблон dul[p\-\_][dulp\-\_]{16}, который означает цифру, букву в верхнем регистре, букву в нижнем, спецсимвол, являющийся знаком препинания, дефисом или подчеркиванием, и еще 16 любых символов из перечисленных категорий. Чтобы использовать этот профиль по умолчанию, он сохранен как Автосоздаваемые пароли для новых записей.

Для профиля Strong задан шаблон dul[s^\^\~\`\'\"][duls^\^\~\`\'\"]{26}, означающий цифру, букву в верхнем регистре, букву в нижнем, любой печатаемый спецсимвол ASCII (кроме знаков ^~`'", которые не набираются в некоторых окнах) и еще 26 любых символов из перечисленных категорий.

В базе создана группа templates, для нее отключен автонабор и поиск записей (Изменить группу → Поведение) и указано, что она является «группой шаблонов» (Файл → Параметры базы данных → Дополнительно). Также в ней создана подгруппа unused для хранения временно неиспользуемых шаблонов.

В большинстве шаблонов вместо пароля указана строка {{T-REPLACE-RX:#{GROUP_PATH}#(.*templates)?.*#$1#}NEWPASSWORD}

Эта строка устроена так, чтобы в записи, созданной на основе шаблона, автоматически генерировался пароль. Он сгенерируется не сразу после создания записи, а при первом обращении к полю Пароль: копировании, перетаскивании или автонаборе. Если же обратиться к этому полю в самом шаблоне — пароль сгенерирован не будет.

В шаблонах, где требуется генерировать короткие буквенно-цифровые пароли, в качестве пароля указана строка {{T-REPLACE-RX:#{GROUP_PATH}#(.*templates)?.*#$1#}NEWPASSWORD:/Simple/}

В базе создана запись <Генератор паролей>, в ней на вкладке Дополнительно добавлены поля Создать обычный пароль, Создать простой пароль и Создать сложный пароль со значениями {NEWPASSWORD}, {NEWPASSWORD:/Simple/} и {NEWPASSWORD:/Strong/} соответственно, у каждого включена опция Защита в памяти.

Каждый раз, когда такое строковое поле раскрывается (копируется в буфер обмена или вводится автонабором), значение в поле Пароль заменяется новым.

Общая база на всех устройствах

Пришло время наладить синхронизацию. Откроем запись <AutoSync> в группе <service>, укажем в логине свой e-mail, сгенерируем пароль и зарегистрируемся на облачном хранилище PowerFolder. (Название записи, ссылку и первую строку заметок оставим нетронутыми.) В хранилище создадим каталог keepass и отправим туда файл нашей базы, что лежит в папке DBases. Вот и все.

Облачная синхронизация базы KeePass

Теперь база будет автоматически синхронизироваться с облаком: после внесения изменений (они сохраняются автоматически), а также ежечасно. Чтобы синхронизировать ее принудительно, достаточно нажать кнопку сохранения.

Если вам понадобится вместо синхронизации просто заменить файл в облачном хранилище, это можно сделать через браузер: удалить старый файл и отправить новый. Ссылка на страницу авторизации — первая строка заметок записи <AutoSync>.

Как изменить параметры автоматической синхронизации

База синхронизируется в следующих случаях:

  • сразу после сохранения;
  • при открытии или минутном неиспользовании KeePass'а — если она еще не синхронизировалась с последнего сохранения;
  • при минутном неиспользовании KeePass'а — если база устарела, т.е. с последней ее синхронизации прошел час;
  • при открытии — если база сильно устарела, т.е. с последней ее синхронизации прошли сутки.

Можно изменить периоды устаревания и сильного устаревания: они задаются соответственно в секундах в полях URL-ссылка и Пароль записи <Settings>. Чтобы отказаться от синхронизации сильно устаревшей базы при открытии, сделайте пароль пустым. Чтобы полностью отказаться от синхронизации при устаревании, сделайте пустой ссылку.

Вместо PowerFolder можно использовать, например, MyDrive, тогда нужно заменить в записи <AutoSync> ссылку на https://webdav.mydrive.ch/keepass/{T-CONV:/{DB_NAME}/Uri/}, а первую строку заметок на https://www.mydrive.ch/login. Подойдут и другие хранилища, предоставляющие WebDAV или FTP: выделенный код понадобится заменить соответственно адресом хранилища и адресом страницы авторизации.

Можно синхронизировать базу с несколькими хранилищами: дополнительно создать запись <AutoSync1> и указать в ее ссылке адрес базы, а в логине и пароле учетные данные подключения. Аналогично <AutoSync2>.

Чтобы отказаться от автоматической синхронизации для данной базы, сделайте пустым логин записи <AutoSync>. Чтобы отказаться от автоматической синхронизации для всех баз, отключите опцию Разрешен в окне Сервис → Триггеры → Автоматически синхронизировать.

Как это настроено

В самой базе создана запись под названием <AutoSync> со ссылкой https://my.powerfolder.com/webdav/keepass/{T-CONV:/{DB_NAME}/Uri/} и заметками, начинающимися строкой https://my.powerfolder.com/login, а также запись <Settings> с паролем 86400 и ссылкой 3600.

В окне Сервис → Триггеры создан триггер Автоматически синхронизировать:

  • события:
    • Открыт файл базы данных:
      • Операция: Равно,
      • Фильтр: {CMD:#%windir%\system32\cscript.exe //Nologo "{APPDIR}\Scripts\AutoSyncHelper.js" "{DB_PATH}" "{REF:P@T:<Settings>}"#M=C,WS=H#}{DB_PATH}
    • Сохранен файл базы данных, фильтр: пусто;
    • Периодически по времени с интервалом 60 секунд и перезапуском при активности;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • В базе есть несохраненные изменения:
      • опция Отрицание включена,
      • база данных: Текущая;
    • Строка:
      • опция Отрицание включена,
      • строка: {T-REPLACE-RX:/{REF:U@T:<AutoSync>}/^\{.*//},
      • операция: Равно,
      • значение: пусто;
    • Строка:
      • опция Отрицание включена,
      • строка: {CMD:#%windir%\system32\cscript.exe //Nologo "{APPDIR}\Scripts\AutoSyncHelper.js" "{DB_PATH}" "{REF:A@T:<Settings>}"#M=C,WS=H#},
      • операция: Равно,
      • значение: actual;
    • существует файл: {T-REPLACE-RX:/{REF:N@T:<AutoSync>}/\n[\s\S]*//};
  • действия:
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • новое состояние: Выключить,
    • Синхронизировать текущую базу данных:
      • файл/ссылка: {REF:A@T:<AutoSync>},
      • логин: {REF:U@T:<AutoSync>},
      • пароль: {REF:P@T:<AutoSync>};
    • Синхронизировать текущую базу данных:
      • файл/ссылка: {T-REPLACE-RX:/{REF:A@T:<AutoSync1>}/^\{.*//},
      • логин: {REF:U@T:<AutoSync1>},
      • пароль: {REF:P@T:<AutoSync1>};
    • Синхронизировать текущую базу данных:
      • файл/ссылка: {T-REPLACE-RX:/{REF:A@T:<AutoSync2>}/^\{.*//},
      • логин: {REF:U@T:<AutoSync2>},
      • пароль: {REF:P@T:<AutoSync2>};
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\cscript.exe,
      • аргументы: "{APPDIR}\Scripts\AutoSyncHelper.js" "{DB_PATH}",
      • опция Ждать выхода включена,
      • стиль окна: Скрытое;
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • новое состояние: Включить.

Этот триггер проверяет специальный файл рядом с базой. Если он отсутствует или является устаревшим, триггер выполняет синхронизацию и обновляет файл. Для этого используется скрипт AutoSyncHelper.js:

var dbPath = WScript.Arguments(0);
var markPath = dbPath + ".synctime";
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
if (WScript.Arguments.Count() == 1) {
 var textStream = FSO.CreateTextFile(markPath, true, false);
 textStream.Write(new Date().toUTCString());
 textStream.Close();
} else {
 try {
  var dbTime = new Date(FSO.GetFile(dbPath).DateLastModified).getTime();
  var markTime = new Date(FSO.GetFile(markPath).DateLastModified).getTime();
  var period = 1000 * +WScript.Arguments(1);
  if (dbTime <= markTime && !(period > 0 && new Date().getTime() - markTime > period)) {
   WScript.StdOut.Write("actual");
  }
 } catch (e) {
 }
}

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

Синхронизация будет запускаться только для баз, расположенных непосредственно в папке DBases, в которых есть запись <AutoSync> с непустым логином, и только если сервер доступен (т.е. если работает ссылка в первой строке заметок). Учетные данные WebDAV возьмутся из самой этой записи.

Чтобы избежать сбоев при синхронизации, отключена опция Сервис → Параметры → Дополнительно → Использовать файловые транзакции. Когда эта опция включена, KeePass использует при сохранении базы промежуточный временный файл: такой метод сохранения призван предотвратить потерю данных, но иногда из-за него некорректно работает синхронизация. Вместо файловых транзакций, для защиты от потери данных предусмотрено автоматическое резервное копирование.

Обновление программы

Когда KeePass оповестит нас о выходе новой версии, закроем программу, скачаем заново архив с portable-вариантом версии 2.x, архив с переводом и просто заменим все соответствующие файлы в папке программы новыми. Наша настройка при этом сохранится.

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

Используем KeePass2Android

Установим KeePass2Android стандартным образом. Затем перейдем в настройку системы и разрешим использование клавиатуры KeePass2Android. Настроим эту клавиатуру: в пункте Языки ввода отметим Английский и Русский, остальное по вкусу.

Нажмем Открыть файл, выберем HTTPS (WebDAV) и укажем те же данные, что в записи <AutoSync> (ссылку следует указать в явном виде, скопировав ее из KeePass'а клавишами Ctrl+Shift+U). Логин и пароль облачного хранилища можно сохранить, это не самая чувствительная информация. Откроем базу, указав мастер-пароль и ключевой файл, если используется.

Теперь оценим удобство этой программы. Откроем в браузере сайт, который есть в базе. Нажмем Поделиться, выберем KeePass2Android — и нужная запись активизируется. Поставим курсор в поле ввода и сменим клавиатуру на KeePass2Android... которая принимает вид, говорящий сам за себя. Таким образом, этой клавиатурой мы будем легко вводить логины, пароли и дополнительные строковые поля, не прибегая к их копированию в буфер обмена (что было бы довольно опасно).

Клавиатура KeePass2Android

Еще одно облегчение жизни пользователей — быстрая разблокировка: для доступа к базе достаточно ввести три последних символа пароля. Ошиблись — вводим целиком. Функция настраивается и, при желании, отключается.

Чтобы менять клавиатуру было удобнее, рекомендую в разделе Настройка → Приложение → Парольный доступ → Переключение клавиатуры включить опции Автопереключение клавиатуры, Переключить обратно и Сменить после завершения, а опцию Автопереключение только после поиска отключить.

Опытные пользователи могут с помощью ADB задействовать плагин KeyboardSwap — тогда клавиатура будет переключаться вообще сама.

Добавлять записи через KeePass2Android тоже можно, как вариант, через функцию Поделиться. При этом тоже можно пользоваться шаблонами, но предупрежу, что пароль создается не автоматически: нужно нажать кнопку (+) и задать его характеристики.

Однако с редактированием базы через KeePass2Android не все гладко.

Так, у некоторых пользователей возникает сбой, если внести изменения через KeePass2Android в базу, которая перед этим была синхронизирована с другим устройством. Можно избежать таких сбоев, если отключить опцию Настройка → Приложение → Обработка файлов → Проверить на наличие изменений и перед каждым изменением синхронизировать базу.

Главное предостережение: при сохранении изменений нельзя поворачивать устройство. Происходящий при этом сбой грозит потерей данных! (Thx roman_vlg)

В случае проблем рекомендую очистить кэш приложения.

Дополнительные возможности

Вернемся в Windows и продолжим разбираться с KeePass'ом.

Списки эквивалентных доменов

Зачастую один интернет-ресурс имеет несколько страниц авторизации с разными доменными именами. Сделаем так, чтобы KeePass учитывал это при глобальном автонаборе: занесем эти домены в список экивалентных.

Для этого в группе domains создадим новую запись или изменим существующую, перечислив в ее названии эквивалентные домены, разделенные знаком |, без пробелов, без протокола и без префикса www. Название должно начинаться и оканчиваться тоже знаком |. Например: |yandex.ru|yandex.by|passport.yandex.ru|.

Теперь глобальный автонабор будет работать, даже если в поле URL-ссылка указана страница https://passport.yandex.ru, а открыта https://www.yandex.ru или даже https://mail.yandex.by — подойдет любой поддомен.

Списки эквивалентных доменов KeePass

Более того, в большинстве случаев даже не понадобится создавать такой список: каждая запись и так соответствуют всем поддоменам своей ссылки. Например, запись со ссылкой https://vk.com/login подойдет для страницы https://m.vk.com/.

Но не наоборот — запись со ссылкой https://m.vk.com не подойдет для страницы https://vk.com/login. Чтобы установить между ними соответствие, понадобится все-таки создать запись с названием |vk.com|m.vk.com|.

Поддержка эквивалентных доменов работает только для записей, созданных по шаблонам. Чтобы она заработала для записей, созданных другим путем, придется выполнить для них такое же преобразование, как при импорте.

Как это настроено

За поддержку эквивалентных доменов отвечает созданная в группе <service> запись <Associations>. Ее пароль определяет ассоциации с оконным заголовком браузера, а ссылка — с адресной строкой. Логин этой записи — список браузеров, в которых нужно определять адрес по оконному заголовку. Можно редактировать эту запись, подстраивая работу программы под свои нужды.

Чтобы сопоставление ссылок с заголовком и адресной строкой браузера работали так, как описано выше, пароль и ссылка этой записи сделаны соответственно такими:

//^(?i)(?:.*\s)?\W*(?:\w+\:\/\/)?(?:[\w\-\.]+\.)?(?=\w)(?:{{}T-REPLACE-RX:/{{}REF:T@T:|{{}T-REPLACE-RX:!{{}URL:HOST}!^www\.!!}|}/([^\w\s\|])/\$1/})(?:[\:\/#\?]\S*)?\W* (?:{T-REPLACE-RX:/{USERNAME}/([^\w\s\|])/\$1/})$//

//^(?i)(?:\w+\:\/\/)?(?:[\w\-\.]+\.)?(?=\w)(?:{{}T-REPLACE-RX:/{{}REF:T@T:|{{}T-REPLACE-RX:!{{}URL:HOST}!^www\.!!}|}/([^\w\s\|])/\$1/})(?:[\:\/#\?]\S*)?$//

В различных шаблонах записей задано два целевых окна автонабора (Автонабор → Добавить): одно в режиме Match against the title с заголовком {T-REPLACE-RX:/{REF:P@T:<Associations>}/\{\{\}/{/}, другое в режиме Match against the URL с адресом {T-REPLACE-RX:/{REF:A@T:<Associations>}/\{\{\}/{/}. Последовательность для них оставлена по умолчанию.

В параметрах группы domains отключен поиск и автонабор.

Как уже говорилось, во избежание фишинга в разделе Сервис → Параметры → Дополнительно → Автонабор отключены все четыре опции вида Считать запись подходящей....

Настройка автонабора в отдельной записи

Рассмотрим параметры, доступные в каждой отдельной записи на вкладке Автонабор.

По умолчанию запись наследует последовательность автонабора от группы. Можно вместо этого вписать свою последовательность.

Например, код {CLEARFIELD}{UserName}{TAB}{Password} означает очистку поля, набор логина, нажатие Tab и набор пароля — такая последовательность подходит в большинстве случаев.

Другой пример — код {UserName}{ENTER}{DELAY 2000}{Password} — набрать логин, нажать Enter, выждать две секунды и набрать пароль. Такая последовательность подойдет для авторизации на Google, Microsoft и т.п., где ввод логина и пароля выполняется на отдельных страницах.

Последовательность автонабора KeePass для Google

В последовательности автонабора можно ссылаться не только на логин с паролем, но и на дополнительные поля. Например, для авторизации на ProtonMail нужно вводить логин и два разных пароля — сохраним второй пароль в поле Secret и назначим последовательность {UserName}{TAB}{Password}{ENTER}{DELAY 3000}{S:Secret}: набор логина, нажатие Tab, набор пароля, нажатие Enter, трехсекундная задержка и набор поля Secret. Аналогично вы можете добавлять на вкладку Дополнительно поля с любыми именами на свой вкус и использовать их в автонаборе. Например, если добавить поле PhoneNumber, то в последовательность автонабора можно будет вставить код {S:PhoneNumber}, означающий содержимое этого поля.

Можно назначить разные последовательности автонабора разным окнам или адресам. Например, иногда Google запрашивает только пароль — адрес в таких случаях содержит фрагмент /pwd. Мы можем назначить такой странице автонабор одного пароля: нажмем Добавить, переключимся в режим Match against the URL и укажем в поле Target URL код https://accounts.google.com/*/pwd*, а в поле Своя последовательность код {Password}{ENTER}.

Сопоставление последовательности автонабора адресу

Если понадобится идентифицировать окно по его заголовку, нужно выбрать режим Match against the title.

Также на вкладке Автонабор можно включить или отключить усложнение. Усложнение автонабора частично защищает от килоггеров, однако его невозможно использовать в некоторых окнах, например, в консольных. Можно настроить усложнение автонабора более тонко, например, включить его в целом для записи, но определенным окнам назначить последовательность без усложнения, наподобие {TCATO:false}{Password}{ENTER}. Код {TCATO:false} в последовательности принудительно отключает усложнение автонабора, а код {TCATO:true} включает — это обеспечивается плагином TCATO_Placeholder.

Настройка автонабора во множестве записей

Теперь рассмотрим, как задать последовательность автонабора сразу в нескольких записях.

Простейший способ — создать группу, переместить в нее записи и назначить ей нужную последовательность (Изменить группу → Автонабор). Так, в предлагаемой базе заготовлена группа 2-страничные, чтобы вводить логин и пароль на отдельных страницах, как в Google, Microsoft и т.п.

Последовательность автонабора для группы

Однако хотелось бы группировать записи по смыслу, а не по способу автонабора. Поэтому сделаем хитрее: назначим автонабор домену. Для этого воспользуемся теми самыми списками эквивалентных доменов, которые создавали в группе domains: укажем последовательность в заметках такой записи-списка.

Предположим, у нас есть записи со ссылками http://example.com, https://www.example.com/login.html и т.п. и требутся назначить им последовательность {UserName}{TAB}{Password}{ENTER}. Для этого достаточно создать в группе domains служебную запись с названием |example.com| и такими заметками:

{{}UserName}
{{}TAB}
{{}Password}
{{}ENTER}
Формат последовательности

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

Например, в последовательности {CLEARFIELD}{UserName}@{S:Domain}{ENTER}{DELAY 2000}{Password} выделены фрагменты, являющиеся клавиатурными командами. Поэтому она запишется так:


{{}CLEARFIELD} {{}UserName}@{{}S:Domain} {{}ENTER}{{}DELAY 2000} {{}Password}

Название служебной записи может содержать несколько эквивалентных доменов — последовательность будет применена к ним всем: |example.com|example.org|

В случае двухстраничной авторизации, как на Google, Microsoft, Yandex или Mail.ru, даже не понадобится формировать последовательность — достаточно вписать в заметки служебной записи код {REF:N@T:|2pages|}.

Вы можете изменить задержку между набором логина и пароля в заметках записи |2pages|.

Однако может оказаться, что запись не имеет домена (например, она хранит паспортные данные) или домен ее ссылки по какой-то причине нам не подходит. В таком случае добавим в запись поле <Sequences> и явно укажем в нем название служебной записи, содержащей нужную последовательность. Например, в шаблоне паспортных данных есть поле <Sequences> со значением |Passport|. Значит, для записей, созданных по этому шаблону, будет применяться последовательность, указанная в заметках служебной записи |Passport|.

По умолчанию применяется последовательность, заданная в заметках записи |default|: {CLEARFIELD}{UserName}{TAB}{Delay 100}{Password}.

Приоритет последовательностей
  • Прежде всего применяется последовательность, назначенная окну/адресу;
  • если для окна/адреса последовательность не задана, применяется основная последовательность записи;
  • если для записи последовательность не задана, применяется последовательность группы;
  • если для группы последовательность не задана, применяется последовательность родительской группы и т.д.;
  • если ни в одной некорневой группе последовательность не задана, рассматривается служебная запись с именем:
    • указанным в поле <Sequences>, если оно существует;
    • содержащим домен ссылки, окруженный знаками |, если поле <Sequences> отсутствует;
  • если такая служебная запись существует и ее заметки непусты, применяется заданная в них последовательность;
  • если такой служебной записи нет или ее заметки пусты, применяется последовательность из заметок записи |default|;
  • если запись |default| отсутствует или ее заметки пусты, появляется окно для выбора поля/последовательности.
Как это настроено

Корневой группе назначена последовательность автонабора:

{T-CONV:/{T-REPLACE-RX:;{T-REPLACE-RX:'{T-REPLACE-RX:!{T-REPLACE-RX:"{T-REPLACE-RX:#REF:N@T:|default|{} {REF:N@T:{T-REPLACE-RX:`{T-REPLACE-RX:~{S:<Sequences>}~^\{.*~|{{}T-REPLACE-RX:%{{}URL:HOST}%^www\.%%}|~}`\{\{\}`{`}}#^(?:(\S*)(\{)(\}) (?:\{REF\:.*\})?|\S* ([\s\S]*))$#$2$1$3$4#}"^(?:\{REF\:.*\})?$"{{}PICKFIELD}"}!\{\{\}!{!}'(?<=^(?:.*\n.*\n)*.*)([\+\%\^\~\(\)\[\]\{\}])'{$1}'};[\n\r];;}/Raw/}

В группе domains создана запись |default|. Последовательность задана в ней особым способом, чтобы смягчить усложнение при вводе логина. Для этого добавлено поле #UserName со значением:


{{}Delay 0} {{}T-REPLACE-RX::{{}UserName}:(.):$1 {{}Delay 0} :}

В логине указана ссылка на это поле: {S:#UserName}. В заметках указан код:


{{}CLEARFIELD} {UserName} {{}Tab}{{}Delay 100} {{}Password}

Также создана запись |2pages| с такими заметками:


{{}CLEARFIELD} {REF:U@T:|default|} {{}Enter}{{}Delay 2000} {{}Password}

Ручной выбор автонабора

Как уже говорилось, можно набрать отдельно логин или пароль через контекстное меню записи (подменю Начать автонабор). Таким способом можно набирать и некоторые типичные последовательности.

Однако гораздо более гибкий вариант — нажать кнопку [F]. Тогда откроется расширенный список последовательностей, в котором можно выбрать для автонабора не только логин/пароль, но и, например, поле Secret (если оно состоит из одной строки). Если же закрыть этот список, то появится другой — позволяющий набрать вообще любое однострочное поле или последовательность из записи.

Набор поля или последовательности из общего списка

Чтобы набрать многострочное поле, нужно сначала выбрать пункт «= Multiline Field...» в первом списке, а затем нужное поле во втором.

Как изменить списки последовательностей

Первый список является «внешним», общим для разных записей. Второй — «внутренний», определяется только выбранной записью.

Внешний список по умолчанию задается полями служебной записи |default| в группе domains. Их формат описан выше. Например, можно добавить поле LoginTabPassEnter с таким содержимым:

{{}UserName}
{{}TAB}
{{}Password}
{{}ENTER}

Разные записи могут иметь разные внешние списки. Чтобы внешний список определялся доменом, достаточно создать или отредактировать служебную запись со списком эквивалентных доменов: поместить в ее поле URL-Ссылка код x{PICKFIELD} и создать дополнительные поля с последовательностями. Если домен отсутствует или не подходит, можно явно указать название служебной записи в поле <Sequences>. Например, в базе имеется служебная запись |BankCard| и шаблон банковской карты, содержащий поле <Sequences> со значением |BankCard|.

Внутренний список состоит из полей, принадлежащих выбранной записи. Чтобы добавить в него последовательность, нужно создать поле с любым названием и записать ее в формате, похожем на вышеуказанный, но без замены фигурных скобок. Например, последовательность {CLEARFIELD}{UserName}{ENTER} запишется так:


{CLEARFIELD} {UserName} {ENTER}

Если вы хотите, чтобы выводился только внутренний список, без внешнего, сделайте ссылкой служебной записи букву x. Когда эта ссылка пуста, используется внешний список из |default|.

Иногда требуется выполнить автонабор в «режиме совместимости» — отложенно, замедленно и без усложнения:

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

Чтобы выполнить автонабор в таком режиме, нажмем кнопку [C] и выберем поле или последовательность (аналогично кнопке [F]) — автонабор запустится с задержкой, замедленно и без усложнения.

Отложенный автонабор без усложнения в KeePass

Кнопка [F] всегда принудительно применяет усложнение, а кнопка [C] — отменяет.

Эти приемы можно совмещать с глобальным автонабором. Предположим, открытый в браузере сайт запрашивает дополнительные данные: пароль, ответ на секретный вопрос, какие-либо коды и т.п. Чтобы быстро перейти к соответствующей записи (и заодно перестраховаться от фишинга), нажмем клавиши Ctrl+Alt+Shift+S (либо кнопку [S]) и в появившемся окне подтвердим выбор. В результате автонабора не произойдет: просто откроется KeePass с уже отмеченной записью, и мы сможем набрать нужное поле кнопкой [F] или [C].

Поиск вместо глобального автонабора

Запрос последовательности при обычном автонаборе

При использовании некоторых записей удобно, чтобы обычный автонабор выполнялся, как по кнопке [F], т.е. с предварительным выбором поля или последовательности.

Для этого нужно указать в заметках служебной записи (которая определяется доменом или полем <Sequences>) такой код:

{T-REPLACE-RX:"{{}PICKFIELD} {T-REPLACE-RX:#REF:A@T:|default|{} {URL}#^(?:\S* (x[\s\S]*)|(\S*)(\{)(\}) [\s\S]*)#$1$3$2$4#}"^(?:\S* x([\s\S]+)|(\S*) [\s\S]*)"$1$2"}

Например, так сделано для шаблонов BankCard, Passport.

Как это настроено

В приведенной выше записи |default| заданы поля:

  • URL-ссылка: x{PICKFIELD}
  • пароль: {{}Password}
  • поле #URL: {{}URL}
  • поле Secret: {{}S:Secret}
  • поле Email: {{}S:Email}
  • поле = Multiline Field...: {{}T-REPLACE-RX:/{{}PICKFIELD}/(\r?\n)/$1~$1/}
  • поле # U → P:
    {UserName}
    {{}TAB}{{}DELAY 200}
    {{}Password}
  • и другие последовательности, сформированные по указанным выше правилам.

Подобным образом, только с другими последовательностями, создана запись |BankCard|. Ее название указано в поле <Sequences> шаблона BankCard. Аналогично создана запись |Passport| для шаблона Passport.

Чтобы при наборе кнопкой [F] или [C] принудительно включалось или отключалось усложнение, установлен плагин TCATO Placeholder.

Чтобы можно было вместо глобального автонабора выполнять лишь поиск нужной записи, добавлен плагин AutoTypeShow, в его настройке заданы горячие клавиши Ctrl+Alt+Shift+S.

В приведенный выше триггер Добавить кнопки на панель инструментов добавлены действия:

  • Добавить кнопку... с идентификатором btn_AutoTypeShow, именем [S] и описанием Перейти к подходящей записи;
  • Добавить кнопку... с идентификатором btn_TypeField, именем [F] и описанием Набрать поле/последовательность...;
  • Добавить кнопку... с идентификатором btn_TypeFieldCompatible, именем [C] и описанием Набрать поле/последовательность... (режим совместимости).

Создан триггер Переход к подходящей записи кнопкой [S]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_AutoTypeShow,
  • действие: Выполнить команду/ссылку:
    • файл/ссылка: %windir%\System32\wscript.exe,
    • аргументы: "{APPDIR}\Scripts\HideExecActivate.js" /cmd:{T-CONV:/"{APPDIR}\KeePass.exe" -e:AutoTypeShow/Uri/} /win:{T-CONV:/Выбор записи для автонабора/Uri/},
    • опция Ждать выхода отключена.

Этот триггер использует скрипт HideExecActivate.js, код которого приведен выше.

Создан триггер Произвольный автонабор кнопкой [F]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_TypeField,
  • действие: Выполнить автонабор для выбранной записи с последовательностью {TCATO:true}{T-CONV:/{T-REPLACE-RX:;{T-REPLACE-RX:'{T-REPLACE-RX:!{T-REPLACE-RX:"{{}PICKFIELD} {T-REPLACE-RX:#REF:A@T:|default|{} {REF:A@T:{T-REPLACE-RX:`{T-REPLACE-RX:~{S:<Sequences>}~^\{.*~|{{}T-REPLACE-RX:%{{}URL:HOST}%^www\.%%}|~}`\{\{\}`{`}}#^(?:\S* (x[\s\S]*)|(\S*)(\{)(\}) [\s\S]*)#$1$3$2$4#}"^(?:\S* x([\s\S]+)|(\S*) [\s\S]*)"$1$2"}!\{\{\}!{!}'(?<=^(?:.*\n.*\n)*.*)([\+\%\^\~\(\)\[\]\{\}])'{$1}'};[\n\r];;}/Raw/}

Создан триггер Произвольный автонабор в режиме совместимости кнопкой [C]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_TypeFieldCompatible;
  • действие: Выполнить автонабор для выбранной записи с последовательностью {TCATO:false}{DELAY=100}{T-CONV:/{T-REPLACE-RX:;{T-REPLACE-RX:'{T-REPLACE-RX:!{T-REPLACE-RX:"{{}PICKFIELD} {T-REPLACE-RX:#REF:A@T:|default|{} {REF:A@T:{T-REPLACE-RX:`{T-REPLACE-RX:~{S:<Sequences>}~^\{.*~|{{}T-REPLACE-RX:%{{}URL:HOST}%^www\.%%}|~}`\{\{\}`{`}}#^(?:\S* (x[\s\S]*)|(\S*)(\{)(\}) [\s\S]*)#$1$3$2$4#}"^(?:\S* x([\s\S]+)|(\S*) [\s\S]*)"$1$2"}!\{\{\}!{!}'(?<=^(?:.*\n.*\n)*.*)([\+\%\^\~\(\)\[\]\{\}])'{$1}'};[\n\r];{CMD:`ping -n 1 -w 4000 192.0.2.222`O=0,WS=H`};}/Raw/}

Выделенные в коде значения 100 и 4000 задают замедление автонабора и задержку перед ним в миллисекундах, вы можете изменить их.

Операции с прикрепленными файлами

Любая запись в базе KeePass'а может содержать не только текстовую информацию, но и файлы (Дополнительно → Прикрепленные файлы). Разумеется, они хранятся зашифрованными, как и прочие данные. Прикрепленные файлы можно извлекать, сохраняя в отдельное место; можно извлекать во временный каталог с EFS-шифрованием, чтобы открывать и редактировать в сторонних программах. Более того, их можно просматривать в самом KeePass'е, не извлекая: встроенный просмотрщик KeePass'а умеет показывать изображения, html-страницы, текст в формате RTF, простой текст, причем в разных кодировках, а также двоичные файлы в HEX-виде.

К примеру, вы можете вложить в запись сканы документов, а затем просмотривать их через контекстное меню записи: Прикрепленные файлы → Имя_файла.

Также KeePass имеет встроенный редактор форматированного текста. Можно редактировать RTF-файл, присоединенный извне, а можно создать его с нуля (Добавить → Прикрепить пустой файл). При создании указывается имя и расширение: в случае *.txt текст будет обычным, в случае *.rtf форматированным. Такой файл становится своеобразным полем, вмещающим большой объем текста, в т.ч. форматированного.

Как просмотр, так и редактирование файлов KeePass'ом выполняется в памяти, без извлечения их на диск.

Все ходы записаны

KeePass хранит не только текущее состояние ваших учетных данных, но и историю их изменений. В любой записи вы можете открыть вкладку История и просмотреть до 10 ее версий, а при необходимости и откатить запись к любой из них. (Кстати, записи <Генератор паролей> это тоже касается: если вы сгенерировали новый пароль, а нужно воспользоваться старым, то это легко сделать.)

Если какая-либо запись слишком объемна (имеет прикрепленные файлы), то история сохранит меньшее число ее версий: общим размером до 6 МБ.

Если вы удалите запись целиком — она всего лишь отправится в группу Корзина, откуда ее всегда можно перетащить обратно. Для безвозвратного уничтожения записи ее следует повторно удалить, когда она в Корзине.

Изменения автоматически сохраняются на диске при блокировке базы, а также после минутного неиспользования KeePass'а. Таким образом, можно не беспокоиться о кнопке «Сохранить» — KeePass сам позаботится, чтобы данные не пропали. И наоборот, если вы внесете изменения (в названии базы появится звездочка), но сочтете их ненужными, то еще в течение минуты сможете предотвратить сохранение: отключить чекбокс A [v] (о нем в другой статье) и закрыть базу.

Перед каждым сохранением базы создается ее резервная копия. В папке DBases\BackUp для каждой базы хранится 20 ее прежних версий.

Как изменить параметры сохранения, истории и резервного копирования

Вы можете для каждой отдельной базы изменить количество ее версий, хранящихся в папке BackUp: оно задается логином записи <Settings> в группе <service>. Логин 0 отключает резервное копирование данной базы.

Чтобы полностью отказаться от резервного копирования, отключите опцию Разрешен в окне Сервис → Триггеры → Автоматически создавать резервную копию.

Чтобы отказаться от автосохранения изменений, отключите опцию Разрешен в триггере Автоматически сохранять изменения.

Параметры хранения истории и использования корзины задаются в настройке базы (Файл → Параметры базы данных).

Если вы захотите облегчить базу, удалив из нее всю историю, — временно запретите синхронизацию, смените пароль на облачном хранилище и в соответствующей записи, удалите корзину, удалите неиспользуемые значки (Сервис → База данных → Удалить...), удалите из истории «записи старше 0 дней» и информацию об удаленных объектах (Сервис → База данных → Обслуживание...), и наконец, замените файл базы в облачном хранилище и на всех синхронизируемых устройствах и разрешите синхронизацию.

Как это настроено

В базе параметры хранения истории и использования корзины оставлены по умолчанию. Чтобы задать число хранимых версий базы, создана запись <Settings> с логином 20.

Создан триггер Автоматически сохранять изменения:

  • события:
    • Периодически по времени с интервалом в 60 секунд и перезапуском при активности,
    • Закрытие файла базы данных (до сохранения);
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • В базе данных есть несохраненные изменения, база — Текущая;
  • действие: Сохранить текущую базу данных.

Создан триггер Автоматически создавать резервную копию:

  • событие: Сохранение файла базы данных, фильтр: пусто;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • Строка:
      • опция Отрицание включена,
      • строка: {REF:U@T:<Settings>},
      • операция: Равно,
      • значение: 0;
  • действие: Выполнить команду/ссылку:
    • файл/ссылка: %windir%\System32\wscript.exe,
    • аргументы: "{APPDIR}\Scripts\BackUp.js" "{DB_PATH}" {T-REPLACE-RX:/{REF:U@T:<Settings>}/^(.*\D.*|)$/20/},
    • опция Ждать выхода включена.

Для для резервного копирования используется скрипт BackUp.js:

var dbPath = WScript.Arguments(0);
var backUpCount = +WScript.Arguments(1);

var FSO = WScript.CreateObject("Scripting.FileSystemObject");

if (!FSO.FileExists(dbPath)) {
 WScript.Quit();
}

var file = FSO.getFile(dbPath);
if (file.Size == 0) {
 WScript.Quit();
}

var backUpDir = FSO.GetAbsolutePathName(file.ParentFolder) + "\\BackUp";
if (!FSO.FolderExists(backUpDir)) {
 FSO.CreateFolder(backUpDir);
}

var d = new Date();
var toXX = function(x) {return x < 10 ? "0" + x : x;}
var prefix = d.getUTCFullYear()
  + "." + toXX(d.getUTCMonth() + 1)
  + "." + toXX(d.getUTCDate())
  + "-" + toXX(d.getUTCHours())
  + "." + toXX(d.getUTCMinutes())
  + "." + toXX(d.getUTCSeconds())
  + "-UTC-";

file.Copy(backUpDir + "\\" + prefix + file.Name, true);

var files = [];
for (var en = new Enumerator(FSO.GetFolder(backUpDir).Files);
  !en.atEnd(); en.moveNext()) {
 var fileName = en.item().Name;
 if (fileName.length == prefix.length + file.Name.length
   && fileName.slice(prefix.length) == file.Name) {
  files.push(en.item());
 }
}
files.sort(function(f1, f2) {
 return f1.Name < f2.Name ? -1 : (f1.Name > f2.Name ? 1 : 0);
});
for (var i = 0; i < files.length - backUpCount; ++i) {
 files[i].Delete();
}

Эти триггеры работают только для баз, расположенных непосредственно в папке DBases.

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

Дополнительная настройка

Ваш мастер-пароль по-настоящему сложен? Уверены, что даже часть его никогда не попадет в хакерские словари? Прибегнем к небольшой подстраховке: в свойствах базы (Файл → Параметры базы данных → Безопасность) усложним трансформацию ключа. Там же можно рассчитать параметры, чтобы не перегнуть палку, сделав открытие и сохранение базы чересчур медленным. Таким образом, KeePass способен усилить защиту небезупречных паролей. Но злоупотреблять этим не будем: сложность и секретность мастер-пароля — наше все.

Для трансформации ключа вместо AES-KDF выбрана функция Argon2, которая активно использует память и тем самым противостоит подбору пароля на асиках. Однако вместе с тем Argon2 более резко замедляет открытие базы на мобильных устройствах. В качестве компромисса заданы 10 итераций, 10 МБ и разрешено распараллеливание на 2 потока.

Чтобы затруднить кражу данных из самой программы, в ней запрещены некоторые опасные операции. Для этого в окне Сервис → Параметры → Политика отключены опции: Экспорт, Экспорт — без ключа, Печать, Печать — без ключа, Копирование записей целиком и Изменение мастер-ключа — без ключа. На вкладке Безопасность включена блокировка после 5 минут общего бездействия, при переключении пользователя, при переходе в спящий режим и при изменении режима удаленного доступа. Также на вкладке Дополнительно включена опция Синхронизировать без запроса (чтобы автоблокировка сработала и в особом случае, когда одна база открыта в нескольких KeePass'ах). На вкладке Интерфейс установлено нулевое значение опции Запоминать недавно использованные файлы.

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

Также можно слегка изменить стиль окна в разделе Параметры → Интерфейс. Выбран вариант Windows 8.1.

Импорт базы данных

Если вы уже пользуетесь каким-нибудь менеджером паролей, в т.ч. KeePass'ом, то скорее всего, накопили много сохраненных паролей. Их нетрудно перенести в нашу новую базу.

Экспортируем пароли из прежнего менеджера в файл, а затем откроем KeePass и импортируем этот файл в предложенную базу (Файл → Импорт). При этом важно правильно указать формат файла и каким менеджером паролей он был создан. Если KeePass спросит о способе импорта, выберем вариант Новые идентификаторы.

Однако для записей, которые либо импортированы из сторонней базы, либо созданы не по шаблонам, не будет работать усложнение автонабора и поддержка эквивалентных доменов. Исправить такие записи можно разными способами:

Быстрая XML-замена

Можно одним махом преобразовать все записи, у которых автонабор никак не настроен. В большинстве случаев именно такие записи и требуется исправлять.

Параметры автонабора в записях, подлежащих преобразованию

Откроем окно Сервис → База данных → XML-замена и выполним замену с параметрами:

  • Узлы дерева: //Entry/AutoType
  • Действие: Заменить данные
  • Данные: Внешний XML
  • Искать: <AutoType>\s*<Enabled>True<\/Enabled>\s*<DataTransferObfuscation>0<\/DataTransferObfuscation>\s*<\/AutoType>
  • Заменить на: <AutoType><Enabled>True</Enabled><DataTransferObfuscation>1</DataTransferObfuscation><Association><Window>{T-REPLACE-RX:/{REF:P@T:&lt;Associations&gt;}/\{\{\}/{/}</Window><KeystrokeSequence /></Association><Association><Window>??:URL:{T-REPLACE-RX:/{REF:A@T:&lt;Associations&gt;}/\{\{\}/{/}</Window><KeystrokeSequence /></Association></AutoType>
  • опция Регулярное выражение включена.

В результате преобразуется каждая запись, в которой все параметры автонабора были оставлены по умолчанию (т.е. автонабор разрешен, последовательность не переопределена, усложнение отключено, ассоциаций с окнами нет). В таких записях включится усложнение и добавится поддержка эквивалентных доменов, а остальные записи останутся нетронутыми.

Выборочная XML-замена

Бывает особые ситации, когда предыдущий способ неприменим, например:

  • нужно исправить записи, в которых параметры автонабора уже изменены,
  • или не нужно изменять некоторые записи с параметрами автонабора по умолчанию,
  • или где-то требуется лишь включить усложнение автонабора, а где-то лишь добавить поддержку эквивалентных доменов.

Тогда создадим в базе группу toImprove и переместим в нее записи, которые нужно отредактировать (можно перетаскивать как записи, так и целые группы с подгрупами).

Чтобы включить усложнение автонабора, откроем окно Сервис → База данных → XML-замена и выполним замену с параметрами:

  • Узлы дерева: //Group[Name="toImprove"]//Entry/AutoType/DataTransferObfuscation
  • Действие: Заменить данные
  • Данные: Текст
  • Искать: 0
  • Заменить на: 1

Чтобы добавить поддержку эквивалентных доменов, выполним XML-замену с параметрами:

  • Узлы дерева: //Group[Name="toImprove"]//Entry/AutoType
  • Действие: Заменить данные
  • Данные: Внешний XML
  • Искать: </AutoType>\Z
  • Заменить на: <Association><Window>{T-REPLACE-RX:/{REF:P@T:&lt;Associations&gt;}/\{\{\}/{/}</Window><KeystrokeSequence /></Association><Association><Window>??:URL:{T-REPLACE-RX:/{REF:A@T:&lt;Associations&gt;}/\{\{\}/{/}</Window><KeystrokeSequence /></Association></AutoType>
  • опция Регулярное выражение включена.

Затем расформируем группу toImprove и удалим ее.

Ручное редактирование

Если «неправильных» записей одна-две, их можно отредактировать по отдельности. Чтобы задействовать двойное усложнение автонабора, нужно включить соответствующую опцию на вкладке Автонабор. Чтобы включить поддержку эквивалентных доменов, нужно на этой же вкладке нажать Добавить и вставить в поле Целевое окно строку {T-REPLACE-RX:/{REF:P@T:<Associations>}/\{\{\}/{/}, затем повторно нажать Добавить, переключиться в режим Match against the URL и вставить в поле Target URL строку {T-REPLACE-RX:/{REF:A@T:<Associations>}/\{\{\}/{/}.

Ручное редактирование записей, импортированных в KeePass

Часть 2