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

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

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

Как и в предыдущей статье, все приемы использования KeePass'а иллюстрируются готовой настроенной программой. Напомню, что вам понадобится распаковать в какую-либо пустую папку архив с portable-вариантом KeePass версии 2.x, туда же распаковать архив с русским переводом и архив KeePass_Settings.zip (пароль KeePass); в произвольное место распаковать архив с ключевым файлом. Опционально — поместить в папку Plugins плагины TCATO_Placeholder.plgx, KeePassFaviconDownloader.plgx, WebAutoType.plgx, AutoTypeShow.plgx.

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

Для открытия базы необходимо ввести пароль myCoolMasterPassword и указать ключевой файл just a photo.jpg.

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

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

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

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

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

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

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

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

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

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

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

Чтобы KeePass не запустил браузер от имени администратора при просмотре справки, онлайн-справка заменена локальной: Справка → Источник справки → Локальный файл.

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

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

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

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

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

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

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

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

Повторю, что желательно запускать 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}\RunActivate.js" /base:{T-CONV:/{BASE}/Uri/}, означающаее запуск скрипта RunActivate.js с аргументом командной строки /base:, содержащим ссылку в URI-кодировке. Скрипт заносит полученные данные в ярлык LNK\temp.lnk и запускает его проводником, а затем затирает эти данные в ярлыке. (Скрипт умеет также активировать окна, заданные в командной строке, но здесь эта возможность не используется.) Код скрипта:

var WshShell = WScript.CreateObject("WScript.Shell");
var appDir = WScript.ScriptFullName.substring(0,
	WScript.ScriptFullName.length - WScript.ScriptName.length - 1);
var oNamedArgs = WScript.Arguments.Named;
var base = oNamedArgs.Exists("base") ? decodeURIComponent(oNamedArgs("base")) :  "";
var time = oNamedArgs.Exists("time") ? (+oNamedArgs("time")) : 0;
var win = oNamedArgs.Exists("win") ? decodeURIComponent(oNamedArgs("win")) : "";
var parsed = /^(?:(\w+)\:\/+)?((?:"([^"]*)"|([^"\s]*))(?:\s+(.*))?)$/.exec(base)
	|| new Array(6);
var scheme = (parsed[1] || "").toLowerCase();
var rmvscm = parsed[2] || "";
var app = parsed[3] || parsed[4] || "";
var args = parsed[5] || "";
if (scheme == "lnk") {
	scheme = "cmddirect";
	app = "%windir%\\explorer.exe";
	args = '"' + appDir + '\\LNK\\' + rmvscm.replace(/"/g, '') + '.lnk"';
}
if (/\.lnk$/.test(app)) {
	var lnk = WshShell.CreateShortcut(app);
	app = lnk.TargetPath;
	args = lnk.Arguments + " " + args;
	WshShell.CurrentDirectory = lnk.WorkingDirectory || WshShell.CurrentDirectory;
}
if (scheme == "cmd") {
	var pathTempLnk = appDir + "\\LNK\\temp.lnk";
	var tempLnk = WshShell.CreateShortcut(pathTempLnk);
	tempLnk.TargetPath = app;
	tempLnk.Arguments = args;
	tempLnk.WorkingDirectory = WshShell.CurrentDirectory;
	tempLnk.Save();
	WshShell.Run('%windir%\\explorer.exe "' + pathTempLnk + '"', 1, true);
	
	tempLnk.TargetPath = '%SystemRoot%\\System32\\wscript.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}\RunActivate.js" /base:{T-CONV:!cmd://команда!Uri!}. В качестве примера добавлена схема RDP для подключения к удаленному рабочему столу.

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

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

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

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

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

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

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

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

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

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

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

Чтобы задать желаемый список браузеров, отредактируйте файл OpenWith.txt: удалите ненужные пункты, добавьте свои. Каждый пункт задается парой строк: первая — название браузера, вторая — команда его запуска. Для наглядности пары можно отделять друг от друга любым количеством пустых строк. В команде путь к браузеру заключается в двойные кавычки, он может быть абсолютным или относительным, после него могут идти дополнительные аргументы командной строки. Например, если каталог с портативным браузером 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}\RunActivate.js" /base:{T-CONV:!cmd://%windir%\System32\mshta.exe "{APPDIR}\OpenWith.hta" {URL}!Uri!}.

Как видно, для понижения прав браузера используется приведенный выше скрипт RunActivate.js: он посредством проводника запускает с ограниченными правами скрипт OpenWith.hta. Скрипт OpenWith.hta отображает список браузеров и запускает выбранный. Код этого скрипта:

<html>
	<head>
		<title>Каким браузером открыть ссылку?</title>
		<hta:application
			id="oHTA"
			ApplicationName="BrowserChoice"
			Icon="%SystemRoot%\System32\shell32.dll"
			InnerBorder="No"
			Navigable="Yes"
			Scroll="No"
			MaximizeButton="No"
			MinimizeButton="No"
			ShowInTaskBar="No" />
	</head>
	<body>
	</body>
	<script type="text/javascript">
try {
	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 sDir = FSO.GetFile(sScript).ParentFolder.Path;
		WshShell.CurrentDirectory = FSO.GetAbsolutePathName(sDir);
	} catch (e) {
		window.alert('Невозможно сделать каталог скрипта текущим');
		throw e;
	}
	
	try {
		var textStream = FSO.OpenTextFile('OpenWith.txt');
		var browsers = new Array();
		while (!textStream.AtEndOfStream) {
			var str = textStream.ReadLine();
			if (!str) continue;
			browsers.push({name: str, cmd: textStream.ReadLine()});
		}
	} catch (e) {
		window.alert('Невозможно получить список браузеров из OpenWith.txt');
		throw e;
	} 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) {
					window.alert('Невозможно запустить:\n\n' + sCmd);
				}
				window.close();
			}
		})(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);
	
} catch (e) {
	window.close();
}
	</script>
</html>

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

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

Аналогичным способом можно запустить вручную и синхронизацию с основным облачным хранилищем: отметить запись KeePassCloudStorage и нажать кнопку [R]. Таким образом, кнопка ↑↓ становится отчасти избыточной, и можно освободить от нее панель инструментов: в окне Триггеры → Добавить кнопки на панель инструментов → Действия удалить соответствующий пункт.

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

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

Создан триггер Синхронизировать базу KeePass при нажатии на кнопку [R]:

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

Совместимость с KeePass 1.x

Бывает, нужно воспользоваться паролями, сохраненными в базе KeePass'а, но запустить программу версии 2.x невозможно — отсутствует .NET (или Mono). Например, такая ситуация возникает при работе в Windows PE. Здесь на помощь придет KeePass версии 1.x. Функциональность этой версии менее богата, зато .NET для ее работы не требуется. Детальное сравнение версий — на сайте программы.

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

Итак, если вам когда-либо может пригодиться база данных в «старом» формате, просто откройте окно Сервис → Триггеры → Автоматически сохранять копию базы в KDB и включите опцию Разрешен. В результате в папке Base всегда будет лежать не только основной файл базы, имеющий расширение .kdbx, но и одноименный файл с расширением .kdb — та же база в формате KeePass 1.x. Также в папке BackUp будет лежать копия этого файла.

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

Воспользуемся каким-либо облачным хранилищем, предоставляющим доступ по FTP. Создадим новую запись по шаблону Экспортируемая база KeePass, запишем логин и пароль FTP-аккаунта в соответствующие поля (и запомним их), а в поле URL-ссылка укажем адрес, по которому будет отправляться файл. Если вы выбрали хранилище DriveHQ, то не нужно менять поле URL-ссылка: оно изначально готово. Теперь, когда понадобится отправить на облако файл базы в формате версии 1.x, будем просто отмечать эту запись и нажимать кнопку [R].

Если вы желаете, чтобы отправка базы в «старом» формате не требовала вашего участия, а происходила сама при закрытии базы, переименуйте созданную запись в KeePass1CloudStorage. Первой строкой заметок в этой записи должна быть какая-либо ссылка (изначально https://www.drivehq.com/secure/logonoption.aspx): по ней будет проверяться доступность хранилища. Затем откройте окно Сервис → Триггеры → Автоматически сохранять базу удаленно в KDB и включите опцию Разрешен. При этом вы по-прежнему сможете отправлять базу вручную кнопкой [R].

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

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

  • событие: Закрытие базы (после сохранения), фильтр оставлен пустым;
  • условие Строка:
    • строка: {DB_DIR},
    • операция: Равно,
    • значение: {APPDIR}{ENV_DIRSEP}Base;
  • действия:
    • Экспорт текущей базы данных:
      • файл/ссылка: {DB_DIR}{ENV_DIRSEP}{DB_BASENAME}.kdb,
      • формат файла: KeePass KDB (1.x);
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\wscript.exe,
      • аргументы: "{APPDIR}\BackUp.js" "{DB_BASENAME}.kdb" {T-REPLACE-RX:/{REF:A@T:<settings>}/^(.*\D.*|)$/1/},
      • опция Ждать выхода включена.

После экспорта этот триггер создает резервную копию KDB-файла с помощью скрипта BackUp.js, приведенного в предыдущей статье. Резервное копирование необходимо, так как при определенных условиях (например, после разблокировки плагином KeePassQuickUnlock) экспорт в KDB перестает работать: результат оказывается пустым. Скрипт выполняет резервное копирование, только если файл не пуст. Число версий KDB-файла, хранящихся в папке BackUp, определяется полем URL-ссылка записи <settings>, по умолчанию 1.

Вариант без внешнего скрипта

Если вас не устраивает использование внешнего скрипта BackUp.js, можно обойтись без него, изменив действие Выполнить команду/ссылку:

  • файл/ссылка: %comspec%,
  • аргументы: /c "for %i in ("{DB_DIR}\{DB_BASENAME}.kdb") do if "%~zi" GTR "0" (md "{DB_DIR}\BackUp"& copy "%~i" "{DB_DIR}\BackUp\{DT_UTC_YEAR}.{DT_UTC_MONTH}.{DT_UTC_DAY}-{DT_UTC_HOUR}.{DT_UTC_MINUTE}.{DT_UTC_SECOND}-UTC-%~nxi" /y& for /f "skip={T-REPLACE-RX:/{REF:A@T:<settings>}/^(.*\D.*|)$/1/} tokens=*" %X in ('dir "{DB_DIR}\BackUp\*-UTC-%~nxi" /b /o:-n') do del "{DB_DIR}\BackUp\%X" /q)",
  • опция Ждать выхода включена;
  • стиль окна: Скрытое.

Для ручного экспорта любого типа создан шаблон Экспортируемая база KeePass, в который добавлено поле R_Trigger со значением R_Export, поле Format со значением KeePass KDB (1.x) и пустые поля Group и Tag. Изначально в поле URL-ссылка записано значение ftp://ftp.drivehq.com/{T-CONV:/{DB_BASENAME}/Uri/}.kdb, а заметки начинаются строкой https://www.drivehq.com/secure/logonoption.aspx.

Для работы с этим шаблоном создан триггер Экспортировать базу при нажатии на кнопку [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 позволяет передать учетные данные внутри ссылки.

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

  • событие: Закрытие файла базы данных (после сохранения), фильтр оставлен пустым;
  • условия:
    • Строка:
      • строка: {DB_DIR},
      • операция: Равно,
      • значение: {APPDIR}{ENV_DIRSEP}Base;
    • Строка:
      • строка: {REF:T@T:KeePass1CloudStorage},
      • операция: Равно,
      • значение: KeePass1CloudStorage;
    • Строка:
      • опция Отрицание включена,
      • строка: {CMD:#%comspec% /c "@echo off& for %i in ("{DB_DIR}\{DB_BASENAME}.kdb") do if "%~zi" GTR "0" echo 1"#M=C,WS=H#},
      • операция: Равно,
      • значение: пусто;
    • Существует файл: {T-REPLACE-RX:/{REF:N@T:KeePass1CloudStorage}/\n[\s\S]*//}
  • действие: Экспорт текущей базы данных:
    • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:KeePass1CloudStorage}!^(\w+\:\/\/)!$1{T-REPLACE-RX:/{T-CONV:%{REF:U@T:KeePass1CloudStorage}%Uri%}/(.+)/$1{T-REPLACE-RX:#{T-CONV:%{REF:P@T:KeePass1CloudStorage}%Uri%}#(.+)#:$1#}@/}!},
    • формат файла: KeePass KDB (1.x).

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

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

Экспорт базы. Меры предосторожности

Выше мы применили экспорт базы для поддержки совместимости с KeePass 1.x. Конечно, этим возможности экспорта не исчерпываются. Основной способ экспорта базы — через пункт меню Файл → Экспорт. В качестве некоторой защиты KeePass потребует при этом ввести мастер-пароль (благодаря отключению опции Сервис → Параметры → Политика → Экспорт — без ключа).

Другой способ: с помощью шаблона Экспортируемая база KeePass создавать записи, для которых по нажатию кнопки [R] будет выполняться экспорт базы. Формат определяется полем Format, допускаются значения KeePass KDB (1.x), KeePass KDBX (2.x), KeePass CSV (1.x), KeePass XML (2.x). Расположение экспортированной базы задается в поле URL-ссылка и может быть как удаленным, так и локальным. Например, если вы вставите в поле URL-ссылка строку {DB_DIR}{ENV_DIRSEP}{DB_BASENAME}.kdb, то сможете вручную сохранять базу локально в формате KeePass 1.x.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В базе создан шаблон База KeePass: в качестве ссылки указана строка kdbx://{APPDIR}{ENV_DIRSEP}Base{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/}.

Создан триггер Открыть базу KeePass при нажатии на кнопку [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-REPLACE-RX:/{S:AppPath}/^(?:\{S\:AppPath\})?$/{APPDIR}{ENV_DIRSEP}KeePass.exe/}" "{BASE:RMVSCM}" {T-REPLACE-RX:/{PASSWORD}/.+/-pw-enc:/}"{T-REPLACE-RX:/{PASSWORD}/.+/{PASSWORD_ENC}/}" {T-REPLACE-RX:!{T-REPLACE-RX:/{S:KeyFile}/^\{S\:KeyFile\}$//}!.+!-keyfile:!}"{T-REPLACE-RX:/{S:KeyFile}/^\{S\:KeyFile\}$//}" {T-REPLACE-RX:/{S:Args}/^\{S\:Args\}$//}

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

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

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

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

Таким образом, триггер сработает, только если запись Database1AutoOpen существует и ее ссылка не пуста. Аналогично создан триггер Автоматически открывать дополнительную базу #2.

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

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

Совместное использование паролей

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

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

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

Другой сценарий — изменения в общую базу вносит только администратор, а ограниченные пользователи получают доступ лишь на чтение. В этом случае пользователи прямо импортируют данные из удаленной общей базы в свои личные базы. Чтобы реализовать импорт, понадобится создать в базе пользователя запись Database_AutoImport (подобно шаблону База KeePass) с паролем от удаленной базы и учетными данными доступа к хранилищу на чтение, а также создать триггер автоимпорта (подобно триггерам открытия базы или экспорта). К сожалению, в опциях импорта нет полей для учетных данных подключения к хранилищу, но проблему можно решить аналогично ситуации с экспортом: встроить учетные данные в FTP-ссылку. Метод импорта в триггере — Заменить новыми и обработать удаленные. В личной базе администратора понадобится создать запись, которая открывает общую базу с администраторскими учетными данными FTP.

Блокировка ПИН-кодом

В «настольной» версии KeePass'а можно использовать быструю разблокировку, подобную той, что имеется в KeePass2Android. Ее реализует плагин KeePassQuickUnlock: понадобится поместить файл KeePassQuickUnlock.plgx в папку Plugins, в настройке KeePass'а на вкладке Безопасность отключить опцию Всегда выходить вместо блокирования, а в базе назначить какой-либо простой пароль записи QuickUnlock в группе <service>. В результате если заблокировать базу — будет предложено ввести этот пароль; в случае ошибки придется вводить сложный мастер-пароль.

Возможен и другой способ, не требующий плагинов. В этом случае пароль записи QuickUnlock должен быть числом, например, 1234. Если нажать кнопку [Q], работа KeePass'а будет приостановлена и появится консольное окно. Чтобы возобновить работу программы, понадобится ввести в это окно правильное число. Если ввести неправильные данные или закрыть окно — принудительно завершатся все экземпляры KeePass'а.

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

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

Если вы не собираетесь пользоваться кнопкой [Q], то можете избавиться от нее, удалив соответствующий пункт в окне Триггеры → Добавить кнопки на панель инструментов → Действия.

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

В базе создана запись QuickUnlock. Для плагина KeePassQuickUnlock в окне Параметры отключен лимит времени, в течение которого можно использовать быструю разблокировку.

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

  • событие: Приложение запущено и готово;
  • действие: Добавить свою кнопку на панель инструментов:
    • идентификатор: btn_Lock,
    • имя: [Q],
    • описание: Заблокировать ПИН-кодом.

Создан триггер Подготовка к блокировке ПИН-кодом при нажатии на кнопку [Q]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Lock;
  • действия:
    • Показать записи по тегу: non_existing_tag,
    • действие Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\ping.exe,
      • аргументы: -n 1 -w {T-REPLACE-RX:/{REF:P@T:<delays>}/^(.*\D.*|)$/1500/} 192.0.2.222,
      • опция Ждать выхода включена,
      • стиль окна: Скрытое.

Под ним создан триггер Блокировка ПИН-кодом при нажатии на кнопку [Q]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_Lock;
  • условие: Строка:
    • опция Отрицание включена,
    • строка: {CMD:#%comspec% /v:on /c "start "" /wait %comspec% /v:on /c "color 1& set /p "p=PIN: "& exit !p!"& <nul set /p p=!errorlevel!"#M=C,WS=H#},
    • операция: Равно,
    • значение: {REF:P@T:QuickUnlock};
  • действия:
    • Выполнить команду/ссылку:
      • файл/ссылка: %windir%\System32\taskkill.exe,
      • аргументы: /f /im KeePass.exe,
      • опция Ждать выхода включена,
      • стиль окна: Скрытое;
    • Закрыть текущую базу данных;
    • Закрыть текущую базу данных;
    • Закрыть текущую базу данных;
    • Закрыть текущую базу данных;
    • Закрыть текущую базу данных.

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

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

Самый простой способ открывать базу без пароля — шифровать ее одним лишь ключевым файлом. Тогда она будет сразу открываться, если запускать программу командой KeePass.exe -minimize "путь к базе" -keyfile:"путь к ключевому файлу" (например, можно создать ярлык с этой командой и поместить в автозагрузку) — KeePass запустится в свернутом виде с открытой базой. Однако этот способ не годится, если база используется также на другом устройстве, где опасно держать базу фактически открытой.

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

  • создадим в папке программы текстовый файл Open.bat,
  • вставим в него строку start "" /d "%~dp0" KeePass.exe -minimize "xxx" -pw-enc:"yyy" -keyfile:"zzz"
  • заменим фрагмент xxx на путь к базе (по умолчанию Base\KeePassBase.kdbx),
  • заменим фрагмент zzz на путь к ключевому файлу (если он не используется, удалим весь фрагмент -keyfile:"zzz"),
  • добавим в базу запись с полями:
    • логин: {PASSWORD_ENC}
    • пароль: мастер-пароль базы;
  • скопируем логин (двойным кликом),
  • заменим в файле Open.bat фрагмент yyy скопированным значением,
  • удалим запись из базы.

В результате батник Open.bat будет запускать KeePass с открытой в нем базой. Можно добавить этот файл в автозагрузку. Мастер-пароль базы в нем будет зашифрован данными учетной записи Windows. В случае смены учетной записи, смены ПК или переустановки ОС база не откроется батником — понадобится ввести мастер-пароль (поэтому его следует помнить!).

Вариант без командной строки

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

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

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

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

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

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

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

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

Также в папке Base заготовлена база Bookmarks.kdbx, а в основной базе KeePassBase.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-файл и импортировать этот файл в браузером.

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

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

В папке Base создана база Bookmarks.kdbx. Изменена корневая группа этой базы: Поведение → Автонабор → Запрещено.

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

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

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

cmd://"{T-REPLACE-RX:/{S:AppPath}/^(?:\{S\:AppPath\})?$/{APPDIR}{ENV_DIRSEP}KeePass.exe/}" "{BASE:RMVSCM}" {T-REPLACE-RX:/{PASSWORD}/.+/-pw-enc:/}"{T-REPLACE-RX:/{PASSWORD}/.+/{PASSWORD_ENC}/}" {T-REPLACE-RX:!{T-REPLACE-RX:/{S:KeyFile}/^\{S\:KeyFile\}$//}!.+!-keyfile:!}"{T-REPLACE-RX:/{S:KeyFile}/^\{S\:KeyFile\}$//}" {T-REPLACE-RX:/{S:Args}/^\{S\:Args\}$//}

В папке программы создана подпапка 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], [A], [Q];
  • в триггере Глобальный автонабор при нажатии на кнопку [G] действие Выполнить глобальный автонабор заменено на Выполнить команду:
    • файл: {T-REPLACE-RX::{APPDIR}:.{10}$::}{ENV_DIRSEP}KeePass.exe,
    • аргументы: -auto-type;
  • в триггере Автоматически сохранять изменения событие изменено на Закрытие файла базы данных (до сохранения);
  • в триггере Автоматически синхронизировать событие заменено на Открыт файл базы данных и Сохранен файл базы данных.

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

Опасность доступа к процессу 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'а даже после закрытия базы.

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

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

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

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

В-третьих, KeePass настроен на завершение своей работы вместо блокировки базы.

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

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

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

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

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

Откроем настройку CIS на вкладке Репутация файлов → Список файлов и добавим скрипты BackUp.js, GlobalAutoTypeHelper.js, RunActivate.js и OpenWith.hta как доверенные.

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

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

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

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

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

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

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

Отдельно добавим правило HIPS для файла OpenWith.hta (расположим его над правилами группы KeePass): в пункте Запуск приложений нажмем Изменить и добавим на вкладку Разрешенные группу Все приложения.

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

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

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

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

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