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

Запуск альтернативных браузеров и других приложений из KeePass'а. Подстановка паролей в приложения. Работа с несколькими базами. Открытие базы без ввода пароля. Дополнительная защита системными средствами и с помощью Comodo Internet Security

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

Как и в предыдущей статье, все приемы использования KeePass'а иллюстрируются готовой настроенной программой. Напомню, что вам понадобится распаковать в какую-либо пустую папку архив с portable-вариантом KeePass версии 2.x, туда же распаковать архив KeePass_Settings.zip (пароль 1), в папку Languages — архив с русским переводом. Опционально — поместить в папку Plugins плагины Favicon Downloader, TCATO Placeholder, WebAutoType, AutoTypeShow, KeePassQuickUnlock и KPSourceForgeUpdateChecker.

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

Для открытия базы необходимо ввести пароль 1.

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

Запуск программ из KeePass'а

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

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

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

Если программа является портативной и располагается рядом с портативным KeePass'ом, то воспользуемся заполнителем {APPDIR}, чтобы ссылка работала независимо от того, где находится каталог с обоими приложениями. Например: cmd://"{APPDIR}\..\TeamViewer\TeamViewer.exe" -i "{USERNAME}" -P "{PASSWORD}"

Если же программа установлена в системе, то нам понадобится, чтобы одна и та же ссылка работала на разных ПК, где пути к программам различны. В этом случае укажем вместо приложений их ярлыки. Создадим в каталоге программы папку LNK и поместим в нее ярлыки приложений. Пути к этим ярлыкам будут иметь вид "{APPDIR}\LNK\имя_ярлыка.lnk". Например: cmd://"{APPDIR}\LNK\TeamViewer.lnk" -i "{USERNAME}" -P "{PASSWORD}"

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

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

В окне Сервис → Параметры → Интеграция → Переопределение URL добавлена новая схема RDP.

В качестве переопределения можно указать непосредственно код из статьи на Хабре:

cmd://cmd /c "cmdkey /generic:TERMSRV/{URL:HOST} /user:{USERNAME} /pass:{PASSWORD} && mstsc /v:{BASE:RMVSCM} && cmdkey /delete:TERMSRV/{URL:HOST}".

Но в данной конфигурации этот код особым образом «обернут»:

{CMD:™{T-CONV:→cmd://cmd /c "cmdkey /generic:TERMSRV/{URL:HOST} /user:{USERNAME} /pass:{PASSWORD} && mstsc /v:{BASE:RMVSCM} && cmdkey /delete:TERMSRV/{URL:HOST}"→Raw→}™O=0,W=0™}

Это сделано, чтобы команда выполнялась переопределенной схемой cmd (если окажется, что она переопределена).

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

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

Если отметить запись определенного вида и нажать кнопку [R] на панели инструментов — программа запустится и в нее подставится пароль.

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

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

Если используется портативная VeraCrypt, см. замечание ниже.

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

Аналогично работает кнопка [R] для записей, созданных по шаблонам Telegram, Thunderbird, TeamViewer, AmmyyAdmin, Electrum. Например, при выборе записи AmmyyAdmin с одного нажатия кнопки [R] установится соединение с клиентом и наберется его пароль.

Универсальный шаблон такого типа — _Запуск_с_автонабором_, вы можете на его основе создавать записи для множества приложений. Создавая запись по этому шаблону, нужно указать запускаемое приложение в поле URL-ссылка и его оконный заголовок в поле R_Title: начало или конец заголовка. Возможно, понадобится также изменить последовательности автонабора, назначенные разным окнам (по умолчанию KeePass набирает пароль в окне, заголовок которого начинается или оканчивается значением поля R_Title). В поле R_Time указывается максимальное время, в течение которого KeePass будет ждать появления окна с заданным заголовком (по умолчанию 0, что означает бесконечное ожидание, которое можно прервать вручную).

Если программа при запуске дважды запрашивает ввод данных, пригодится шаблон _Запуск_с_двойным_автонабором_. В записях, созданных на его основе, должны быть заданы поля R_Title (заголовок первого окна для ввода данных), R_Title2 (заголовок второго окна для ввода данных), R_Time (продолжительность попыток активировать первое окно) и R_Time2 (продолжительность попыток активировать второе окно) и прописаны соответствующие ассоциации окон и последовательностей автонабора.

В редких случаях оконный заголовок (наподобие «Login») может совпасть с началом названия какой-нибудь веб-страницы, из-за чего запись приложения будет предлагаться при глобальном автонаборе на этой странице. Чтобы этого избежать, можно сделать запись просроченной.

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

Кнопка [R] создана триггером Добавить кнопки на панель инструментов:

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

Кнопка [R] многофункциональна, она осуществляет разные операции для разных записей. Выбор операции определяется разными условиями, в первую очередь, значением дополнительного поля R_Trigger.

Для запуска приложений используется скрипт Await.js, который в течение заданного времени пытается активировать окно с заданным заголовком. Заголовок передается в URI-кодировке в аргументе /win:, время в миллисекундах — в аргументе /time:. Если передать нулевое время, выводится диалог, позволяющий прервать ожидание целевого окна. Код скрипта:

var NamedArgs = WScript.Arguments.Named;
var WshShell = WScript.CreateObject("WScript.Shell");

if (NamedArgs.Exists("msg")) {
	WshShell.Popup(decodeURIComponent(NamedArgs("msg")), 0, "KeePass", 0);
} else if (NamedArgs.Exists("win")) {
	var win = decodeURIComponent(NamedArgs("win"));
	var time = NamedArgs.Exists("time") ? (+NamedArgs("time")) : 0;
	if (time > 0) {
		waitTime(win, time);
	} else {
		waitPopup(win);
	}
}

function waitTime(win, time) {
	var startTime = (new Date()).getTime();
	while (!WshShell.AppActivate(win)) {
		if ((new Date()).getTime() - startTime > time) {
			return;
		}
		WScript.Sleep(100);
	}
}

function waitPopup(win) {
	var popupProc = showPopup(win);
	while (!WshShell.AppActivate(win)) {
		if (popupProc.Status) {
			return;
		}
		WScript.Sleep(100);
	}
	popupProc.Terminate();
	WshShell.AppActivate(win);
}

function showPopup(win) {
	var msg = "Waiting for the window: \"" + win + "\"...\n\nPress OK to break.";
	return WshShell.Exec("%windir%\\System32\\wscript.exe \""
		+ WScript.ScriptFullName + "\" /msg:" + encodeURIComponent(msg));
}

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

Создан триггер Запуск с автонабором кнопкой [R]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условия:
    • Строка:
      • строка: {S:R_Trigger},
      • операция: Равно,
      • значение: R_Run_Activate_AutoType;
    • Строка:
      • строка: {CMD:™{T-CONV:/{URL}/Raw/}™O=0,W=0™},
      • операция: Равно,
      • значение: пусто;
  • действия:
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\Scripts\Await.js" /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто.

На основе шаблона _Запуск_с_автонабором_ создан шаблон _Запуск_с_двойным_автонабором_, в котором добавлены поля R_Time2 (со значением 0) и R_Title2, а значение поля R_Trigger изменено на R_Run_Activate_AutoType_2.

Создан триггер Запуск с двойным автонабором кнопкой [R]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условия:
    • Строка:
      • строка: {S:R_Trigger},
      • операция: Равно,
      • значение: R_Run_Activate_AutoType_2;
    • Строка:
      • строка: {CMD:™{T-CONV:/{URL}/Raw/}™O=0,W=0™},
      • операция: Равно,
      • значение: пусто;
  • действия:
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\Scripts\Await.js" /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\Scripts\Await.js" /win:{T-CONV:/{S:R_Title2}/Uri/} /time:{S:R_Time2},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто

На основе шаблона _Запуск_с_автонабором_ создан шаблон VeraCrypt. В нем изменено значение поля R_Time на {T-REPLACE-RX:!1{Password}!1.+!0!}, поля R_Title — на {UserName}, добавлено пустое поле Letter и пустые защищенные поля Secret и PIM, а в ассоциациях автонабора оставлено только окно *{S:R_Title} с последовательностью {CLEARFIELD}{Password}. Полю URL-ссылка задано значение:

cmd://"{APPDIR}\LNK\VeraCrypt.lnk" /q preferences /v {T-REPLACE-RX:!"{UserName}"!^\"(\\\\\?.*\})\\?\"$!$1\!}{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!}{T-REPLACE-RX:!{Password}!.+! /secureDesktop n!}

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

Открытие ссылок в альтернативных браузерах

Ссылки из записей KeePass'а могут открываться не только в браузере, установленном по умолчанию. Если выбрать запись и нажать кнопку [R], будет предложено открыть ссылку любым браузером из списка.

Выбор браузера для открытия ссылки из KeePass

Чтобы задать желаемый список браузеров, отредактируем файл OpenWith.txt в каталоге Scripts: удалим ненужные пункты, добавим свои. Каждый пункт задается парой строк: первая — название браузера, вторая — команда его запуска. Для наглядности пары можно отделять друг от друга любым количеством пустых строк. В команде путь к браузеру заключается в двойные кавычки, он может быть абсолютным или относительным, после него могут идти дополнительные аргументы командной строки. Например, если каталог с портативным браузером FirefoxPortable и каталог с KeePass'ом располагаются рядом, то пункт для открытия ссылки в приватном окне этого браузера задается парой строк:

  • Firefox Portable (инкогнито)
  • "..\..\FirefoxPortable\FirefoxPortable.exe" -private-window

Можно пользоваться переменными среды, в т.ч. обозначать переменной %CD% путь к каталогу Scripts. Например, пункт для открытия портативного Firefox'а в песочнице Comodo будет таким:

  • Firefox Portable (Comodo Sandbox)
  • "%PROGRAMFILES%\COMODO\COMODO Internet Security\virtkiosk.exe" -v "%CD%\..\..\FirefoxPortable\FirefoxPortable.exe"

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

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

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

Триггер, создающий кнопку [R], приведен выше.

Создан триггер Выбор браузера кнопкой [R], которые срабатывает, если запись имеет http- или https-ссылку и не имеет поля R_Trigger:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условия:
    • Строка:
      • строка: {S:R_Trigger},
      • операция: Начинается с,
      • значение: {;
    • Строка:
      • строка: {T-REPLACE-RX:!{URL}x!^(?i)(http|https)\:\/\/.*!!},
      • операция: Равно,
      • значение: пусто;
    • Строка:
      • строка: {CMD:™{T-CONV:!cmd://%windir%\System32\mshta.exe "{APPDIR}\Scripts\OpenWith.hta" {URL}!Raw!}™O=0,W=0™},
      • операция: Равно,
      • значение: пусто.

Отображением списка браузеров и запуском выбранного из них занимается скрипт OpenWith.hta:

<html>
	<head>
		<title>Выбор браузера</title>
		<hta:application
			id="oHTA"
			ApplicationName="BrowserChoice"
			Icon="..\KeePass.exe"
			InnerBorder="No"
			Navigable="Yes"
			Scroll="No"
			MaximizeButton="No"
			MinimizeButton="No" />
	</head>
	<body>
	</body>
	<script type="text/javascript">
(function () {
	var winWidth = 380;
	var winHeight = 300;
	window.resizeTo(winWidth, winHeight);
	try {
		var FSO = new ActiveXObject('Scripting.FileSystemObject');
		var WshShell = new ActiveXObject('WScript.Shell');
		var aParsedCmdLine = /^(?:"([^"]*)"|([^"\s]*))(?:\s+(.*))?$/.exec(oHTA.commandLine);
		var sScript = aParsedCmdLine[1] || aParsedCmdLine[2];
		var sArgs = aParsedCmdLine[3] || "";
		var hDir = FSO.GetFile(sScript).ParentFolder;
	} catch (e) {
		exit('Невозможно определить расположение скрипта');
	}
	
	try {
		WshShell.CurrentDirectory = FSO.GetAbsolutePathName(hDir);
		var ProcEnv = WshShell.Environment('process');
		ProcEnv('CD') = WshShell.CurrentDirectory;
		var sListName = FSO.GetBaseName(sScript) + '.txt';
		var textStream = FSO.OpenTextFile(sListName, 1, false, -1);
		var browsers = new Array();
		while (!textStream.AtEndOfStream) {
			var str = textStream.ReadLine();
			if (!str) continue;
			browsers.push({name: str, cmd: WshShell.ExpandEnvironmentStrings(textStream.ReadLine())});
		}
		ProcEnv.Remove('CD');
	} catch (e) {
		exit('Невозможно получить список браузеров из ' + sListName);
	} finally {
		textStream && textStream.close();
	}
	
	var container = document.createElement('div');
	var ul = document.createElement('ul');
	container.appendChild(ul);
	for (var i in browsers) {
		var li = document.createElement('li');
		ul.appendChild(li);
		li.appendChild(document.createTextNode(browsers[i].name));
		li.style.cursor = 'pointer';
		li.style.fontFamily = 'sans-serif';
		li.style.marginBottom = '1ex';
		li.style.color = 'navy';
		li.onmouseover = function() {
			this.style.textDecoration = 'underline';
		};
		li.onmouseout = function() {
			this.style.textDecoration = 'none';
		};
		(function(_i) {
			li.onclick = function() {
				var sCmd = browsers[_i].cmd + ' ' + sArgs;
				try {
					WshShell.Run(sCmd);
				} catch (e) {
					exit('Невозможно запустить:\n\n' + sCmd);
				}
				exit();
			}
		})(i);
	}
	var p = document.createElement('p');
	p.style.fontStyle = "oblique";
	p.style.whiteSpace = "pre-wrap";
	p.style.wordBreak = "break-all";
	p.appendChild(document.createTextNode(sArgs));
	container.appendChild(p);
	container.style.height = '100%';
	container.style.overflow = 'auto';
	document.body.appendChild(container);
	
	winHeight -= container.clientHeight;
	winHeight += container.scrollHeight;
	winHeight = winHeight < screen.availHeight  ? winHeight : screen.availHeight ;
	window.resizeTo(winWidth, winHeight);
	window.moveTo(screen.availWidth/2 - winWidth/2, screen.availHeight/2 - winHeight/2);
	
	document.body.onkeydown = function() {
		if (window.event && window.event.keyCode == 27) {
			exit();
		}
	};
})();

function exit(msg) {
	msg && window.alert(msg);
	window.close();
}
	</script>
</html>

Файл со списком браузеров OpenWith.txt должен иметь кодировку UTF-16 LE.

Множественные базы

Работа с несколькими базами

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

Новую базу можно создать с нуля (Файл → Новый...). Но чтобы для нее заработали все функции, предложенные в этих статьях, желательно сделать иначе: извлечь исходную базу из архива KeePass_Settings.zip, поместить в каталог DBases под каким-либо другим именем, открыть и сменить пароль.

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

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

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

Чтобы KeePass при запуске всегда открывал одну и ту же базу (независимо от того, какая использовалась последней), можно создать триггер с событием Приложение инициализировано и действием Открыть файл базы данных, указав в поле Файл путь к базе: {APPDIR}{ENV_DIRSEP}DBases{ENV_DIRSEP}имя_базы.kdbx.

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

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

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

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

  • события:
    • Сохранение файла базы данных, фильтр: {DB_PATH},
    • Закрытие файла базы данных (до сохранения), фильтр: {DB_PATH};
  • действие: Изменить состояние триггера:
    • имя: Автоматически активировать,
    • новое состояние: Выключить.

Второй триггер — Возвращать автоактивацию во включенное состояние — устроен аналогично, лишь новое состояние в нем Включить. Первый триггер расположен выше триггера Автоматически активировать, а второй ниже.

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

  • событие: Закрытие файла базы данных (после сохранения);
  • действие: Активировать базу данных:
    • файл: .
    • фильтр: Все

Проверка местоположения базы реализована во множестве триггеров условием, что строка {DB_DIR} равна {APPDIR}{ENV_DIRSEP}DBases. Вы можете удалить или изменить это условие в них, если храните свои базы не в подкаталоге DBases.

Открытие баз друг из друга

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

Чтобы открывать дополнительную базу, создадим запись по шаблону База KeePass. В поле Пароль введем мастер-пароль этой базы, а если база защищена еще и ключевым файлом, то укажем путь к нему в дополнительном поле KeyFile. В поле Логин введем имя этой базы без расширения.

Если каталог дополнительной базы отличается от каталога текущей или ее расширение отличается от .kdbx, то запишем в поле URL-ссылка ее путь (желательно с префиксом kdbx://). Если для доступа к файлу базы нужна авторизация, то укажем учетные данные в полях ConnectionLogin и ConnectionPassword.

Вместо пути к ключевому файлу можно поместить в поле KeyFile его содержимое, представленное в виде data: URL. Например, файл, состоящий из ASCII-строки My cool key file, запишется как data:,My%20cool%20key%20file или data:;base64,TXkgY29vbCBrZXkgZmlsZQ==. Кроме того, в текущей версии KeePass'а можно вместо содержимого файла использовать его хеш SHA-256.

Теперь достаточно выбрать соответствующую запись, нажать кнопку [R] — и база откроется в новой вкладке. Как вариант, если ссылка имеет префикс kdbx://, можно не нажимать кнопку [R], а сделать двойной клик по полю URL — база откроется в новом экземпляре KeePass'а.

Открытие двух баз в KeePass

Более того, дополнительная база может открываться автоматически, одновременно с основной. Для этого изменим в соответствующей записи название на <AutoOpen> и оставим нетронутой последнюю строку в поле заметок.

Если понадобится автоматически открывать еще одну-две базы, создайте аналогично записи <AutoOpen1> и/или <AutoOpen2>.

Если какая-либо база является «вспомогательной» — используется только для открытия других баз и должна после этого закрываться, — добавьте в нее пустую запись с названием <AutoClose>.

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

В базе создан шаблон База KeePass: в качестве ссылки указана строка kdbx://{DB_DIR}{ENV_DIRSEP}{USERNAME}.kdbx, добавлено поле R_Trigger со значением R_Open_KeePass_Database (оно определяет действие кнопки [R]), пустые поля KeyFile, ConnectionLogin и ConnectionPassword, а в поле заметок добавлена строка $KeyFile={T-CONV:/{S:KeyFile}/Uri/} $ConnectionLogin={T-CONV:/{S:ConnectionLogin}/Uri/} $ConnectionPassword={T-CONV:/{S:ConnectionPassword}/Uri/}.

Триггер, создающий кнопку [R], приведен выше.

Создан триггер Открывать дополнительную базу кнопкой [R]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие: Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Open_KeePass_Database;
  • действие: Открыть файл базы данных:
    • файл/ссылка: {T-REPLACE-RX:!{URL}!^kdbx\:\/\/(.*)!$1!},
    • подключение — логин: {S:ConnectionLogin},
    • подключение — пароль: {S:ConnectionPassword},
    • пароль: {PASSWORD},
    • ключевой файл: {S:KeyFile}.

Чтобы база открывалась также двойным кликом по ссылке, в окне Сервис → Параметры → Интеграция → Переопределение URL добавлена схема kdbx со следующим переопределением:

cmd://{T-CONV:`{T-REPLACE-RX:#{T-REPLACE-RX:!?{APPDIR}{ENV_DIRSEP}KeePass.exe?{S:AppPath}?!.*\?(([^\?]*)exe)\?.*!$1?$2!}config.xml?{S:Cfg}?#([^\?]*).*\?([^\?]*xml)\?.*#"$1" -cfg-local:"$2"#} "{BASE:RMVSCM}" {T-REPLACE-RX:#{PASSWORD}#.+#-pw-enc:"{PASSWORD_ENC}"#} {T-REPLACE-RX:#-keyfile:"{S:KeyFile}"#^.{10}[\{\"].*##} {T-REPLACE-RX:#-iousername:"{S:ConnectionLogin}" -iopassword:"{S:ConnectionPassword}" -ioiscomplete#^.{13}[\{\"].*##} {T-REPLACE-RX:#{S:Args}#^\{.*##}`Raw`}

Этот код означает запуск KeePass'а с передачей в командной строке расположения базы и других данных. Если пароль не пуст, то он шифруется учетными данными Windows и передается в командной строке. Если существует и не пусто поле KeyFile — передается путь к ключевому файлу. Если существует и не пусто поле ConnectionLogin — передаются учетные данные подключения. Если существует и не пусто поле AppPath — используется указанный в нем KeePass, а не текущий. Если существует и не пусто поле Cfg — применяется указанное в нем расположение пользовательской конфигурации, иначе используется конфигурация в каталоге запускаемого KeePass'а (подробнее о конфигурациях в другой статье). Если имеется поле Args — содержащиеся в нем аргументы добавляются к командной строке.

Оборачивание кода в {T-CONV:`...`Raw`} устраняет проблему с утроением кавычек в переопределениях URL.

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

  • событие: Открыт файл базы данных, фильтр: пусто;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
  • действия:
    • Открыть файл базы данных:
      • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:<AutoOpen>}!^(?:kdbx\:\/\/|\{.*)!!},
      • подключение — логин: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen>};(?:[\s\S]*\$ConnectionLogin=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • подключение — пароль: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen>};(?:[\s\S]*\$ConnectionPassword=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • пароль: {REF:P@T:<AutoOpen>},
      • ключевой файл: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen>};(?:[\s\S]*\$KeyFile=(\S*))?[\s\S]*;$1;}/Uri-Dec/};
    • Активировать базу данных с фильтром Выполняющая триггер;
    • Открыть файл базы данных:
      • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:<AutoOpen1>}!^(?:kdbx\:\/\/|\{.*)!!},
      • подключение — логин: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen1>};(?:[\s\S]*\$ConnectionLogin=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • подключение — пароль: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen1>};(?:[\s\S]*\$ConnectionPassword=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • пароль: {REF:P@T:<AutoOpen1>},
      • ключевой файл: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen1>};(?:[\s\S]*\$KeyFile=(\S*))?[\s\S]*;$1;}/Uri-Dec/};
    • Активировать базу данных с фильтром Выполняющая триггер;
    • Открыть файл базы данных:
      • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:<AutoOpen2>}!^(?:kdbx\:\/\/|\{.*)!!},
      • подключение — логин: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen2>};(?:[\s\S]*\$ConnectionLogin=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • подключение — пароль: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen2>};(?:[\s\S]*\$ConnectionPassword=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
      • пароль: {REF:P@T:<AutoOpen2>},
      • ключевой файл: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoOpen2>};(?:[\s\S]*\$KeyFile=(\S*))?[\s\S]*;$1;}/Uri-Dec/};
    • Активировать базу данных с фильтром Выполняющая триггер;

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

Чтобы «вспомогательная» база сама закрывалась, под триггерами автоокрытия создан триггер Автоматически закрывать базу, содержащую запись <AutoClose>:

  • событие: Открыт файл базы данных, фильтр: пусто;
  • условия: Строка:
    • строка: {REF:T@T:<AutoClose>},
    • операция: Равно,
    • значение: <AutoClose>;
  • действия:
    • Активировать базу данных с фильтром Выполняющая триггер;
    • Закрыть текущую базу данных.

Открытие базы без ввода пароля

Существуют разные способы открывать базу, не вводя мастер-пароль. Например, с использованием базы-стартера:

  • скопируем исходную базу из архива KeePass_Settings.zip в папку DBases под именем Starter.kdbx;
  • откроем ее и изменим мастер-пароль: выберем шифрование только учетными данными Windows;
  • создадим в этой базе запись по шаблону База KeePass:
    • Название<AutoOpen>,
    • Логин — имя основной базы без расширения, например, Database,
    • Пароль — ее пароль,
    • поле KeyFile — путь к ключевому файлу, если используется;
  • создадим пустую запись с названием <AutoClose>;
  • включим опцию Сервис → Триггеры → Автоматически открывать дополнительную базу #1 → Разрешен;
  • добавим новый триггер Автоматически открывать базу-стартер:
    • событие: Приложение инициализировано;
    • действие: Открыть файл базы данных:
      • файл: {APPDIR}{ENV_DIRSEP}DBases{ENV_DIRSEP}Starter.kdbx,
      • опция Учетная запись пользователя Windows включена.

Хотя при этой настройке мастер-пароль и не хранится в открытом виде, необходимо учитывать, что для завладения им злоумышленнику достаточно доступа к учетной записи пользователя и к файлу Starter.kdbx. Поэтому теряет смысл блокирование базы — можно отключить все опции автоблокировки на вкладке Параметры → Безопасность.

Но в случае смены учетной записи, смены ПК или переустановки ОС база-стартер не откроется — понадобится ввести мастер-пароль (поэтому его следует помнить!).

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

Манипуляции с данными

Ручная синхронизация базы

В предыдущей статье рассмотрена автоматическая синхронизация базы с облачным хранилищем. Возможно, для перестраховки вы пожелаете дополнительно синхронизировать базу с каким-нибудь другим хранилищем, причем делать это не постоянно, а только в случае важных ее изменений. Для этого понадобится поместить копию базы в это хранилище и создать запись: указать в ссылке расположение базы, в логине и пароле — учетные данные подключения к хранилищу (FTP/WebDAV), а также добавить поле R_Trigger со значением R_Sync . В результате синхронизация запустится, если отметить эту запись и нажать кнопку [R].

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

Триггер, создающий кнопку [R], приведен выше.

Создан триггер Синхронизация кнопкой [R]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие: Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Sync;
  • действие: Синхронизировать текущую базу с файлом/ссылкой:
    • файл/ссылка: {T-REPLACE-RX:!{URL}!^kdbx\:\/\/(.*)!$1!},
    • подключение — логин: {USERNAME},
    • подключение — пароль: {PASSWORD}.

Просмотр изменений и сравнение баз

Иногда нужно выяснить, какие изменения вносились в базу и когда.

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

Более полные данные об изменениях дает сравнение базы с ее резервной копией. Для этого вручную экспортируем обе версии базы в формат Настраиваемый HTML-файл, причем в окне экспорта на вкладке Макет выберем вариант Детали и нажмем ссылку Выбрать все.

Для сравнения получившихся файлов придется применить какой-нибудь сторонний инструмент, например, TotalCommander или Notepad++. По завершении необходимо безвозвратно (!) удалить эти файлы, например, с помощью SDelete.

Если такие операции приходится выполнять часто, можно их облегчить, разрешив экспорт без пароля (Параметры → Политика), а также реализовав открытие резервных копий базы без пароля. Для этого понадобится создать запись по шаблону База KeePass, указать в ней мастер-пароль и/или ключевой файл, а ссылкой сделать код kdbx://{PICKCHARS:Title:Hide=False}. Тогда по нажатию кнопки [R] появится окно, запрашивающее путь к базе, и указанная база откроется в новой вкладке. Используемые здесь триггеры и шаблон рассмотрены выше

Дублирование записей

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

Если вы хотите, чтобы изменение логина/пароля исходной записи автоматически отражалось на ее копии, включите в диалоге дублирования опцию Заменять логины и пароли ссылками. Если хотите, чтобы в копии отражалось также изменение URL, замените в ней URL кодом {REF:A@I:идентификатор} (идентификатор находится на вкладке Свойства исходной записи).

Если нужно, чтобы в копии отражалось изменение дополнительного поля, например, Secret, добавьте к Заметкам исходной записи строку $Secret={T-CONV:/{S:Secret}/Uri/}, а в копии замените значение поля Secret на {T-CONV:/{T-REPLACE-RX:#{REF:N@I:идентификатор}#(?:[\s\S]*\$Secret=(\S*))?[\s\S]*#$1#}/Uri-Dec/}. Аналогичное можно проделать и для нескольких полей. Разумеется, выделенные фрагменты кода нужно будет заменить своими.

Перенос записей в другую базу

Записи можно копировать в буфер обмена и вставлять в другую базу. Предварительно понадобится разрешить эту операцию: включить опцию Параметры → Политика → Копирование записей целиком и перезапустить KeePass.

Выделим одну или несколько записей (можно из разных групп, с помощью поиска). Нажмем Ctrl+Shift+C, перейдем в другую базу и нажмем Ctrl+Shift+V — готово. Если нужно, можно удалить записи из исходной базы.

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

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

Перенос групп в другую базу

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

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

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

Поэтому рекомендую придерживаться такого алгоритма:

  • создать в исходной базе группу export и вложенную в нее группу subexport;
  • поместить в группу subexport группы и записи, которые нужно перенести;
  • через контекстное меню экспортировать группу export в формате KeePass KDBX (2.x);
  • импортировать полученный файл в целевую базу:
    • ввести мастер-пароль исходной базы,
    • выбрать метод Новые идентификаторы (поскольку мы сохраняем структуру);
  • в целевой базе расформировать и удалить группы export и subexport (они разделятся);
  • восстановить цвет целевой базы (Файл → Параметры БД);
  • удалить экспортированный файл (не обязательно безвозвратно).

Благодаря выбору формата KeePass KDBX (2.x), экспортируемый фрагмент шифруется, как исходная база. Таким образом, конфиденциальные данные не утекают ни в буфер обмена, ни на диск.

Экспорт базы триггерами

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

На основе шаблона Экспортируемая база KeePass можно создавать записи, для которых по нажатию кнопки [R] будет выполняться экспорт. В качестве ссылки указывается путь для экспорта: например, строка {DB_DIR}{ENV_DIRSEP}{DB_BASENAME}.exported означает, что база будет экспортирована в тот же каталог и с тем же именем, что у текущей, но получит расширение exported. Формат определяется полем Format, допускаются значения:

  • KeePass KDBX (2.x) — зашифрованная база для KeePass 2.x;
  • KeePass KDB (1.x) — зашифрованная база для KeePass 1.x;
  • KeePass XML (2.x) — расшифрованная база для KeePass 2.x;
  • KeePass CSV (1.x) — расшифрованная база для KeePass 1.x.
Некоторые ограничения экспорта в формат KeePass KDB (1.x)
  • Для экспорта в KDB необходимо включить опцию Безопасность → Помнить зашифрованный мастер-пароль базы, пока она открыта;
  • у каждой записи остается не более одного прикрепленного файла;
  • не сохраняются пользовательские значки;
  • функция трансформации ключа Argon2 заменяется на AES-KDF с числом итераций по умолчанию;
  • при использовании дополнительных криптопровайдеров (например, после разблокировки плагином KeePassQuickUnlock) результатом экспорта оказывается пустой файл.

По желанию можно экспортировать только записи с определенным тегом, указав его в поле Tag. Также можно ограничить записи определенной группой, указав путь к ней в поле Group: без корневой группы, начиная с произвольного разделителя, например, /Почта/Mail.ru.

Триггеры способны экспортировать базу не только в локальный файл, но и в удаленный, однако есть проблема с WebDAV: учетные данные придется хранить в конфигурации в открытом виде. Можно использовать протокол FTP: указать в поле URL-ссылка FTP-адрес базы, в поля Логин и Пароль — учетные данные подключения. Либо можно использовать особый WebDAV с доступом по ссылке, в этом случае логин и пароль оставляются пустыми.

Если требуется выполнять экспорт автоматически при каждом закрытии базы, переименуйте запись в <AutoExport> и включите опцию Сервис → Триггеры → Автоматически экспортировать → Разрешен. При этом первой строкой Заметок должен быть адрес какой-либо страницы (по ней будет проверяться доступность хранилища), последнюю строку нужно оставить неизменной.

Обратим внимание, что триггеры позволяют экспортировать базу в расшифрованном формате, причем без ввода пароля (несмотря на отключенную опцию Политика → Экспорт — без ключа). Если вы опасаетесь, что кто-либо получит доступ к разблокированной программе и украдет сразу всю базу, но при этом хотите пользоваться экспортом, то отключите опцию Политика → Триггеры, а в окне Сервис → Триггеры → Экспорт кнопкой [R] → Действия → Экспорт текущей базы данных измените поле Формат файла на KeePass KDBX (2.x) или KeePass KDB (1.x); аналогично для триггера Автоматически экспортировать. В результате триггеры будут способны экспортировать только в зашифрованном виде и их будет запрещено перенастраивать, но останется возможность ручного экспорта в любой формат с вводом мастер-пароля.

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

Создан шаблон Экспортируемая база KeePass, в который добавлено поле R_Trigger со значением R_Export и пустые поля Format, Group и Tag, а в конец Заметок записана строка $Format={T-CONV:/{S:Format}/Uri/} $Group={T-CONV:/{S:Group}/Uri/} $Tag={T-CONV:/{S:Tag}/Uri/}.

Триггер, создающий кнопку [R], приведен выше.

Для работы с этим шаблоном создан триггер Экспорт кнопкой [R]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Export;
  • действие: Экспорт текущей базы данных:
    • файл/ссылка: {T-REPLACE-RX:;{URL};^(\w+\:\/\/);$1{T-REPLACE-RX:/{T-CONV:%{USERNAME}%Uri%}/(.+)/$1{T-REPLACE-RX:,{T-CONV:%{PASSWORD}%Uri%},(.+),:$1,}@/};},
    • формат файла: {S:Format},
    • фильтр — группа: {S:Group},
    • фильтр — тег: {S:Tag}.

Как видим, в случае экспорта нет полей для учетных данных подключения к хранилищу. Поэтому приходится вместо WebDAV использовать FTP, так как FTP позволяет передать учетные данные внутри ссылки.

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

  • событие: Закрытие файла базы данных (после сохранения), фильтр: пусто;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • Строка:
      • строка: {REF:T@T:<AutoExport>},
      • операция: Равно,
      • значение: <AutoExport>;
    • Существует файл: {T-REPLACE-RX:/{REF:N@T:<AutoExport>}/\n[\s\S]*//}
  • действие: Экспорт текущей базы данных:
    • файл/ссылка: {T-REPLACE-RX:;{REF:A@T:<AutoExport>};^(\w+\:\/\/);$1{T-REPLACE-RX:/{T-CONV:%{REF:U@T:<AutoExport>}%Uri%}/(.+)/$1{T-REPLACE-RX:,{T-CONV:%{REF:P@T:<AutoExport>}%Uri%},(.+),:$1,}@/};},
    • формат файла: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoExport>};(?:[\s\S]*\$Format=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
    • фильтр — группа: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoExport>};(?:[\s\S]*\$Group=(\S*))?[\s\S]*;$1;}/Uri-Dec/},
    • фильтр — тег: {T-CONV:/{T-REPLACE-RX:;{REF:N@T:<AutoExport>};(?:[\s\S]*\$Tag=(\S*))?[\s\S]*;$1;}/Uri-Dec/}.

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

Защита KeePass'а

Опасность доступа к процессу и памяти KeePass'а

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

Но если злоумышленник может лишь читать память KeePass'а (например, изучать дамп) — защищены ли наши данные?

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

Мастер-пароль базы, его хеш и пароли записей защищены в памяти программы DPAPI-шифрованием, ключом от которого владеет только операционная система. Она будет отдавать расшифрованные данные KeePass'у, если он попросит, но не сторонним процессам. Инструменты KeeThief и LaZagne извлекают мастер-пароль за счет того, что не просто читают, а изменяют память KeePass'а: внедряют туда код, который получает расшифрованные данные от имени KeePass'а.

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

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

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

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

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

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

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

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

Утечкой грозит также отправка дампов памяти разработчикам различного ПО с целью отладки. К счастью, KeePass отключает автоматическую отправку своих аварийных дампов в Microsoft (хотя не само их создание).

В предлагаемой настройке используются некоторые защитные меры:

  • включена DACL-защита;
  • предусмотрена возможность работы KeePass'а с правами администратора;
  • отключена опция Безопасность → Помнить зашифрованный мастер-пароль базы, пока она открыта. В результате инструменты наподобие KeeThief не могут извлечь мастер-пароль (хотя теоретически могут тем же способом извлечь его хеш и расшифровать им базу). Однако из-за этого невозможны некоторые специфические операции, вроде экспорта в формат KDB.

Дополнительно можно предпринять какие-либо из этих мер:

  • включить опцию Всегда выходить вместо блокирования программы. Тогда при блокировке базы будет выгружаться и сам KeePass, но станет невозможной быстрая разблокировка.
  • в системном реестре создать раздел HKLM\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\KeePass.exe\ и в нем параметр DumpCount типа DWORD со значением 0. Это отключает создание в каталоге %LOCALAPPDATA%\CrashDumps дампа KeePass'а при его аварийном завершении.

DACL-защита

В предлагаемой конфигурации включена DACL-защита, которая запрещает доступ к процессу KeePass'а обычным ограниченным программам. При этом не играет роли, запущен ли сам KeePass с обычными правами или с правами администратора. (Конечно, предполагается, что UAC включен.)

Удостоверимся, что защита работает. Запустим KeePass и, например, Process Hacker — обе программы с обычными правами, не от администратора. Попытаемся прочитать память KeePass'а и убедимся, что это запрещено.

Тест DACL-защиты в KeePass

К сожалению, этот запрет не распространяется на программы, выполняющиеся от администратора. Даже будучи изолированными в песочнице Comodo, они смогут читать память KeePass'а. С другой стороны, при изоляции таких программ в песочнице Sandboxie, по экспериментам, чтение памяти защищенного KeePass'а им все-таки запрещается.

В то же время сам разработчик не рекомендует включать DACL-защиту, в частности, из-за угрозы конфликта с антивирусами или средствами модификации пользовательского интерфейса. Например, в окне KeePass'а не сможет работать Punto Switcher или экранный диктор. Однако серьезных проблем при использовании этой защиты вместе с Comodo Internet Security мной замечено не было.

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

Отредактирован файл KeePass.config.xml: после строки <Security> вставлена <ProtectProcessWithDacl>true</ProtectProcessWithDacl>.

Включение DACL-защиты в KeePass

Если DACL-защита приведет к проблемам, можно удалить эту строку из конфигурации.

Работа KeePass'а с правами администратора

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

Дополнительный эффект этой защиты — KeePass сможет вводить пароли в программы, выполняющиеся с правами администратора, например, в портативную VeraCrypt.

Чтобы KeePass всегда требовал повышение прав, откроем свойства файла KeePass.exe и отметим на вкладке Совместимость опцию Выполнять эту программу от имени администратора.

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

Важное преимущество предлагаемой настройки — при открытии ссылок из записей KeePass'а приложения запускаются с обычными ограниченными правами. Это относится и к запуску браузера http- и https-ссылками, и к запуску разнообразных приложений cmd-ссылками, и к открытию удаленного рабочего стола RDP-ссылкой.

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

Когда браузер может запуститься от администратора

К сожалению, есть особые случаи, когда KeePass все же запускает браузер с правами администратора:

  • открытие ссылок в альтернативных браузерах через контекстное меню записей или через меню в панели инструментов;
    • решение: открывать альтернативные браузеры кнопкой [R] ;
  • клик в тексте (в заметках или в прикрепленном файле) по ссылке без протокола, например, www.comss.ru;
    • решение: указывать в тексте протокол, например, http://www.comss.ru или https://www.comss.ru;

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

Пример с портативной VeraCrypt

Если VeraCrypt портативная, а не установленная в системе, то ей нужны права администратора. Поэтому, чтобы монтировать тома кнопкой [R], понадобится изменить префикс ссылки. Кроме того, если портативная VeraCrypt расположена рядом с KeePass'ом, то лучше указать путь не к ярлыку, а к ней самой. Ссылка примет вид:

cmdDirect://"{APPDIR}\..\VeraCrypt\VeraCrypt.exe" /q preferences /v {T-REPLACE-RX:!"{UserName}"!^\"(\\\\\?.*\})\\?\"$!$1\!}{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!}{T-REPLACE-RX:!{Password}!.+! /secureDesktop n!}

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

Для ограничения прав браузера использована особенность проводника — он всегда выполняется с ограниченными правами (если только не произведена специальная настройка).

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

Сложнее устроена обработка схемы cmd. Для нее добавлено переопределение cmd://%windir%\System32\wscript.exe "{APPDIR}\Scripts\Run.js" /cmd:{T-CONV:!{BASE:RMVSCM}!Uri!}, означающаее запуск скрипта Run.js с аргументом командной строки /cmd:, содержащим ссылку в URI-кодировке. Если KeePass имеет права администратора, то скрипт извлекает из ссылки команду, сохраняет ее во временный файл, создает временный ярлык на самого себя, перезапускается через проводник, выполняет команду, а затем затирает ее в файле. Если KeePass же выполняется с обычными правами, то скрипт запускает команду непосредственно, без создания временных файлов. Код скрипта:

var NamedArgs = WScript.Arguments.Named;
var WshShell = WScript.CreateObject("WScript.Shell");
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var AppDir = FSO.GetAbsolutePathName(FSO.GetFile(WScript.ScriptFullName).ParentFolder.ParentFolder);

if (NamedArgs.Exists("cmd")) {
	run(decodeURIComponent(NamedArgs("cmd")), NamedArgs.Exists("directly"));
} else if (NamedArgs.Exists("tmp")) {
	runErase(NamedArgs("tmp"));
}

function run(cmdLine, directly) {
	if (!directly && isElevated()) {
		runRestricted(cmdLine);
	} else {
		runDirectly(cmdLine);
	}
}

function runErase(tmpDir) {
	var cmdPath = tmpDir + "\\cmd.txt";
	try {
		try {
			var stream = FSO.OpenTextFile(cmdPath, 1, false, -1);
			var cmdLine = stream.ReadLine();
		} finally {
			stream && stream.Close();
		}
		runDirectly(cmdLine);
	} finally {
		wipeContent(cmdPath);
		FSO.DeleteFolder(tmpDir, true);
	}
}

function runRestricted(cmdLine) {
	if (/^(?:"[^"]+"|[^"\s]+)$/.test(cmdLine)) {
		WshShell.Run('%windir%\\explorer.exe ' + cmdLine);
	} else {
		runRestrictedWithArgs(cmdLine);
	}
}

function runRestrictedWithArgs(cmdLine) {
	var tmpDir = createTmpDir(WshShell.ExpandEnvironmentStrings("%TMP%\\KeePassExec"));
	try {
		var stream = FSO.CreateTextFile(tmpDir + "\\cmd.txt", false, true);
		stream.Write(cmdLine);
	} finally {
		stream && stream.Close();
	}
	var lnkPath = tmpDir + "\\cmd.lnk";
	var lnk = WshShell.CreateShortcut(lnkPath);
	lnk.TargetPath = WScript.FullName;
	lnk.Arguments = '"' + WScript.ScriptFullName + '" /tmp:"' + tmpDir + '"';
	lnk.WorkingDirectory = AppDir;
	lnk.Save();
	WshShell.Run('%windir%\\explorer.exe "' + lnkPath + '"');
}

function createTmpDir(basicPath) {
	for (var suffix = 0; ; suffix++) {
		try {
			var tmpDir = basicPath + suffix;
			FSO.CreateFolder(tmpDir);
			return tmpDir;
		} catch (e) {
		}
	}
}

function wipeContent(path) {
	var size = FSO.GetFile(path).Size;
	try {
		var stream = FSO.OpenTextFile(path, 2, false, -1);
		stream.WriteBlankLines((size + 3) >> 2);
	} finally {
		stream && stream.Close();
	}
}

function isElevated() {
	try {
		WshShell.RegRead("HKEY_USERS\\S-1-5-19\\");
		return true;
	} catch (e) {
		return false;
	}
}

function runDirectly(cmdLine) {
	removeEnvironmentVariables();
	WshShell.Run(cmdLine);
}

function removeEnvironmentVariables() {
	for (var env = WshShell.Environment("process"), en = new Enumerator(env);
			!en.atEnd(); en.moveNext()) {
		var aName = /^KeePass_[^\=]*/i.exec(en.item());
		aName && env.Remove(aName[0]);
	}
}

Для непосредственного запуска программ из KeePass'а без понижения их прав добавлена схема cmdDirect с таким переопределением:

cmd://%windir%\System32\wscript.exe "{APPDIR}\Scripts\Run.js" /cmd:{T-CONV:!{BASE:RMVSCM}!Uri!} /directly

Добавленный здесь аргумент /directly предписывает скрипту запустить команду непосредственно.

Понижение прав при переопределении URL

Вы можете добавлять в KeePass свои переопределения URL. Однако если назначить схеме новая_схема переопределение cmd://команда, то ссылки вида новая_схема://ссылка будут открываться от администратора. Чтобы они открывались с ограниченными правами, можно применить такой трюк: добавить в начало переопределения код {CMD:™{T-CONV:→, а в конец — →Raw→}™O=0,W=0™}, т.е. записать {CMD:™{T-CONV:→cmd://команда→Raw→}™O=0,W=0™}. Тогда при открытии ссылки будет применяться переопределенная схема cmd, понижающая права. Например, этот прием использован в схеме RDP.

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

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

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

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

Откроем настройку CIS на вкладке Репутация файлов → Список файлов и добавим скрипты из папки Scripts как доверенные.

Перейдем на вкладку Репутация файлов → Группы файлов, создадим группу KeePass и добавим в нее папку, в которой находится «секретная», в нашем примере это C:\KeePass\*.

Откроем вкладку HIPS → Защищенные объекты → Защищенные данные и добавим в список ту же папку, а также папку с ключевым файлом. Теперь эти папки будут выглядеть пустыми для программ, выполняющихся в виртуальной среде Comodo Sandbox.

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

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

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

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

  • в пункте Защищенные файлы и папки нажмем Изменить и добавим на вкладку Разрешенные группу KeePass;
  • выберем действие Разрешить в пунктах Оконные сообщения, Межпроцессный доступ к памяти, DNS-запросы, Монитор, Диск и Клавиатура.

Добавим правило HIPS для всех exe-файлов, относящихся к KeePass'у (в нашем случае C:\KeePass\*.exe), снова выберем вариант Использовать собственный набор правил, в пункте Запуск приложений выберем действие Блокировать, нажмем Изменить и добавим на вкладку Разрешенные:

  • группу KeePass,
  • %windir%\explorer.exe,
  • %windir%\Microsoft.NET\*,
  • %windir%\System32\cscript.exe,
  • %windir%\System32\wscript.exe,
  • %windir%\System32\ping.exe.

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

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

Разное

Временное отключение автоматики

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

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

Однако есть совсем простой способ — отключить импровизированный чекбокс [v] A на панели инструментов. Этим чекбоксом отключается сразу несколько автоматических операций: сохранение, синхронизация, бэкап, открытие, закрытие и экспорт баз. При этом будет работать ручной вызов этих и других операций кнопками. Включение чекбокса восстанавливает прежнее состояние триггеров. Можно не включать его — прежнее состояние все равно восстановится после перезапуска KeePass'а.

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

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

Создан триггер Включать автоматику:

  • события:
    • Приложение запущено и готово,
    • Нажата пользовательская кнопка с идентификатором btn_TurnAutoOn;
  • действия:
    • Убрать кнопку с идентификатором btn_TurnAutoOn,
    • Изменить состояние триггера:
      • имя: Автоматически синхронизировать,
      • новое состояние: Включить;
    • аналогично для других триггеров автоматических операций;
    • Добавить кнопку на панель инструментов:
      • идентификатор: btn_TurnAutoOff,
      • имя: [v] A,
      • описание: Автоматика включена.

Создан триггер Отключать автоматику:

  • событие: Нажата пользовательская кнопка с идентификатором btn_TurnAutoOff;
  • действия:
    • Убрать кнопку с идентификатором btn_TurnAutoOff,
    • Изменить состояние триггера:
      • имя: Автоматически синхронизировать,
      • новое состояние: Выключить;
    • аналогично для других триггеров автоматических операций;
    • Добавить кнопку на панель инструментов:
      • идентификатор: btn_TurnAutoOn,
      • имя: [  ] A,
      • описание: Автоматика отключена.

KeePass как менеджер закладок

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

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

Группа закладок в KeePass

Однако удобнее использовать для закладок вообще отдельную базу и отдельно настроенный экземпляр KeePass'а. Для этого в папке KeePass_B заготовлена конфигурация KeePass.config.xml. Распакуем в эту папку архив с программой KeePass 2.x Portable, в подпапку Languagesперевод, а в подпапку Plugins поместим файлы WebAutoType.plgx, KeePassFaviconDownloader.plgx и TCATO_Placeholder.plgx.

Также в папке DBases заготовлена база Bookmarks.kdbx, а в основной базе Database.kdbx в группе bookmarks сделана специальная запись База закладок. Сделаем двойной клик по ее полю URL-ссылка — база Bookmarks.kdbx откроется в отдельном экземпляре KeePass'а.

Сгенерируем новый пароль в записи База закладок и назначим его базе Bookmarks.kdbx (старый пароль: 1). Также известным нам способом наладим в базе Bookmarks.kdbx облачную синхронизацию.

Заметим, что KeePass, где открывается база Bookmarks.kdbx, не содержит лишних столбцов и в целом настроен мягче: без автоблокировки и других защитных мер.

Чтобы добавить закладку в базу Bookmarks.kdbx, будет достаточно нажать Ctr+Alt+Shift+Q — и появится окно создания записи с уже подставленным заголовком, а поле URL-ссылка будет представлять собой меню, где можно выбрать детальность адреса. Никакой настройки браузеров не потребуется. (Ограничения: не поддерживаются браузеры наподобие K-Meleon и Pale Moon, а для Edge подхватывается лишь адрес.)

Добавление закладки в KeePass

Чтобы активировать свернутое окно KeePass'а с закладками, достаточно нажать Ctr+Shift+Q (кстати, курсор сразу станет в поле поиска). Открыть закладку можно двойным кликом по ссылке, а можно нажать кнопку [R] и выбрать желаемый браузер. Кроме того, можно поставить курсор в адресную строку и выполнить автонабор.

Можно перенести закладки из браузера: сначала экспортировать их в HTML-файл, а затем KeePass'ом импортировать его в базу.

Возможен и обратный перенос закладок из KeePass'а в браузер: экспортировать базу из KeePass'а в HTML-файл и импортировать этот файл браузером.

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

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

В папке DBases создана база Bookmarks.kdbx. В ее корневой группе изменен автонабор: {URL}.

В основной базе Database.kdbx создана запись по шаблону База KeePass:

  • название: База закладок,
  • логин: Bookmarks,
  • пароль: пароль базы Bookmarks.kdbx,
  • URL-ссылка: kdbx://{DB_DIR}{ENV_DIRSEP}{USERNAME}.kdbx,
  • добавлено поле AppPath: {APPDIR}{ENV_DIRSEP}KeePass_B{ENV_DIRSEP}KeePass.exe.

Как говорилось выше, в окне Сервис → Параметры → Интеграция → Переопределение URL для схемы kdbx добавлено переопределение:

cmd://{T-CONV:`{T-REPLACE-RX:#{T-REPLACE-RX:!?{APPDIR}{ENV_DIRSEP}KeePass.exe?{S:AppPath}?!.*\?(([^\?]*)exe)\?.*!$1?$2!}config.xml?{S:Cfg}?#([^\?]*).*\?([^\?]*xml)\?.*#"$1" -cfg-local:"$2"#} "{BASE:RMVSCM}" {T-REPLACE-RX:#{PASSWORD}#.+#-pw-enc:"{PASSWORD_ENC}"#} {T-REPLACE-RX:#-keyfile:"{S:KeyFile}"#^.{10}[\{\"].*##} {T-REPLACE-RX:#-iousername:"{S:ConnectionLogin}" -iopassword:"{S:ConnectionPassword}" -ioiscomplete#^.{13}[\{\"].*##} {T-REPLACE-RX:#{S:Args}#^\{.*##}`Raw`}

В папке программы создана подпапка KeePass_B, в нее помещен отдельный экземпляр KeePass'а, а также файл конфигурации KeePass.config.xml.

Чтобы скорректировать пути к базам, скриптам и ярлыкам, файл KeePass.config.xml отредактирован: код {APPDIR} заменен на {T-REPLACE-RX::{APPDIR}:.{10}$::} везде, кроме узла PluginCachePath.

KeePass в папке KeePass_B запущен и настроен, в частности:

  • отключены столбцы логина, пароля и заметок;
  • задана нулевая длина автосоздаваемого пароля;
  • отключена блокировка базы при неактивности, при засыпании и т.д.;
  • отключена защита буфера обмена (автоочистка, защита от логирования);
  • включена опция Всегда выходить вместо блокирования программы;
  • разрешен экспорт, печать, копирование записей;
  • отключено запоминание последней открытой базы;
  • отключена проверка обновлений;
  • отключены все опции в разделе Параметры → Дополнительно → Автонабор: Считать запись подходящей..., Всегда показывать окно выбора записи...;
  • удалены горячие клавиши автонабора, клавиши показа KeePass'а заменены на Ctr+Shift+Q;
  • настроен плагин WebAutoType:
    • отключена опция Use the URL field value for matching,
    • назначены горячие клавиши Ctr+Alt+Shift+Q,
    • указана группа новых записей.

Почему продублирована вся программа, а не только файл конфигурации, объясняется в другой статье.

Доступ к данным в отсутствие .NET/Mono

Бывает, нужно воспользоваться паролями, сохраненными в базе KeePass'а, но запустить программу версии 2.x невозможно — отсутствует .NET/Mono. Например, такая ситуация возникает при работе в Windows PE.

Здесь помогут разные сторонние адаптации KeePass'а. Так, рассмотренное ранее приложение KeePass2Android позволяет работать с базой на смартфоне.

На ПК выручит кросплатформенная программа KeePassXC. Она предоставляет некоторые привычные функции KeePass'а, например, автонабор. С версии 2.3 поддерживается преобразование ключа Argon2.

Наконец, открыть базу можно даже прямо в браузере — это позволяет веб-приложение KeeWeb.

Комментарии и отзывы

Нашли ошибку?

Новое на сайте