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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В окне Сервис → Настройка → Интеграция → Замены ссылок добавлена новая схема 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:/{URL}/Uri/}, означающая запуск скрипта RunActivate.js с аргументом командной строки /base:, содержащим ссылку в URI-кодировке. Скрипт заносит полученные данные в ярлык LNK\temp.lnk и запускает его проводником, а затем затирает эти данные в ярлыке. (Скрипт умеет также активировать окна, заданные в командной строке, но здесь эта возможность не используется.) Код скрипта:

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

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

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

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

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

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

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

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

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

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

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

Ссылки из записей KeePass'а могут открываться не только в брузере, установленном по умолчанию. Если выбрать запись и нажать кнопку [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 выполняется с правами администратора.

Также в контекстном меню записи есть подменю Ссылка, позволяющее выбрать браузер. Однако я не рекомендую запускать браузеры через это меню, потому что тогда они получат те же права, что имеет 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" />
	</head>
	<body>
	</body>
	<script type="text/javascript">
		var winWidth = 400;
		var winHeight = 330;
		window.resizeTo(winWidth, winHeight);
		window.moveTo(screen.width/2 - winWidth/2, screen.height/2 - winHeight/2);
		
		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('Невозможно сделать каталог скрипта текущим');
			window.close();
		}
		
		try {
			var sListFile = FSO.GetAbsolutePathName('OpenWith.txt');
			var textStream = FSO.OpenTextFile(sListFile);
			var browsers = new Array();
			while (!textStream.AtEndOfStream) {
				var str = textStream.ReadLine();
				if (!str) continue;
				browsers.push({name: str, cmd: textStream.ReadLine()});
			}
			textStream.close();
		} catch (e) {
			window.alert('Невозможно получить список браузеров из файла:\n\n'
					+ sListFile);
			window.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.appendChild(document.createTextNode(sArgs));
		container.appendChild(p);
		document.body.appendChild(container);
	</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] установится соединение с клиентом и наберется его пароль.

Универсальный шаблон такого типа — _Запуск_с_автонабором_, вы можете на его основе создавать записи для множества приложений. Создавая запись по этому шаблону, нужно указать запускаемое приложение в поле Ссылка и его оконный заголовок в поле 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}{ENTER}. Полю Ссылка задано значение:

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

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

Работа с разными базами. Совместное использование. Открытие без ввода пароля

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

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

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

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

Для использования дополнительной базы создайте запись по шаблону База KeePass: в поле «Ссылка» укажите путь к базе, желательно с префиксом kdbx:// (если база находится в папке Base, то для переносимости путь можно указать в виде kdbx://{APPDIR}{ENV_DIRSEP}Base{ENV_DIRSEP}Имя_файла.kdbx), в поле «Пароль» — ее мастер-пароль. Если база защищена также ключевым файлом, укажите путь к нему в поле KeyFile. Если для доступа к файлу базы нужна авторизация, укажите учетные данные в полях ConnectionLogin и ConnectionPassword.

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

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

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

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

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

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

Итак, настроим автооткрытие базы без ввода пароля:

  • в триггере Автозакрытие базы, содержащей запись <AutoClose> (Сервис → Триггеры) отключим опцию Включен;
  • откроем базу starter.kdbx в каталоге Base (исходный ее пароль 1);
  • в базе starter.kdbx изменим составной пароль: отключим опцию Основной пароль и включим опцию Учетная запись Windows;
  • отредактируем в этой базе запись AutoOpeningBase1_Main:
    • Ссылка: путь к основной базе,
    • Пароль: ее пароль,
    • Логин: путь к ключевому файлу;
  • если нужно открывать еще одну базу, аналогично отредактируем запись AutoOpeningBase2_Main;
  • включим опцию Включить в триггере Автозакрытие базы, содержащей запись <AutoClose>.

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

Настройка KeePass для открытия базы без ввода пароля

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

В базе создан шаблон База KeePass, имеющий поле R_Trigger со значением R_Open_KeePass_Database (оно определяет действие кнопки [R]), пустое поле ConnectionLogin и пустые защищенные поля KeyFile и ConnectionPassword.

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

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

Чтобы база открывалась также двойным кликом по ссылке, в окне Сервис → Настройка → Интеграция → Замены ссылок добавлена схема kdbx с заменой cmd://"{APPDIR}{ENV_DIRSEP}KeePass.exe" "{BASE:RMVSCM}" -pw-enc:"{PASSWORD_ENC}" {T-REPLACE-RX:!{S:KeyFile}!^[^\{].*!-keyfile:!}"{T-REPLACE-RX:!{S:KeyFile}!^\{.+\}$!!}". Этот код означает запуск KeePass'а с указанием в аргументах командной строки базы, ее зашифрованного пароля и пути к ключевому файлу. Пароль шифруется данными учетной записи Windows.

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

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

  • событие: Открыт файл базы паролей, фильтр оставлен пустым;
  • условия:
    • Строка:
      • строка: {REF:T@T:AutoOpeningBase1_Main},
      • операция: Равно,
      • значение: AutoOpeningBase1_Main;
    • Строка:
      • опция Отрицание включена,
      • строка: {REF:A@T:AutoOpeningBase1_Main},
      • операция: Равно,
      • значение: пусто;
  • действия:
    • Открыть файл базы паролей:
      • файл/ссылка: {T-REPLACE-RX:!{REF:A@T:AutoOpeningBase1_Main}!^kdbx\:\/\/(.*)!$1!},
      • подключение — логин: {T-REPLACE-RX:!{REF:U@T:AutoOpeningBase1_Connection}!^\{.*\}$!!},
      • подключение — пароль: {T-REPLACE-RX:!{REF:P@T:AutoOpeningBase1_Connection}!^\{.*\}$!!},
      • пароль: {REF:P@T:AutoOpeningBase1_Main},
      • ключевой файл: {T-REPLACE-RX:!{REF:P@T:AutoOpeningBase1_KeyFile}!^\{.*\}$!!}{REF:U@T:AutoOpeningBase1_Main};
    • Активировать базу паролей с фильтром Выполняющая триггер.

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

Создана вспомогательная база starter.kdbx, в которой заготовлены пустые записи AutoOpeningBase1_Main, AutoOpeningBase2_Main и <AutoClose>, а также запись <BackUp> с логином 0 (чтобы отключить резервное копирование этой базы).

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

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

В каталоге программы создан bat-файл, запускающий команду KeePass.exe Base\starter.kdbx -useraccount -minimize.

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

В предыдущей статье рассмотрена автоматическая синхронизация базы с облачным хранилищем. Возможно, для перестраховки вы пожелаете дополнительно синхронизировать базу с каким-нибудь другим хранилищем по FTP/WebDAV, причем делать это не постоянно, а только в случае важных ее изменений. Для этого понадобится поместить копию базы в это хранилище, а затем создать запись по шаблону Синхронизируемая база KeePass: указать в качестве ссылки расположение базы, а в качестве логина и пароля — учетные данные хранилища. В результате синхронизация запустится, если отметить эту запись и нажать кнопку [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}.

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

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

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

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

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

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

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

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

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

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

  • события:
    • Данные из записи скопированы в буфер обмена;
    • Нажата пользовательская кнопка с идентификатором btn_Run;
  • условия:
    • Строка:
      • строка: {TITLE},
      • операция: Равно,
      • значение: <Заблокировать интерфейс>;
    • Строка:
      • опция Отрицание включена,
      • строка: {PICKCHARS:URL},
      • операция: Равно,
      • значение: {PASSWORD};
  • действие: Выполнить команду/ссылку:
    • файл/ссылка: {APPDIR}{ENV_DIRSEP}KeePass.exe,
    • аргументы: --exit-all.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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