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

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

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

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

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

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

Защита KeePass'а системными средствами

Несмотря на то, что KeePass противостоит некоторым атакам, он не может гарантировать защиту от целенаправленно созданных вредоносных программ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы вместе с тем работал глобальный автонабор в веб-версии Телеграма, в группу domains добавлена запись под названием |Telegram|web.telegram.org|. Аналогично имена и сайты других приложений можно делать «эквивалентыми доменами».

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

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

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

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

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

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

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

var WshShell = WScript.CreateObject("WScript.Shell");
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var lnkDir = FSO.GetAbsolutePathName(
	FSO.GetFile(WScript.ScriptFullName).ParentFolder.ParentFolder) + "\\LNK";
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 = '"' + lnkDir + '\\' + 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 = lnkDir + "\\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 = '%SystemRoot%\\System32\\cscript.exe';
	var s1020 = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
	s1020 += s1020; s1020 += s1020 + 'XXX'; s1020 += s1020; s1020 += s1020;
	tempLnk.Arguments = s1020;
	tempLnk.WorkingDirectory = '%SystemRoot%\\System32';
	tempLnk.Save();
} else if (scheme == "cmddirect") {
	WshShell.Run('"' + app + '" ' + args);
} else if (app) {
	WshShell.Run('%windir%\\explorer.exe ' + base, 1, true);
}
if (win) {
	WScript.Sleep(time * 0.1);
	time *= 0.9;
	while (!WshShell.AppActivate(win)) {
		if (time <= 0) {
			WScript.Quit(1);
		}
		WScript.Sleep(200);
		time -= 200;
	}
}

Этот скрипт можно использовать и в других схемах: если понадобится открывать ссылку вида новая_схема://ссылка как cmd://команда, понижая при этом права, — добавим для схемы новая_схема переопределение cmd://%windir%\System32\wscript.exe "{APPDIR}\Scripts\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}\Scripts\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'а могут открываться не только в браузере, установленном по умолчанию. Если выбрать запись и нажать кнопку [R], будет предложено открыть ссылку любым браузером из списка.

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

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

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

Также можно задать открытие браузера в песочнице, например, Comodo:

  • Opera (Comodo Sandbox)
  • "C:\Program Files\COMODO\COMODO Internet Security\virtkiosk.exe" -v "C:\Program Files\Opera\launcher.exe"

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

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

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

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

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

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

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

Как видно, для понижения прав браузера используется приведенный выше скрипт RunActivate.js: он посредством проводника запускает с ограниченными правами скрипт OpenWith.hta. Скрипт 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"
			ShowInTaskBar="Yes" />
	</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 {
		var sListName = FSO.GetBaseName(sScript) + '.txt';
		WshShell.CurrentDirectory = FSO.GetAbsolutePathName(hDir);
		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: textStream.ReadLine()});
		}
	} 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.CurrentDirectory = FSO.GetAbsolutePathName(hDir.ParentFolder);
					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);
	document.body.appendChild(container);
	
	winHeight -= document.body.clientHeight;
	winHeight += document.body.scrollHeight;
	winHeight = winHeight < screen.height ? winHeight : screen.height;
	window.resizeTo(winWidth, winHeight);
	window.moveTo(screen.width/2 - winWidth/2, screen.height/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.

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

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

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

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

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

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

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

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

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

Особенность использования почтового клиента Thunderbird

Почтовый клиент Thunderbird позволяет защищать учетные данные мастер-паролем (Параметры → Защита → Пароли). Однако бывает, что пароль не запрашивается сразу после запуска программы или наоборот, запрашивается много раз подряд. Чтобы запрос пароля работал более-менее стабильно, включим в одной из учетных записей почты опцию Проверять почту при запуске (на вкладке Параметры сервера), а в остальных отключим; опцию Проверять наличие новых сообщений каждые 10 минут включим во всех записях. Кроме того, у записи, проверяемой при запуске, не должно быть дополнительных папок, в свойствах которых включена опция При получении новых сообщений всегда проверять эту папку (кроме папки Входящие). В результате при запуске мастер-пароль будет запрашиваться всегда, причем не более двух раз.

Поместим в папку LNK ярлык Thunderbird.lnk на почтовую программу и создадим в KeePass запись по шаблону Thunderbird: укажем мастер-пароль в поле Пароль. Теперь нажатие кнопки [R] будет приводить к запуску почтовой программы и вводу мастер-пароля. Пароль будет автоматически набран один или два раза, по ситуации.

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

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

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

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

Создан триггер Запуск с автонабором кнопкой [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}\Scripts\RunActivate.js" /base:{T-CONV:/{URL}/Uri/} /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто.

На основе шаблона _Запуск_с_автонабором_ создан шаблон Удаленный рабочий стол, в котором значение поля R_Title изменено на Безопасность Windows, значение поля R_Trigger — на R_Run_Activate_AutoType_RDP, а заголовок целевого окна — на {S:R_Title}.

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

  • событие: Нажата пользовательская кнопка с идентификатором btn_Run;
  • условие Строка:
    • строка: {S:R_Trigger},
    • операция: Равно,
    • значение: R_Run_Activate_AutoType_RDP;
  • действия:
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\Scripts\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},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто.

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

Создан триггер Запуск с двойным автонабором кнопкой [R] (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}\Scripts\RunActivate.js" /base:{T-CONV:/{URL}/Uri/} /win:{T-CONV:/{S:R_Title}/Uri/} /time:{S:R_Time},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто;
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\Scripts\RunActivate.js" /win:{T-CONV:/{S:R_Title2}/Uri/} /time:{S:R_Time2},
      • опция Ждать выхода включена;
    • Выполнить автонабор для выбранной записи, поле Последовательность пусто

На основе шаблона _Запуск_с_автонабором_ создан шаблон VeraCrypt. В нем изменено значение поля R_Time на 3000, поля R_Title — на {UserName}, добавлено поле AppPath со значением {APPDIR}\LNK\VeraCrypt.lnk, пустое поле Letter и пустые защищенные поля Secret и PIM, а в ассоциациях автонабора оставлено только окно *{S:R_Title} с последовательностью {CLEARFIELD}{Password}. Полю URL-ссылка задано значение:

cmdDirect://"{S:AppPath}" /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: указать в качестве ссылки расположение базы, а в качестве логина и пароля — учетные данные подключения к хранилищу (FTP/WebDAV). В результате синхронизация запустится, если отметить эту запись и нажать кнопку [R].

Аналогичным способом можно запустить вручную и синхронизацию с основным облачным хранилищем: отметить запись <AutoSync> и нажать кнопку [R].

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

В базе создан шаблон Синхронизируемая база KeePass, имеющий поле R_Trigger со значением R_Sync. Аналогичное поле добавлено в запись <AutoSync>.

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

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

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

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

Если вы хотите, чтобы изменение логина/пароля исходной записи автоматически отражалось на ее копии, включите в диалоге дублирования опцию Заменять логины и пароли ссылками. Если хотите, чтобы в копии отражалось также изменение 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/}. Аналогичное можно проделать и для нескольких полей. Разумеется, выделенные фрагменты кода нужно будет заменить своими.

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

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

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

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

Различные операции, которые выполняются автоматически — описанные в предыдущей статье бэкап, автосохранение и синхронизация, а также описанные ниже автоокрытие и автоэкспорт, — работают только для баз, расположенных рядом с программой в папке 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

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

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

Если какая-либо база является «вспомогательной» — используется только для открытия других баз и должна после этого закрываться, — добавьте в нее пустую запись с названием <AutoClose> и включите триггер Автоматически закрывать базу, содержащую запись <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]:

  • событие: Нажата пользовательская кнопка с идентификатором 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:#{S:AppPath}#^(?:\{.*)?$#{T-REPLACE-RX:!{APPDIR}{ENV_DIRSEP}KeePass.exe!\$!$$$$!}#}" "{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, а не текущий. Если имеется поле Args — содержащиеся в нем аргументы добавляются к командной строке.

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

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

  • событие: Открыт файл базы данных, фильтр: пусто;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • Строка:
      • строка: {REF:T@T:<AutoOpen1>},
      • операция: Равно,
      • значение: <AutoOpen1>;
  • действия:
    • Открыть файл базы данных:
      • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:<AutoOpen1>}!^kdbx\:\/\/(.*)!$1!},
      • подключение — логин: {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/};
    • Активировать базу данных с фильтром Выполняющая триггер.

Таким образом, триггер сработает, только если текущая база находится в папке DBases и содержит запись <AutoOpen1>. Аналогично создан триггер Автоматически открывать дополнительную базу #2.

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

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

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

Экспорт данных можно выполнять через соответствующий пункт меню Файл, но можно и автоматизировать эту операцию триггерами. Чтобы экспорт стал возможен, понадобится включить опцию Сервис → Параметры → Политика → Экспорт и перезапустить 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):

  • у каждой записи остается не более одного прикрепленного файла;
  • функция трансформации ключа 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]:

  • событие: Нажата пользовательская кнопка с идентификатором 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, ссылающуюся на базу с общими данными.

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

Другой сценарий — изменения в общую базу вносит только администратор, а ограниченные пользователи получают доступ лишь на чтение. В этом случае пользователи прямо импортируют данные из удаленной общей базы в свои личные базы. Импорт можно сделать автоматическим, аналогично автоматическому открытию или экспорту: создать у каждого пользователя запись наподобие <AutoImport> и соответствующий триггер, в качестве метода импорта выбрать Заменить новыми и обработать удаленные. К сожалению, в опциях импорта нет полей для учетных данных подключения к хранилищу, но в случае FTP эти данные можно встроить в ссылку. В личной базе администратора понадобится создать запись, которая открывает общую базу с другими учетными данными, дающими доступ на изменение.

Блокировка интерфейса

Бывает, становится недоступным файл базы, открытой в KeePass'е, — например, извлекается съемный диск или теряется связь с удаленным хранилищем. Обычно в таких случаях KeePass продолжает корректно работать с базой, находящейся в памяти. Однако после блокировки доступ к данным будет потерян.

Чтобы сохранить доступ, можно вместо блокировки базы прибегнуть к импровизированной «блокировке интерфейса». Для этого база должна содержать запись QuickUnlock с непустым паролем — паролем быстрой разблокировки.

Если 5 минут не пользоваться KeePass'ом, в котором открыта и активна база, имеющая пароль быстрой разблокировки и расположенная не в подпапке DBases, то его работа приостановится. Чтобы возобновить работу, понадобится ввести этот пароль в диалоговое окно. Если ошибиться — принудительно завершатся все экземпляры KeePass'а (без сохранения изменений!).

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

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

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

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

Для передачи в KeePass набранного пароля используется скрипт Prompt.vbs:

Dim answer
Do
	answer = InputBox(WScript.Arguments(0), WScript.Arguments(1), WScript.Arguments(2))
Loop While VarType(answer) <> vbString
WScript.StdOut.Write Replace(answer, "{", "{{}")

Символы { экранируются, чтобы предотвратить внедрение кода.

В базе создана запись QuickUnlock, для нее запрещен автонабор.

Создан триггер Автоматически блокировать интерфейс:

  • событие: Периодически по времени с интервалом 290 секунд и перезапуском при активности;
  • условия:
    • Строка:
      • опция Отрицание включена,
      • строка: {DB_PATH},
      • операция: Равно,
      • значение: пусто;
    • Строка:
      • опция Отрицание включена,
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}DBases;
    • Строка:
      • строка: {REF:T@T:QuickUnlock},
      • операция: Равно,
      • значение: QuickUnlock;
    • Строка:
      • опция Отрицание включена,
      • строка: {REF:P@T:QuickUnlock},
      • операция: Равно,
      • значение: пусто;
  • действия:
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • новое состояние: Выключить;
    • Показать записи по тегу: non_existing_tag,
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\ping.exe,
      • аргументы: -n 1 -w 2000 192.0.2.222,
      • опция Ждать выхода включена,
      • стиль окна: Скрытое;
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\taskkill.exe,
      • аргументы: {T-REPLACE-RX:!/f /im KeePass.exe*{T-REPLACE-RX:#{REF:P@T:QuickUnlock}#\{#{{}#}{_{CMD:#%windir%\system32\cscript.exe //Nologo "{APPDIR}\Scripts\Prompt.vbs" "{DB_PATH}" "KeePass QuickUnlock" ""#M=C,WS=H#}!(?:^[^\*]*\*(.*)\{_$|\*[\s\S]*)!!},
      • опция Ждать выхода включена,
      • стиль окна: Скрытое;
    • Изменить состояние триггера:
      • Имя триггера: пусто,
      • новое состояние: Включить.

Создан триггер Блокировать интерфейс кнопкой [R] или двойным кликом:

  • события:
    • Нажата пользовательская кнопка с идентификатором btn_Run;
    • Данные скопированы в буфер обмена, значение оставлено пустым;
  • условие: Строка:
    • строка: {Title},
    • операция: Равно,
    • значение: QuickUnlock;
  • действия: аналогично предыдущему триггеру.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Однако удобнее использовать для закладок вообще отдельную базу и отдельно настроенный экземпляр KeePass'а. Для этого в папке KeePass_B заготовлена конфигурация KeePass.config.xml. Распакуем в эту папку архив с программой KeePass 2.x Portable, в подпапку Languagesперевод, а в подпапку Plugins поместим файлы WebAutoType.plgx и KeePassFaviconDownloader.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. Изменена корневая группа этой базы: Поведение → Автонабор → Запрещено.

В основной базе 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:#{S:AppPath}#^(?:\{.*)?$#{T-REPLACE-RX:!{APPDIR}{ENV_DIRSEP}KeePass.exe!\$!$$$$!}#}" "{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 назначены горячие клавиши Ctr+Alt+Shift+Q и указана группа новых записей;
  • в триггерах удалены кнопки [F], [C], [L];
  • удалены триггеры, связанные с автонабором (кроме глобального) или блокировкой интерфейса.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

От этих атак в какой-то мере защищает запуск KeePass'а с правами администратора — на случай, если вредоносная программа не получит этих прав. Также можно условно считать KeePass защищенным от этих атак, если он работает в реальной среде, а вредоносная программа — в песочнице Comodo или Sandboxie, даже с повышенными правами. Наконец, можно жестко настроить HIPS (входящий, например, в Comodo Internet Security), запретив доступ к памяти и окнам KeePass'а любым сторонним программам, в т.ч. выполняющимся в реальной среде с повышенными правами.

Однако угрозу представляет не только изменение памяти KeePass'а, но и ее чтение.

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

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

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

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

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

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

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

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

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

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

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

  1. запускать KeePass от администратора — тогда система запретит как изменение, так и чтение его памяти обычным ограниченным программам;
  2. отключить опцию Помнить зашифрованный мастер-пароль базы, пока она открыта (но станут невозможны некоторые специфические операции, вроде экспорта в формат KDB);
  3. включить опцию Всегда выходить вместо блокирования программы — тогда при блокировке базы будет выгружаться и сам KeePass;
  4. в триггере Регулярно синхронизировать отключить опцию Разрешен — тогда база не будет синхронизироваться при неактивности, если она не изменялась;
  5. в триггере Автоматически синхронизировать заменить событие на Закрытие файла базы данных (после сохранения) — тогда, в сочетании с п. 2, синхронизация будет выполняться, в основном, лишь при закрытии KeePass'а;
  6. избегать плагинов, передающих данные в браузеры (WebAutoType к ним не относится).

Дополнительная защита с помощью 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,
  • %windir%\System32\taskkill.exe.

Также добавим правило для приложения %windir%\System32\taskkill.exe: в пункте Межпроцессный доступ к памяти нажмем Изменить и добавим на вкладку Разрешенные группу KeePass.

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

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

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

Добавляя комментарий, ознакомьтесь с Правилами сообщества