Бесплатный менеджер паролей 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 доверенными.

Для открытия базы необходимо ввести пароль 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:/{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.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}. Полю Ссылка задано значение:

cmdDirect://"{S:AppPath}" /q preferences /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!}

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

Быстрая блокировка ПИН-кодом

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

Придумаем число, например, 1234, и укажем его в пароле записи <settings> в группе settings. Если теперь нажать кнопку [Q], работа KeePass'а будет приостановлена и появится консольное окно. Если ввести в это окно правильное число, работа программы возобновится. Если ввести неправильные данные или закрыть окно — завершатся все экземпляры KeePass'а.

Внимание! Все запущенные KeePass'ы завершатся принудительно, без сохранения изменений. База застрахована от таких случаев, благодаря триггеру Автоматически сохранять изменения, однако пропадут изменения в конфигурации триггеров, плагинов и т.п. (Замечено, что эти изменения можно сохранить, открыв окно Сервис → Настройка и нажав Ok.)

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

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

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

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

Нажатие этой кнопки обрабатывает триггер Быстрая блокировка при нажатии на кнопку [Q]:

  • событие: Нажата пользовательская кнопка с идентификатором btn_QuickLock;
  • условие Строка:
    • опция Отрицание включена,
    • строка: {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:<settings>};
  • действие: Выполнить команду/ссылку:
    • файл/ссылка: %windir%\System32\taskkill.exe,
    • аргументы: /f /im KeePass.exe,
    • опция Ждать выхода включена,
    • стиль окна: Скрытое.

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

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

При экспорте базы в памяти KeePass'а раскрываются все данные, включая даже мастер-пароль, и остаются там до конца работы программы. Если вы считаете это опасным, то можете перенастроить триггер Автоматически сохранять копию базы в KDB: на вкладке События сменить вариант Сохранен файл базы паролей на Закрытие файла базы паролей (после сохранения).

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

Воспользуемся каким-либо облачным хранилищем, предоставляющим доступ по FTP. Создадим новую запись по шаблону Экспортируемая база KeePass, запишем логин и пароль FTP-аккаунта в соответствующие поля (и запомним их), а в поле Ссылка укажем адрес, по которому будет отправляться файл. Если вы выбрали хранилище DriveHQ, то не нужно менять поле Ссылка: оно изначально готово. Теперь, когда понадобится отправить на облако файл базы в формате версии 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).

Для ручного экспорта любого типа создан шаблон Экспортируемая база KeePass, в который добавлено поле R_Trigger со значением R_Export, поле Format со значением KeePass KDB (1.x) и пустые поля Group и Tag. Изначально в поле Ссылка записано значение 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;
    • Существует файл: {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).

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

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

Другой способ: с помощью шаблона Экспортируемая база KeePass создавать записи, для которых по нажатию кнопки [R] будет выполняться экспорт базы. Формат определяется полем Format, допускаются значения KeePass KDB (1.x), KeePass KDBX (2.x), KeePass CSV (1.x), KeePass XML (2.x). Расположение экспортированной базы задается в поле Ссылка и может быть как удаленным, так и локальным. Например, если вы вставите в поле Ссылка строку {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'а можно открывать несколько баз. Кроме того, вы можете хранить в одной базе пароль от другой базы, чтобы вводить пароль только от первой, а вторая открывалась автоматически.

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

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

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

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

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

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

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

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

В базе создан шаблон База 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.

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

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

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

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

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

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

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

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

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

Однако стоит воспользоваться какой-нибудь записью, как 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'а повышенные привилегии.

Для этой настройки понадобится изменить в KeePass'е метод резервного копирования базы: отключить триггер Создавать резервную копию перед сохранением (cmd) и включить Создавать резервную копию перед сохранением (WSH).

Поскольку файл конфигурации может хранить путь к ключевому файлу и другую секретную информацию, скроем местоположение программы: дадим каталогу с программой секретное имя и переместим в другой каталог. В результате путь к программе примет вид наподобие 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'а смогут только программы, которым это явно разрешено. Например, по умолчанию таковым является проводник.

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

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