пятница, 22 июля 2016 г.

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

Пожалуйста, смотрите свежую версию инструкции на двух страницах.

Устаревшая версия

Как настроить KeePass на подстановку данных в разные приложения, синхронизацию между устройствами, усиленную защиту от перехвата паролей. Дополнительная защита KeePass с помощью Comodo Internet Security

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

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

Внимание! Эта информация сохранит ваше время:

  • Ничего настраивать не нужно. Программа готова к использованию, лишь смените мастер-пароль.
  • Раскрывать спойлеры не нужно. Текст под ними рассчитан на опытных пользователей.
  • Новичкам достаточно прочитать только пункт Основы. Остальная информация — для опытных.

Основы

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

Распакуем в какую-нибудь пустую папку архив с portable-вариантом KeePass версии 2.x. В подпапку Plugins поместим плагин KeePassFaviconDownloader.plgx. В папку программы распакуем архив с русским переводом и туда же — весь архив KeePassSettings.zip (пароль KeePass). В отдельное от программы место распакуем архив just_a_photo.zip.

KeePass 2.x требует .NET Framework 2.0. Если используются жесткие средства защиты, наподобие Comodo Internet Security, понадобится добавить файлы BackUp.js, GlobalAutoTypeHelper.js и RunActivate.js в доверенные.

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

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

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

Настройка ориентирована на максимально портативную и автономную работу. Хотя для KeePass'а и существует множество плагинов, лучше не зависеть от них. Мы обойдемся, в основном, штатными средствами. Единственный используемый плагин имеет декоративную роль, он не обязателен. Также мы обойдемся без браузерных расширений, которые передают браузеру пароли из KeePass'а.

В то же время, как вариант, будет рассмотрено применение плагина WebAutoType либо браузерных расширений, добавляющих URL страницы в заговолок.

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

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

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

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

Запустив KeePass, введем мастер-пароль myCoolMasterPassword и укажем ключевой файл just a photo.jpg.

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

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

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

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

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

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

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

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

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

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

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

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

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

Также KeePass может по отдельности набирать логин или пароль, причем с 4-секундной задержкой, чтобы мы успели поставить курсор в нужное поле. Этому служат кнопки [L] и [P] на панели инструментов. Кнопкой [S] набирается дополнительное поле Secret, своего рода второй пароль (например, ответ на секретный вопрос, код восстановления или другие секретные данные). Кнопка [A] запускает обычный автонабор, но с задержкой. Наконец, кнопка [F] открывает список всех полей и запускает автонабор выбранного — без задержки. Эти кнопки пригодятся в разных нестандартных случаях.

Вместо автонабора можно перетащить логин и пароль в поля ввода прямо из списка записей KeePass. Еще один вариант — временно скопировать эти данные в буфер обмена, это делается двойным кликом; через 20 секунд буфер обмена автоматически очищается (но только если там будут учетные данные; «чужое» содержимое KeePass не удалит).

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

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

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

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

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

На вкладке Безопасность включена автоочистка буфера обмена через 20 секунд. Также включена опция Использовать формат буфера обмена 'Clipboard Viewer Ignore', чтобы некоторые легальные программы, следящие за буфером обмена, не запоминали учетные данные (замечание, что эта опция «не рекомендована» устарело: оно относится к старой версии, конфликтовавшей с Microsoft Office).

Кнопки [A], [L], [P], [S] и [F] реализованы с помощью триггеров (Сервис → Триггеры). Во-первых, создан триггер Добавить кнопки на панель инструментов, который срабатывает по событию Приложение запущено и готово, условий не имеет и выполняет несколько действий:

  • Добавить кнопку... с идентификатором btn_TypeField, именем [F] и описанием Набрать поле...;
  • Добавить кнопку... с идентификатором btn_TypeLogin, именем [L] и описанием Набрать логин с задержкой;
  • Добавить кнопку... с идентификатором btn_TypePassword, именем [P] и описанием Набрать пароль с задержкой;
  • Добавить кнопку... с идентификатором btn_TypeSecret, именем [S] и описанием Набрать Secret с задержкой.
  • Добавить кнопку... с идентификатором btn_DelayedAutoType, именем [A] и описанием Выполнить обычный автонабор с задержкой;

Во-вторых, добавлено несколько триггеров, обрабатывающих нажатия на эти кнопки:

  • триггер Выполнить обычный автонабор с задержкой при нажатии на кнопку:
    • событие: Нажата пользовательская кнопка с идентификатором btn_DelayedAutoType,
    • действия:
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Выключить,
      • Ждать, время: 4000,
      • Выполнить автонабор для выбранной записи, поле Последовательность пусто,
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Включить;
  • триггер Набрать логин с задержкой при нажатии на кнопку:
    • событие: Нажата пользовательская кнопка с идентификатором btn_TypeLogin,
    • действия:
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Выключить,
      • Ждать, время: 4000,
      • Выполнить автонабор для выбранной записи с последовательностью {UserName},
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Включить;
  • триггер Набрать пароль с задержкой при нажатии на кнопку:
    • событие: Нажата пользовательская кнопка с идентификатором btn_TypePassword,
    • действия:
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Выключить,
      • Ждать, время: 4000,
      • Выполнить автонабор для выбранной записи с последовательностью {PASSWORD},
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Включить;
  • триггер Набрать Secret с задержкой при нажатии на кнопку:
    • событие: Нажата пользовательская кнопка с идентификатором btn_TypeSecret,
    • действия:
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Выключить,
      • Ждать, время: 4000,
      • Выполнить автонабор для выбранной записи с последовательностью {S:Secret},
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Включить;
  • триггер Набрать произвольное поле при нажатии на кнопку:
    • событие: Нажата пользовательская кнопка с идентификатором btn_TypeField,
    • действия:
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Выключить,
      • Выполнить автонабор для выбранной записи с последовательностью {PICKFIELD},
      • Изменить состояние триггера:
        • поле Имя триггера пусто,
        • новое состояние: Включить.

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

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

Наконец, в самой учебной записи включена опция Двойное усложнение автонабора.

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

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

Перейдем на страницу регистрации и заполним требуемые поля, кроме пароля. Скопируем в соответствующее поле KeePass'а выбранный логин, а в поле Комментарии укажем прочие данные, которые использовали для регистрации: имейл, имя и т.п. Нажмем кнопку Генерация пароля (напротив поля Пароль) и выберем профиль Автогенерируемые пароли для новых записей. Теперь нажмем Ok в окне создания записи — и KeePass ее запомнит. Чтобы запись обрела значок сайта, нажмем в ее контекстном меню пункт Download Favicons.

Перетащим пароль из KeePass'а в положенное место на странице регистрации. (Как вариант, можем нажать кнопку [P] и поставить курсор в поле, где требуется пароль.) Завершаем регистрацию.

Теперь опробуем регистрацию на Яндексе. Чтобы не ошибиться в адресе, откроем сайт двойным кликом по полю Ссылка в шаблоне Yandex из группы templates. Войдем в группу Почта и добавим запись по шаблону Yandex.

Перейдем на страницу регистрации, укажем имя, определимся с логином. Занесем в KeePass логин; укажем в качестве коммментария имя и фамилию. Сгенерируем пароль (Автогенерируемые пароли для новых записей) и нажмем Ok. Перетащим пароль на страницу регистрации.

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

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

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

Если вас не устраивает, что для создания дополнительного пароля нужно переходить в группу <service>, продублируйте запись <Генератор паролей> в каждой группе: просто перетащите эту запись, удерживая Ctrl.

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

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

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

В окне Сервис → Генератор паролей заданы профили паролей. Основной профиль задан так: установлена длина 20, выбраны алфавитно-цифровые и некоторые другие символы, нажата кнопка Сохранить текущую настройку как новый профиль (дискета справа вверху) и указан вариант Автогенерируемые пароли для новых записей. Другие профили заданы подобным образом: простой пароль состоит из 16 алфавитно-цифровых символов, сложный — из 30 символов широкого набора.

Запись <Генератор паролей> — это обычная запись, в которой на вкладку Дополнительно добавлено строковое поле Создать обычный пароль со значением {NEWPASSWORD} и обязательной опцией Включить защиту в памяти. Когда это строкое поле раскрывается (копируется в буфер обмена или вводится автонабором), значение в поле Пароль заменяется новым. Новый пароль генерируется согласно профилю Автогенерируемые пароли для новых записей. Можно указать другой профиль кодом {NEWPASSWORD:/имя_профиля/}.

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

Пришло время наладить синхронизацию. Откроем запись KeePassCloudStorage в группе <service> и зарегистрируемся на облачном хранилище mydrive.ch: придумаем логин, сгенерируем пароль — все как обычно. Учетные данные сохраним в этой записи, только название и ссылку оставим нетронутыми. Зайдем в хранилище и отправим туда файл нашей базы, что лежит в папке Base (Upload → using Standard → Save → Обзор... → Upload). Вот и все.

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

Теперь при каждом закрытии база будет синхронизироваться с облаком. Кнопкой ↑↓ можно синхронизировать базу, не закрывая KeePass.

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

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

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

В самой базе создана запись под названием KeePassCloudStorage с пустыми полями логина/пароля и ссылкой https://webdav.mydrive.ch/{T-CONV:/{DB_NAME}/Uri/} (KeePass впоследствии трансформирует эту ссылку в WebDAV-адрес файла, который расположен в корне облачного хранилища и имеет имя текущей базы паролей). Затем подготовлено несколько триггеров.

В уже имеющийся триггер Добавить кнопки на панель инструментов добавлено действие: Добавить кнопку... с идентификатором btn_Sync, именем ↑↓ и описанием Выполнить синхронизацию.

Создан триггер Синхронизировать при нажатии на кнопку:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Sync;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}Base;
    • Строка:
      • строка: {REF:T@T:KeePassCloudStorage},
      • операция: Равно,
      • значение: KeePassCloudStorage;
    • Строка:
      • опция Отрицание включена,
      • строка: {REF:U@T:KeePassCloudStorage},
      • операция: Равно,
      • поле Значение пусто;
    • Удаленный сервер доступен, сервер: google.com;
  • действия:
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Выключить,
    • Синхронизировать текущую базу паролей:
      • файл/ссылка: {REF:A@T:KeePassCloudStorage},
      • логин: {REF:U@T:KeePassCloudStorage},
      • пароль: {REF:P@T:KeePassCloudStorage};
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Включить.,

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

В результате синхронизация будет запускаться только для баз, расположенных непосредственно в папке Base, в которых есть запись KeePassCloudStorage с непустым логином, и только при наличии интернет-соединения. Учетные данные WebDAV возьмутся из самой этой записи. Для защиты от двойного нажатия кнопки или зацикливания триггеры деактивируются на время своего выполнения.

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

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

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

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

Используем KeePass2Android

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

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

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

Клавиатура KeePass2Android

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

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

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

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

Автонабор: обычный и нестандартный

Позаботимся, чтобы для наших записей корректно работал автонабор. Для верхней группы задана самая общая последовательность автонабора, которая работает в большинстве случаев: {CLEARFIELD}{UserName}{TAB}{DELAY 100}{Password}, т.е. очистка поля, набор логина, нажатие Tab, короткая задержка и набор пароля. (Многие добавляют в конце нажатие Enter, но я считаю это лишним: окончательный шаг лучше выполнить самостоятельно.) Эта последовательность наследуется подгруппами и самими записями, поэтому в большинстве случаев все будет Ok. А если авторизация совсем нестандартная?

Во-первых, можно открыть в записи вкладку Автонабор и указать нужную последовательность. Например, для Гугла это будет что-то вроде {UserName}{ENTER}{DELAY 1500}{Password}: набрать логин, нажать Enter, выждать полторы секунды и набрать пароль. Более того, можно указать различные последовательности автонабора для различных окон (кнопка Добавить). Например, при подключении к клиенту TeamViewer'ом сначала вводится идентификатор клиента, а потом, если удалось соединиться, в отдельном окне вводится пароль. Конфигурация автонабора будет такой: для окна TeamViewer набирать идентификатор {UserName}, а для окна Идентификация TeamViewer — пароль {PASSWORD}.

Во-вторых, можно раскладывать записи по группам в соответствии с автонабором. Так, записи для Google или Yahoo! можно помещать в группу 2-страничные. В параметрах этой группы (Изменить группу → Автонабор) задана последовательность {UserName}{ENTER}{DELAY 1500}{Password}, и записи ее наследуют. Недостаток этого варианта — на уровне группы нельзя задать автонабор для разных окон или включить его усложнение.

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

Некоторые окна, делаясь активными, теряют фокус ввода. Например, такую проблему имеет окно Скайпа. Есть два простых решения. Первое: выбрать в KeePass'е запись, поставить курсор в поле ввода и нажать Ctrl + Alt + Shift + F9. Второе: выбрать запись, нажать кнопку [A], а затем поставить курсор в поле ввода.

Авторизация в Skype с помощью KeePass

И на самые разные случаи остаются запасные варианты:

  • кнопкой [F] набрать любое отдельное поле;
  • кнопками [L], [P] и [S] набрать логин, пароль или поле Secret с задержкой — нажимаем на кнопку и ставим курсор в нужное поле;
  • поставить курсор в поле ввода, вызвать на записи контекстное меню и выбрать подходящую последовательность в разделе Начать автонабор;
  • или перетащить логин и пароль из KeePass'а в требуемые поля;
  • или временно скопировать любое поле в буфер обмена.
Как это настроено

О шаблонах уже говорилось выше. Отмечу, что среди них есть шаблон _Консоль/игры_, в котором автонабор вводит только пароль, причем замедленно и без усложнения. В любой записи можно замедлить ввод, указав код вида {DELAY=200} в начале последовательности.

Пауза для перехода на следующую страницу имеет вид {DELAY {REF:P@T:<delays>}}, т.е. задана ссылкой на пароль записи <delays>. Поэтому, если она окажется слишком длинной/короткой, нет необходимости менять задержку во всех записях: достаточно отредактировать запись <delays> в группе <service>. Аналогично пауза перед началом ввода задана ссылкой на поле Логин: {DELAY {REF:U@T:<delays>}}, а замедление — ссылкой на поле Ссылка: {DELAY={REF:A@T:<delays>}}.

По-особому сделан автонабор и в шаблоне Mail.ru. Для авторизации на странице https://e.mail.ru/login необходимо указать логин вместе с определенным почтовым доменом: mail.ru, bk.ru и др. Если в поле логина вводить полный почтовый адрес, наподобие example@mail.ru, то из-за усложнения автонабора окажется непредсказуемым, как перейти к вводу пароля: один или два раза нажать Tab. Найдено решение: использовать усложнение автонабора не для всего адреса сразу, а по отдельности для имени пользователя и для домена. Эти части выделяются из логина с помощью регулярных выражений, а в случае, если домен не указан в логине, берется домен mail.ru. Чтобы разделить усложнение автонабора, между частями вставлена фиктивная пауза. Вся последовательность:

{CLEARFIELD}{T-REPLACE-RX:/{USERNAME}/([^@]*).*/$1/}{DELAY 0}@{DELAY 0}{T-REPLACE-RX:/{USERNAME}@mail.ru/[^@]*@([^@]*).*/$1/}{TAB}{DELAY 100}{Password}

На случай, если в каком-нибудь другом почтовом сервисе будет такая же особенность авторизации, подобным образом сделан и автонабор в шаблоне _Почта_:

{CLEARFIELD}{T-REPLACE-RX:/{USERNAME}/([^@]*).*/$1/}{DELAY 0}{T-REPLACE-RX:/{USERNAME}/[^@]*(@?).*/$1/}{DELAY 0}{T-REPLACE-RX:/{USERNAME}/[^@]*@?(.*)/$1/}{TAB}{DELAY 100}{Password}.

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

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

Глобальный автонабор. Список эквивалентных доменов

До сих пор мы своими руками отыскивали подходящую запись для авторизации на сайте. Однако KeePass способен найти ее сам, сообразно открытому сайту, и запустить автонабор.

Чтобы KeePass видел, какой сайт открыт в браузере, установим плагин WebAutoType, который считывает адресную строку. Понадобится лишь поместить файл WebAutoType.plgx в папку Plugins, а в браузеры ничего устанавливать не нужно.

Предупрежу, что плагин WebAutoType может замедлить автонабор на пару секунд. Он не поддерживает некоторые браузеры: Pale Moon и др. Для работы плагина требуется .NET Framework 4. Если у вас установлен только .NET Framework 3.5, используйте плагин версии 3.x.

Вариант глобального автонабора с помощью браузерных расширений

Чтобы сообщать KeePass'у адрес открытого сайта, не обязательно устанавливать в него плагины. Вместо этого можно установить в браузер какое-либо из расширений, добавляющих к оконному заголовку адрес открытой страницы. Тогда KeePass будет подбирать записи на основании этого заголовка.

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

Yandex|Pale Moon|K-Meleon

Можно совмещать оба способа: для основных популярных браузеров использовать плагин WebAutoType, а в браузерах, не поддерживаемых плагином, установить расширение.

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

Авторизация в Google глобальным автонабором KeePass

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

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

Если один интернет-ресурс имеет несколько страниц авторизации с разными доменными именами, занесем эти домены в список экивалентных. Войдем в группу domains и создадим новую запись или изменим существующую, перечислив в ее названии эквивалентные домены, разделенные знаком | без пробелов, без протокола и без префикса www. Также название должно начинаться и оканчиваться знаком |. Например: |yandex.ru|passport.yandex.ru|mail.yandex.ru|. Теперь глобальный автонабор будет работать, даже если в поле Ссылка указана страница passport.yandex.ru, а открыта mail.yandex.ru.

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

Как задать множество эквивалентных доменов регулярным выражением

Записи об эквивалентных доменах могут содержать не только однозначные имена, но и регулярные выражения. Регулярное выражение, задающее дополнительное множество доменов, записывается в поле «Логин» соответствующей записи.

При этом в поле «Название» должны быть явно перечислены все доменные имена, которые встречаются в поле «Ссылка» у различных учетных записей. Например, если в базе есть учетные записи со ссылками https://passport.yandex.ru/ и https://www.yandex.by/?ncrnd=1851, то для записи об эквивалентных доменах Яндекса подойдет название |passport.yandex.ru|yandex.by| и логин ((mail|passport)\.)?yandex\.(ru|by|ua|com).

Внимание! Регулярное выражение должно быть таким, чтобы ему соответствовали только доменные имена, иначе возникнет угроза фишинга. Например, выражение .*\.livejournal\.com неприемлемо, потому что ему соответствует адрес http://bad-site.com#www.livejournal.com. Более безопасный вариант, охватывающий поддомены 3-го уровня, — выражение [\w\-]*\.livejournal\.com. А чтобы одновременно охватить и сам домен livejournal.com, и все его поддомены всех уровней, подойдет выражение ([\w\-\.]*\.)?livejournal\.com.

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

В группе <service> создана запись WindowAssociation, в ее поля Пароль и Ссылка соответственно вписаны значения:

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

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

В различных шаблонах записей задано два целевых окна автонабора (Автонабор → Добавить) с последовательностью по умолчанию и заголовками {T-REPLACE-RX:/{REF:P@T:WindowAssociation}/{{}/{/} и ??:URL:{T-REPLACE-RX:/{REF:A@T:WindowAssociation}/{{}/{/}.

Как получены эти значения

Предположим, в некоторые браузеры установлены расширения, добавляющие адрес сайта в заголовок, и эти браузеры перечислены через знак | в логине записи WindowAssociation. Обычно такие расширения отделяют адрес от остальной части заголовка пробелами и размещают его в конце, перед названием браузера. Некоторые из расширений заключают адрес в скобки и т.п. В качестве адреса они могут брать как полный URL, так и голое имя хоста. Поэтому в каждой записи можно задать целевое окно автонабора следующим регулярным выражением:

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

Поясню построение этого выражения. Двойные слеши в начале и в конце сообщают KeePass'у, что строка является регулярным выражением. Код {T-REPLACE-RX:!{URL:HOST}!^www\.!!} отбрасывает от доменного имени префикс www, если он есть. Выражения {REF:T@T:|...|} и {REF:U@T:|...|} ищут запись, название которой содержало бы доменное имя, окруженное знаками |. Если запись найдется, то первое выражение превратится в название этой записи (т.е. список доменов), а второе — в ее логин (т.е. регулярное выражение, задающее множество доменов). Если запись не найдется, то выражения {REF:T@T:|...|} и {REF:U@T:|...|} останутся самими собой, и в этом случае выражение {T-REPLACE-RX:/.../^\{.*//} превратит результат поиска логина в пустую строку (в случае успешного поиска оно ничего не изменит). Выражение {T-REPLACE-RX:/.../([^\w\s\|])/\$1/} экранирует списке доменов все спецсимволы, кроме знака |. Получившиеся строки — явный список доменов и регулярное выражение — вместе заключаются в скобки, образуя группу. Код (?=\w) перед этой группой (вкупе с кодом после нее) предписывает выбирать из группы только строки, начинающиеся алфавитно-цифровым символом (таким образом исключаются пустые строки, а также обрывки кода, полученные при неудачном поиске: {REF:T@T: и }). Выражения (?:\w+\:\/\/)?(?:www\.)? и (?:[\:\/#]\S*)? позволяют опознавать адрес в заголовке независимо от того, содержит ли он протокол, префикс www, порт или путь. Фрагменты  \W* и \W*  означают, что адрес отделен от остальной части заголовка пробелами и, возможно, спецсимволами, наподобие скобок, дефисов и т.п. Код (?:{REF:U@T:WindowAssociation})$ превращается в выражение, которому должно соответствовать название браузера, расположенное в конце заголовка.

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

Для плагина WebAutoType целевое окно задается похожим выражением. Оно отличается знаком ^, указывающим на начало строки, а также отсутствием пробелов и разделителей \W* вокруг адреса и отсутствием названия браузера:

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

Чтобы не дублировать эти выражения в каждой записи, они размещены в полях Пароль и Ссылка специальной записи WindowAssociation, а в обычных записях целевые окна автонабора заданы ссылками на эти поля. Чтобы в полях записи WindowAssociation не произошло преждевременных преобразований, символ { в выражениях заменен последовательностью {{}. Соответственно, к ссылкам на эти поля применено преобразование, восстанавливающее символ {. Таким образом, в обычных записях заголовок браузера, содержащий адрес страницы, задается выражением {T-REPLACE-RX:/{REF:P@T:WindowAssociation}/{{}/{/}, а адресная строка, читаемая плагином WebAutoType, — выражением ??:URL:{T-REPLACE-RX:/{REF:A@T:WindowAssociation}/{{}/{/}. Префикс ??:URL: в последнем выражении означает, что оно предназначено для этого плагина.

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

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

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

  • событие: Нажата пользовательская кнопка с идентификатором btn_GlobalAutoType,
  • действия:
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\GlobalAutoTypeHelper.js",
      • опция Ждать выхода включена;
    • Выполнить глобальный автонабор,
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Включить;

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

var WshShell = WScript.CreateObject("WScript.Shell");
if (WScript.Arguments.Count() == 0) {
 WScript.Sleep(100);
 WshShell.SendKeys("%{ESC}");
 WshShell.Exec("%windir%\\System32\\wscript.exe \"" + WScript.ScriptFullName + "\" 0");
} else {
 for (var attempt = 1; attempt != 20; ++attempt) {
  WScript.Sleep(500);
  if (WshShell.AppActivate("Выбор записи для автонабора")) {
   break;
  }
 }
}

Запуск программ из KeePass'а. Ограничение их прав

Ссылками могут быть не только интернет-адреса, но и любые команды.

Чтобы двойным кликом по ссылке запускалась какая-нибудь программа, например, TeamViewer, можно указать ее в записи кнопкой Инструменты → Поле ссылки: выбор приложения — тогда в поле Ссылка появится строка наподобие cmd://"C:\TeamViewer\TeamViewer.exe". Можно и вручную вписать подобную строку, начинающуюся на cmd://.

Также в поле Ссылка можно указать аргументы командной строки, причем в них можно ссылаться на поля записи. Например, удобно запускать TeamViewer «ссылкой» вида cmd://"C:\TeamViewer\TeamViewer.exe" -i "{USERNAME}" — тогда он автоматически соединится с заданным клиентом, останется лишь запустить автонабор пароля.

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

Чтобы вместе с тем работал глобальный автонабор на сайте Скайпа, в группу domains добавлена запись под названием |skype|login.skype.com|. Аналогично имена и сайты других приложений можно делать «эквивалентыми доменами».

Предложенный способ удобен тем, что ссылка вида LNK://... наглядна и видна целиком в списке записей. Кроме того, если изменится путь к файлу, не придется исправлять все связанные с ним записи — достаточно изменить ярлык. Недостаток таких ссылок — невозможность указать в них аргументы командной строки (можно лишь вписать аргументы в сам ярлык).

Запуск приложений из KeePass

Я рекомендую запускать KeePass от имени администратора: тем самым вы защитите его от обычных ограниченных процессов, — разумеется, если включен UAC. Просто откройте свойства файла KeePass.exe и отметьте на вкладке Совместимость опцию Выполнять эту программу от имени администратора. Но если не хотите или не можете дать KeePass'у повышенные права — он вполне обойдется обычными.

Важная деталь этой настройки: KeePass запускает программы с ограниченными правами, даже если сам он имеет права администратора. Это относится и к ссылкам вида cmd://, и к ссылкам вида LNK://. При открытии обычных интернет-ссылок из KeePass'а браузер тоже запустится ограниченно, даже если KeePass'у даны права администратора (Исключения, когда браузер получает права администратора — при открытии ссылок в окне Проверка обновлений, а также при открытии альтернативных браузеров через контекстное меню записей).

Если вам понадобится, чтобы KeePass не понижал права запускаемой программы, замените в ссылке префикс cmd:// на cmdDirect://.

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

В окне Сервис → Настройка → Интеграция → Замены ссылок добавлена новая схема LNK с заменой ссылки cmd://%windir%\explorer.exe "{APPDIR}\LNK\{T-REPLACE-RX:/{BASE:RMVSCM}/"//}.LNK". Она означает запуск проводника с указанием ярлыка в командной строке: поскольку проводник выполняется с ограниченными правами, он и программу запустит ограниченно.

Чтобы браузер не получил повышенных прав при открытии интернет-ссылок из KeePass'а, аналогично добавлена замена cmd://%windir%\explorer.exe "{BASE}" для схем http , https, ftp, mms и mailto. Можно добавить другие протоколы, если они используются. С этой же целью онлайн-справка заменена локальной: Справка → Источник справки → Локальный файл.

К сожалению, остались еще, по крайней мере, три возможности запустить браузер с правами KeePass'а: через контекстное меню записи (при выборе альтернативного браузера), через ссылку в файле справки и через окно проверки обновлений. Поэтому не следует открывать браузер такими способами. Получив уведомление о новой версии, просто откроем окно Справка → О программе и оттуда уже безопасно попадем на сайт KeePass'а.

Несколько сложнее устроена обработка схемы cmd. Для нее добавлена замена cmd://%windir%\System32\wscript.exe "{APPDIR}\RunActivate.js" /base:{T-CONV:/{URL}/Uri/}, означающая запуск скрипта RunActivate.js с аргументом командной строки /base:, содержащим ссылку в URI-кодировке. Скрипт заносит полученные данные в ярлык LNK\temp.lnk и запускает его проводником, а затем удаляет эти данные из ярлыка. Скрипт умеет также активировать окна, заданные в командной строке, но здесь эта возможность не используется. Код скрипта:

var WshShell = WScript.CreateObject("WScript.Shell");
var appDir = WScript.ScriptFullName.substring(0,
 WScript.ScriptFullName.length - WScript.ScriptName.length - 1);
var oNamedArgs = WScript.Arguments.Named;
var base = oNamedArgs.Exists("base") ? decodeURIComponent(oNamedArgs("base")) :  "";
var time = oNamedArgs.Exists("time") ? (+oNamedArgs("time")) : 0;
var win = oNamedArgs.Exists("win") ? decodeURIComponent(oNamedArgs("win")) : "";
var parsed = /^(?:(\w+)\:\/+)?((?:"([^"]*)"|([^"\s]*))(?:\s+(.*))?)$/.exec(base)
 || new Array(6);
var scheme = (parsed[1] || "").toLowerCase();
var rmvscm = parsed[2] || "";
var app = parsed[3] || parsed[4] || "";
var args = parsed[5] || "";
if (scheme == "lnk") {
 scheme = "cmddirect";
 app = "%windir%\\explorer.exe";
 args = '"' + appDir + '\\LNK\\' + rmvscm.replace(/"/g, '') + '.lnk"';
}
if (/\.lnk$/.test(app)) {
 var lnk = WshShell.CreateShortcut(app);
 app = lnk.TargetPath;
 args = lnk.Arguments + " " + args;
 WshShell.CurrentDirectory = lnk.WorkingDirectory || WshShell.CurrentDirectory;
}
if (scheme == "cmd") {
 var pathTempLnk = appDir + "\\LNK\\temp.lnk";
 var tempLnk = WshShell.CreateShortcut(pathTempLnk);
 tempLnk.TargetPath = app;
 tempLnk.Arguments = args;
 tempLnk.WorkingDirectory = WshShell.CurrentDirectory;
 tempLnk.Save();
 WshShell.Run('%windir%\\explorer.exe "' + pathTempLnk + '"', 1, true);
 tempLnk.TargetPath = "%comspec%";
 tempLnk.Arguments = "";
 tempLnk.WorkingDirectory = "%windir%";
 tempLnk.Save();
} else if (scheme == "cmddirect") {
 WshShell.Exec('"' + app + '" ' + args);
}
if (win) {
 WScript.Sleep(time * 0.1);
 time *= 0.9;
 while (!WshShell.AppActivate(win) && time > 0) {
  WScript.Sleep(200);
  time -= 200;
 }
}

Этот скрипт можно использовать и в других схемах: если понадобится открывать ссылку вида новая_схема://ссылка как cmd://команда, понижая при этом права, — добавим замену схемы новая_схема на cmd://%windir%\System32\wscript.exe "{APPDIR}\RunActivate.js" /base:{T-CONV:!cmd://команда!Uri!}. В качестве примера добавлена схема RDP для подключения к удаленному рабочему столу.

Построение схемы RDP и ее использование

В статье на Хабрахабре для схемы RDP предлагалась команда:

cmd://cmd /c "cmdkey /generic:TERMSRV/{BASE:RMVSCM} /user:{USERNAME} /pass:{PASSWORD} && mstsc /v:{BASE:RMVSCM} && timeout /t 5 /nobreak && cmdkey /delete:TERMSRV/{BASE:RMVSCM}"

Я удалил в этой команде фрагмент /pass:{PASSWORD} , поскольку передавать пароль в командной строке опасно. В итоге для схемы RDP получилась замена:

cmd://%windir%\System32\wscript.exe "{APPDIR}\RunActivate.js" /base:{T-CONV:!cmd://cmd /c "cmdkey /generic:TERMSRV/{BASE:RMVSCM} /user:{USERNAME} && mstsc /v:{BASE:RMVSCM} && timeout /t 5 /nobreak && cmdkey /delete:TERMSRV/{BASE:RMVSCM}"!Uri!}

Чтобы схема RDP работала, каждая запись удаленного рабочего стола должна иметь вид:

  • логин: имя_пользователя,
  • пароль: пароль_пользователя,
  • ссылка: RDP://адрес_компьютера,
  • последовательность автонабора: {Password}.

Для непосредственного запуска программ из KeePass'а без понижения их прав добавлена схема cmdDirect с заменой cmd://{BASE:RMVSCM}.

Запуск программ с одновременным автонабором.

Если вы желаете использовать вместе с KeePass'ом программу VeraCrypt или TrueCrypt, создайте ярлык на нее VeraCrypt.lnk в папке LNK. Для каждого своего криптоконтейнера создайте запись по шаблону VeraCrypt: укажите контейнер (путь к файлу или устройству) в поле Логин и пароль в поле Пароль.

Если используются ключевые файлы, понадобится также перечислить их пути в поле KeyFile (разделяя переводом строки, если их несколько); иначе оставить поле пустым. Если значение PIM нестандартно, его следует указать в поле PIM, иначе оставить это поле пустым. Если необходимо монтировать том на определенную букву, ее следует указать в поле Letter (по умолчанию это поле пусто, что означает выбор первой свободной буквы).

Теперь достаточно выбрать запись с нужным контейнером, нажать на панели инструментов кнопку [R] — и смонтируется том VeraCrypt, т.е. KeePass сам запустит VeraCrypt и наберет пароль.

Вообще, если выбрать определенную запись и нажать на панели инструментов кнопку [R], то запустится указанная в записи программа и в нее автоматически подставится пароль. Это работает не для всех записей, а только для созданных по шаблонам _Запуск_с_автонабором_, VeraCrypt, Telegram, Thunderbird, Удаленный рабочий стол, TeamViewer, AmmyyAdmin.

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

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

Здесь используется тот же скрипт RunActivate.js, код которого приведен выше. Скрипт запускает заданное приложение и в течение заданного времени пытается активировать окно с заданным заголовком. Команда для запуска и заголовок передаются в URI-кодировке в аргументах /base: и /win: соответственно, время в миллисекундах — в аргументе /time:. Если команда начинается со схемы cmdDirect, то она запустится скриптом непосредственно; если с cmd или LNK, то через проводник.

В уже имеющийся триггер Добавить кнопки на панель инструментов добавлено действие: Добавить кнопку... с идентификатором btn_Run, именем [R] и описанием Выполнить!. Этой кнопке назначены разные триггеры на разные случаи.

Создан триггер Запуск с автонабором (cmd/cmdDirect/LNK):

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Run_Activate_AutoType;
  • условие Строка:
    • строка: {T-REPLACE-RX:!{URL}x!^(?i)(cmd|cmdDirect|LNK)\:\/\/.*!!},
    • операция: Равно,
    • значение: пусто;
  • действия:
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\RunActivate.js" /base:{T-CONV:/{URL}/Uri/} /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Включить.

Создан триггер Запуск с автонабором (RDP):

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Run_Activate_AutoType;
  • условие Строка:
    • строка: {T-CONV:/{URL}/L/},
    • операция: Начинается с,
    • значение: rdp://;
  • действия:
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\RunActivate.js" /base:{T-CONV:!cmd://cmd /c "cmdkey /generic:TERMSRV/{URL:RMVSCM} /user:{USERNAME} && mstsc /v:{URL:RMVSCM} && timeout /t 5 /nobreak && cmdkey /delete:TERMSRV/{URL:RMVSCM}"!Uri!} /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Включить.

Создан триггер Запуск с двойным автонабором (cmd/cmdDirect/LNK):

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Run_Activate_AutoType_2;
  • условие Строка:
    • строка: {T-REPLACE-RX:!{URL}x!^(?i)(cmd|cmdDirect|LNK)\:\/\/.*!!},
    • операция: Равно,
    • значение: пусто;
  • действия:
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\RunActivate.js" /base:{T-CONV:/{URL}/Uri/} /win:{T-CONV:/{S:R_Title1}/Uri/} /time:{S:R_Time1},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\RunActivate.js" /win:{T-CONV:/{S:R_Title2}/Uri/} /time:{S:R_Time2},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Изменить состояние триггера:
      • поле Имя триггера пусто,
      • новое состояние: Включить.

В базе создан шаблон _Запуск_с_автонабором_, в котором задано поле R_Trigger со значением R_Run_Activate_AutoType, поле R_Time со значением 7000 (продолжительность попыток активации), и поле R_Title со значением указать начало или конец заголовка. На вкладке Автонабор для этого шаблона задана по умолчанию последовательность {DELAY 0} (чтобы предотвратить ввод пароля в стороннее окно), а окнам с заголовками {S:R_Title}* и *{S:R_Title} назначена последовательность {CLEARFIELD}{Password}{ENTER}.

На основе шаблона _Запуск_с_автонабором_ создан шаблон VeraCrypt. В нем изменено значение поля R_Time на 2500, поля R_Title — на {UserName}, добавлено пустое поле Letter и пустые защищенные поля KeyFile и PIM, а в ассоциациях автонабора оставлено только окно *{S:R_Title} с последовательностью {CLEARFIELD}{Password}{ENTER}. Полю Ссылка задано значение:

cmdDirect://"{APPDIR}\LNK\VeraCrypt.lnk" /q background /v "{UserName}"{T-REPLACE-RX:!{S:KeyFile}![\n\r]*([^\n\r]+)[\n\r]*! /k "$1"!}{T-REPLACE-RX:!{S:Letter}!(.+)! /l $1!}{T-REPLACE-RX:!{S:PIM}!(.+)! /pim $1!}

Если используется портативная версия программы VeraCrypt, расположенная вместе с KeePass'ом на съемном носителе, то в ссылке лучше заменить путь к ярлыку {APPDIR}\LNK\VeraCrypt.lnk на путь к самой программе, наподобие "{APPDIR}\..\VeraCrypt\VeraCrypt.exe".

Другие шаблоны созданы подобным образом.

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

  • поле R_Trigger: R_Run_Activate_AutoType_2,
  • поле R_Title1: заголовок первого окна для ввода данных,
  • поле R_Title2: заголовок второго окна для ввода данных,
  • поле R_Time1: продолжительность попыток активировать первое окно,
  • поле R_Time2: продолжительность попыток активировать второе окно,
  • последовательность автонабора по умолчанию: {DELAY 0},
  • ассоцииации окон и последовательностей автонабора, например:
    • окно {S:R_Title1} с последовательностью {UserName}{ENTER},
    • окно {S:R_Title2} с последовательностью {PASSWORD}{ENTER}.

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

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

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

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

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

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

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

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

Любые изменения базы сразу сохраняются на диске. (Опять же, это касается и записи <Генератор паролей>: каждое создание пароля немедленно фиксируется.) Если какая-либо запись открыта и редактируется, то изменения сохранятся после закрытия ее окна.

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

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

При желании вы можете отказаться от создания резервных копий или автоматического сохранения базы. Откройте окно Сервис → Триггеры и измените триггер Создать резервную копию или Автоматически сохранять изменения: отключите опцию Включен (другие параметры менять не нужно). Включение выполняется аналогично.

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

Вы можете изменить количество версий базы, хранящихся в папке BackUp. Для этого в соответствующем триггере измените действие Выполнить команду/ссылку: в поле Аргументы замените число 20 на желаемое количество. Предположим, вы желаете хранить 5 последних версий базы. Тогда при использовании триггера Создать резервную копию впишите в поле Аргументы строку "{APPDIR}\BackUp.js" "{DB_NAME}" 5, а при использовании триггера Создать резервную копию, не используя скрипт — строку /c "copy "{DB_PATH}" "{DB_DIR}\BackUp\{DT_SIMPLE}-{DB_NAME}"& for /f "skip=5 tokens=*" %X in ('dir "{DB_DIR}\BackUp\*-{DB_NAME}" /b /o:-n') do del "{DB_DIR}\BackUp\%X" /q"

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

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

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

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

Параметры хранения истории и использования корзины оставлены по умолчанию.

В разделе Сервис → Настройка → Дополнительно включена опция Автоматически сохранять при закрытии/блокировке базы паролей.

Для сохранения базы при каждом ее изменении в разделе Сервис → Триггеры создан триггер Автоматически сохранять изменения:

  • событие: Состояние интерфейса пользователя обновлено,
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}Base;
    • база паролей содержит несохраненные изменения, база — Текущая;
  • действия:
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Выключить,
    • Сохранить текущую базу паролей,
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Включить,

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

  • событие: Сохранение файла базы паролей, фильтр оставлен пустым;
  • условие Строка:
    • строка: {DB_DIR},
    • операция: Равно,
    • значение: {APPDIR}{ENV_DIRSEP}Base;
  • действия:
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\BackUp.js" "{DB_NAME}" 20,
      • опция Ждать выхода включена;
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Включить,

Копирование выполняет скрипт BackUp.js: он создает в папке Base\BackUp копию текущей базы, добавляя к имени текущее время, и удаляет старые ее версии. Имя базы и количество хранимых версий он получает в аргументах командной строки. Код скрипта:

(function() {
 var args = WScript.Arguments;
 if (args.Count() != 2) {
  WScript.Echo("Using: BaskUp.js  ");
  return;
 }
 var name = WScript.Arguments(0);
 var backUpCount = +WScript.Arguments(1);
 
 var appDir = WScript.ScriptFullName.substring(0, WScript.ScriptFullName.length - WScript.ScriptName.length - 1);
 var baseDir = appDir + "\\Base";
 var backUpDir = baseDir + "\\BackUp";
 
 var FSO = WScript.CreateObject("Scripting.FileSystemObject");
 try {
  if (!FSO.FolderExists(backUpDir)) {
   FSO.CreateFolder(backUpDir);
  }
 } catch (e) {
  WScript.Echo("Unable to create \"" + backUpDir + "\"");
  return;
 }
 var d = new Date();
 var toXX = function(x) {return x < 10 ? '0' + x : x;}
 var prefix = d.getFullYear() + '.' + toXX(d.getMonth() + 1) + '.' + toXX(d.getDate()) + '-' + toXX(d.getHours()) + '.' + toXX(d.getMinutes()) + '.' + toXX(d.getSeconds());
 try {
  FSO.CopyFile(baseDir + '\\' + name, backUpDir + '\\' + prefix + '-' + name);
 } catch (e) {
  WScript.Echo("Unable to create a backup");
  return;
 }
 try {
  var files = [];
  for (var en = new Enumerator(FSO.GetFolder(backUpDir).Files); !en.atEnd(); en.moveNext()) {
   if (en.item().Name.indexOf('-' + name) == prefix.length) {
    files[files.length] = en.item();
   }
  }
  files.sort(function(f1, f2) {
   if (f1.Name < f2.Name)
    return -1;
   if (f1.Name > f2.Name)
    return 1;
   return 0;
  });
  for (var i = 0; i < files.length - backUpCount; ++i) {
   files[i].Delete();
  }
 } catch (e) {
  WScript.Echo("Unable to delete old backups");
  return;
 }
})();

В качестве альтернативного создан триггер Создать резервную копию, не используя скрипт, наподобие предложенного в официальном руководстве:

  • опция Включен отключена;
  • опция Включен при загрузке включена;
  • событие: Сохранение файла базы паролей, фильтр оставлен пустым;
  • условие Строка:
    • строка: {DB_DIR},
    • операция: Равно,
    • значение: {APPDIR}{ENV_DIRSEP}Base;
  • действия:
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Выключить,
    • Выполнить команду/ссылку:
      • файл/ссылка: %comspec%,
      • аргументы: /c "copy "{DB_PATH}" "{DB_DIR}\BackUp\{DT_SIMPLE}-{DB_NAME}"& for /f "skip=20 tokens=*" %X in ('dir "{DB_DIR}\BackUp\*-{DB_NAME}" /b /o:-n') do del "{DB_DIR}\BackUp\%X" /q",
      • опция Ждать выхода включена;
      • стиль окна: Скрытое;
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • Новое состояние: Включить,

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

Блокировка интерфейса ПИН-кодом

В предложенном варианте настройки есть импровизированная защита интерфейса ПИН-кодом.

Откроем группу <service> и сделаем двойной клик по полю Логин записи <Заблокировать интерфейс>. Появится окно для ввода, блокирующее остальной интерфейс KeePass'а. Если ввести 1234, оно благополучно исчезнет. Если ввести другой код или закрыть окно — закроется база и завершатся все запущенные KeePass'ы.

Быстрая разблокировка KeePass PIN-кодом

Правильный ПИН-код хранится в поле Пароль записи <Заблокировать интерфейс>, вы можете указать свой.

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

Впрочем, от кражи паролей через горячие клавиши глобального автонабора можно защититься: просто отключите их (Сервис → Настройка → Интеграция → Автонабор → удалить) и пользуйтесь вместо них кнопкой [G].

Если запущена такая блокировка интерфейса, то база не заблокируется после длительного бездействия. Иногда это удобно.

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

В группе <service> создана запись <Заблокировать интерфейс> с логином dblClick_to_lock, паролем 1234 и ссылкой 1234567890. Автонабор для этой записи отключен.

Создан триггер (Сервис → Триггеры) Блокировать интерфейс:

  • событие Данные из записи скопированы в буфер обмена:
    • операция: Равно,
    • значение: dblClick_to_lock;
  • условие Строка:
    • опция Отрицание включена,
    • строка: {PICKCHARS:URL},
    • операция: Равно,
    • значение: {PASSWORD};
  • действия:
    • Закрыть текущую базу паролей;
    • Выполнить команду/ссылку:
      • файл/ссылка: taskkill,
      • аргументы: /f /im KeePass.exe,
      • опция Ждать выхода включена;
      • стиль окна: Скрытое.

Импорт базы паролей

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

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

Для записей, которые только что импортированы из сторонней базы, могут не работать некоторые фунции, в первую очередь, усложнение автонабора и глобальный автонабор. Чтобы включить эти функции, воспользуемся XML-заменой в базе паролей:

  1. создадим в базе группу toImprove;
  2. переместим в эту группу все записи, для которых нужно активировать усложнение автонабора и глобальный автонабор (можно перетаскивать как записи, так и целые группы с подгрупами);
  3. чтобы включить усложнение автонабора, откроем окно Сервис → Сервис базы паролей → XML-замена и выполним замену с параметрами:
    • Узлы дерева: //Group[Name="toImprove"]//Entry/AutoType/DataTransferObfuscation
    • Действие: Заменить данные
    • Данные: Текст
    • Искать: 0
    • Заменить на: 1
  4. чтобы настроить записи для глобального автонабора, откроем это же окно и выполним замену с параметрами:
    • Узлы дерева: //Group[Name="toImprove"]//Entry/AutoType
    • Действие: Заменить данные
    • Данные: Внешний XML
    • Искать: </AutoType>\Z
    • Заменить на: <Association><Window>{T-REPLACE-RX:/{REF:P@T:WindowAssociation}/{{}/{/}</Window><KeystrokeSequence /></Association><Association><Window>??:URL:{T-REPLACE-RX:/{REF:A@T:WindowAssociation}/{{}/{/}</Window><KeystrokeSequence /></Association></AutoType>
    • опция Регулярное выражение включена;
  5. расформируем группу toImprove: переместим записи Google в группу 2-страничные, записи Mail.ru в одноименную группу, другие почтовые записи в группу Почта и т.д.;
  6. удалим или переименуем группу toImprove.

Импорт данных в KeePass

Работа с разными базами

Можно создавать другие базы по образцу предложенной, сделав ее копию в папке Base. За основу нужно брать только исходную базу из архива KeePassSettings.zip, не используйте для этого базу с настоящими паролями. Также можно создавать базы с нуля (Файл → Новый...).

Вы можете открывать любые базы, совместимые с версией 2.x, а также импортировать данные из других баз, причем множества форматов. В одном окне KeePass'а можно открыть несколько баз одновременно.

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

Защита

Расшифрованные пароли в памяти

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

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

Автор программы ответил по этой проблеме, что стереть пароли в памяти невозможно из-за неизменяемости .NET-строк.

Пароли в памяти KeePass

Если использовать плагины для коммуникации с браузером, то «поверхность атаки» увеличивается: мишенью становится еще и память браузера. Так, заглянув в память Fiefox'а с расширением KeeFox, я обнаружил там данные всех своих гугловских учетных записей — они появились, стоило мне лишь открыть Гугл.

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

Для защиты от этой угрозы принято несколько мер.

Во-первых, KeePass настроен так, чтобы он мог работать от имени администратора (т.е. с высоким уровнем целостности). Тогда система запретит чтение его памяти обычным ограниченным программам.

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

В-третьих, KeePass настроен на завершение своей работы вместо блокировки базы (Сервис → Настройка → Безопасность → Всегда выходить вместо блокирования).

В-четвертых, настройка KeePass продумана для автономной работы без интеграции в браузеры.

Подробнее: какие данные раскрываются в памяти и при каких условиях

Поэкспериментировав с KeePass'ом, я сделал некоторые выводы о раскрытии данных его в памяти.

  • При запуске KeePass'а и открытии базы раскрываются заголовки всех записей, их логины, ссылки, комментарии, а также дополнительные строковые поля, для которых не включена опция защиты в памяти. Пароли и защищенные строковые поля остаются скрытыми.
  • Если для какой-либо записи выполнить автонабор, или перетаскивание полей, или их копирование — в памяти раскроются только используемые поля. Например, пароль не раскроется, если через контекстное меню скопировать дополнительное строковое поле.
  • Если выполнить глобальный автонабор: вызвать список подходящих записей и выбрать нужную, то раскроются только данные выбранной записи. В прочих записях, предложенных KeePass'ом для глобального автонабора, пароли и защищенные строковые поля останутся скрытыми (если отображение паролей не включено в окне выбора).
  • (!) Если открыть какую-либо запись для редактирования, то в памяти KeePass'а появятся все ее данные, включая пароль и защищенные строковые поля — даже если не вносить никаких изменений и не просматривать эти данные.
  • (!) Если выполнить быстрый поиск через панель инструментов, то раскроются защищенные строковые поля всех записей. При этом пароли останутся скрытыми (если быстрый поиск по паролям не включен в настройке внешнего вида программы).
  • (!) После синхронизации базы все данные, кроме мастер-пароля, раскрываются в памяти.
  • (!) Данные, раскрытые единожды, остаются в памяти KeePass'а даже после закрытия базы.
Кстати, а как там у конкурентов?

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

С расширением LastPass в Firefox'е дела оказались плохи: в памяти браузера нашлись не только пароли из базы (причем до их использования), но и мастер-пароль. В Google Chrome расширение LastPass показало себя лучше: мастер-пароля в памяти браузера я не нашел, как и паролей отдельных записей — может, плохо искал. Но после использования какой-либо записи ее пароль появлялся в памяти и оставался там.

Приложение Norton Identity Safe, как оказалось, сразу же раскрывает все пароли в своей памяти: и мастер-пароль, и пароли из базы (Так было на базе из пары записей. Как в случае большой базы — не знаю). Также пароли остаются в памяти после блокировки базы. Однако это приложение запускается с повышенными привилегиями, потому нужны права администратора, чтобы прочитать его память. И тут разработчики подложили жирную свинью: менеджер паролей запускает браузер с такими же привилегиями! Т.е., случись пользователю открыть ссылку прямо из Norton Identity Safe, он подставит себя под удар: браузер, а заодно и запущенная им малварь получит права администратора. (Повторю, что KeePass в предлагаемой конфигурации запускает бразуер, в основном, ограниченно.)

Norton Identity Safe наделяет браузер повышенными привилегиями

А вот приложение Sticky Password показало себя на удивление хорошо (или, опять же, я плохо тестировал): ни мастер-пароля, ни паролей из базы не удалось найти в его памяти. Во время редактирования записи пароль, конечно, обнаруживался, но затем он исчезал — в этом отношении Sticky Password оказался лучше KeePass'а. Впрочем, не знаю, как обстоит дело с его браузерными плагинами. Вместе с тем Sticky Password еще и защищал себя повышенными привилегиями, но, в отличие от Norton Identity Safe, снижал их для дочерних процессов.

Прочие детали защиты

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

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

Также программа настроена на блокировку (вернее, на выход) после 5 минут общего бездействия, при переключении пользователя, при переходе в спящий режим и при изменении режима удаленного доступа (Сервис → Настройка → Безопасность). Отключено запоминание недавних файлов (вкладка Внешний вид).

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

Дополнительная защита с помощью Comodo Internet Security

Предложу вариант настройки комплекса Comodo Internet Security для усиленной защиты KeePass'а. Эта настройка совершенно не обязательна и адресуется только опытным поьзователям.

Хотя CIS 8.4 и не защитит память KeePass'а от чтения сторонними программами, он предотвратит ее изменение, в т.ч. снятие дампа. Также CIS защитит окно KeePass'а от оконных сообщений, а его файлы от изменения, скроет содержимое папок с программой и с ключевым файлом. Кроме того, CIS может запретить KeePass'у запускать сторонние приложения иначе как через проводник — чтобы они не унаследовали от KeePass'а повышенные привилегии.

Поскольку файл конфигурации может хранить путь к ключевому файлу и другую секретную информацию, скроем местоположение программы: дадим каталогу с программой секретное имя и переместим в другой каталог. В результате путь к программе примет вид наподобие C:\KeePass\secret3518\KeePass.exe.

Откроем настройку CIS на вкладке Репутация файлов → Список файлов и добавим скрипты BackUp.js, GlobalAutoTypeHelper.js и RunActivate.js как доверенные. Перейдем на вкладку Репутация файлов → Группы файлов, создадим группу KeePass и добавим в нее папку, в которой находится «секретная», в нашем примере это C:\KeePass\*. Откроем вкладку HIPS → Защищенные объекты → Папки с защищенными данными и добавим в список ту же папку, а также папку с ключевым файлом. Теперь эти папки будут выглядеть пустыми для программ, выполянющихся в виртуальной среде Comodo Sandbox.

На вкладке HIPS → Защищенные объекты → Защищенные файлы добавим группу KeePass.

Откроем вкладку HIPS → Настройка HIPS и убедимся, что HIPS включен в Безопасном или Параноидальном режиме, опция Создавать правила для безопасных приложений отключена, опция Выполнять эвристический анализ командной строки включена.

Перейдем на вкладку Правила HIPS и отредактируем правила группы Все приложения. В пункте Межпроцессный доступ к памяти нажмем Изменить и добавим на вкладку Заблокированные группу KeePass. Аналогично изменим пункты Оконные сообщения и Защищенные файлы и папки.

Добавим правила HIPS для группы KeePass, выберем вариант Использовать собственный набор правил:

  • в пункте Запуск приложений выберем действие Блокировать, нажмем Изменить и добавим на вкладку Разрешенные:
    • группу KeePass,
    • %windir%\explorer.exe,
    • %windir%\Microsoft.NET\*,
    • %windir%\System32\wscript.exe;
  • в пункте Защищенные файлы и папки нажмем Изменить и добавим на вкладку Разрешенные группу KeePass;
  • выберем действие Разрешить в пунктах Оконные сообщения, Межпроцессный доступ к памяти, DNS-запросы, Монитор, Диск и Клавиатура.

На вкладке Фаервол → Правила для приложений назначим группе KeePass политику Только исходящие.

Заметим, что теперь вносить изменения в файлы и папки KeePass'а смогут только программы, которым это явно разрешено. Например, по умолчанию таковым является проводник.

Статья для Блога о COMODO на сайте COMSS.RU. См. условия использования.