other
January 9

Береги пароль смолоду

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

Пролог

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

Встает главный вопрос жизни и всего такого: а где же это всё хранить?

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

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

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

Однако, есть несколько проблем с ними:

  1. Во-первых, хранить можно только пароли;
  2. Низкая защищенность ваших паролей. Любой, кто получит доступ к вашему браузеру, получит ваши пароли;
  3. Пароли хранятся только в одном браузере. При переезде с Chrome на Firefox, например, вы будете каким-то образом переносить свои пароли, тем самым дублируя эту базу и внося неконсистентность;
  4. Также ваши пароли в открытом виде доступны и известны вашему облачному провайдеру, то бишь Google или Apple, соответственно не исключены утечки их баз данных.

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

Как же улучшить эту ситуацию?

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

Все эти возможности предоставляет KeePass. Изначально KeePass - это open-source приложение на C# для хранения паролей в зашифрованном файле в формате KBDX.

Так незамысловато выглядит оригинальное десктоп приложение:

На данный момент это уже целая инфраструктура, есть несколько отличных сторонних open-source приложений под разные платформы (Windows, Linux, MacOS, Android, iOS, WEB), написаны интеграции со всеми популярными браузерами. Формат файла базы данных стандартизирован, существует множество библиотек под разные языки, позволяющих работать с этим файлом.

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

К примеру, Android приложение KeePassDX не имеет никаких разрешений по доступу в интернет, соответственно, оно безопасно в этом плане:

На десктопе, если вы не уверены в приложении, то под Windows можно в firewall заблокировать доступ к сети для этого приложения. В Linux это делается через AppArmor.

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

О формате KBDX

К сожалению, я не смог найти полной спецификации формата в одном документе. Часть информации о формате доступна на сайте оригинального KeePass:

Есть статья, описывающая формат Keepass file format explained.

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

Есть XML схема формата https://github.com/keepassxreboot/keepassxc-specs/blob/master/kdbx-xml/kdbx4.0-schema.xsd и описание к ней https://github.com/keepassxreboot/keepassxc-specs/blob/master/kdbx-xml/rfc.txt.

Вкратце можно отметить следующие факты о формате:

  • Формат файла-контейнера бинарный;
  • Сами данные хранятся в секции payload файла в формате XML. Ссылку на схему я уже привел выше. Размер файла не ограничен;
  • Существует две версии бинарного формата файла (устаревший kbd и актуальный kbdx). Различие в заголовках и поддержке алгоритмов шифрования;
  • Формат поддерживает сжатие алгоритмом gzip;
  • Поддерживаются следующие алгоритмы шифрования AES, TwoFish, ChaCha20. Алгоритм ChaCha20 не уступает по криптостойкости AES, но при этом более легковесный, что особенно ощутимо на мобильных устройствах без поддержки аппаратного шифрования AES. На данный момент этот алгоритм используется по умолчанию;
  • Для формирования ключа шифрования на основе парольной фразы пользователя или файла ключа используется хитромудрый алгоритм, описанный в статье Keepass file format explained, поддерживающий N шагов перешифрования при формировании мастер ключа, что может сильно замедлить задачу перебора пароля брутфорсом при большом N. Обратная сторона медали - при увеличении количества шагов время открытия БД замедляется;
  • Записи в БД хранятся в древовидной форме (группы, группы в группах и записи);
  • Помимо строк поддерживается хранение любых бинарных данных (тип данных BLOB);
  • Поле пароля может быть дополнительно отдельно зашифровано для пущей безопасности;
  • С каждой записью может быть ассоциирована иконка из набора стандартных либо загружена из файла.

Полезное

Напоследок хотелось бы поделиться набором софта, которым пользуюсь я.

KeePassXC

Для десктопа я использую https://keepassxc.org/. Кроссплатформенное приложение, написанное на моём любимом Qt, легковесное, обладающее богатым функционалом. Работает на MacOS, Windows, Linux. Штатно входит в состав многих дистрибутивов Linux.

Основные фичи:

  • Имеется штатный продвинутый генератор паролей
  • Для него написаны браузерные (Chrome, Firefox, MS Edge) расширения, позволяющие автозаполнять формы авторизации и предлагающие сохранить пароль в БД KeePass
  • Умеет интегрироваться с SSH агентом, хранить SSH ключи, загружать их в агента при открытии БД и выгружать при закрытии БД;
  • Умеет интегрироваться с FreeDesktop Secret Service (Gnome Keyring, KDE Wallet);
  • Умеет загружать иконки сайтов и сохранять их в записи;
  • Поддерживает сохранение бинарных вложений и расширенный список атрибутов для записей;
  • Сохраняет и отображает историю изменения записей.

KeePassDX

Это приложение под Android, выглядит стильно, модно, молодежно.

Фичи:

  • Поддерживает разблокировку по биометрии;
  • Поддерживает вложения, иконки;
  • Умеет интегрироваться с сервисом автозаполнения форм вместо штатного хранилища паролей Google;
  • Позволяет автоматически сохранять в БД введенные пароли и логины на сайтах и в приложениях.

А что же iOS?

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

Синхронизация

Я, как истинный патриот, храню пароли на Яндекс Диске. Соответственно на десктопе я использую стандартный линуксовый клиент к Яндекс Диску.

А под Android стандартный клиент не сохраняет файлы на внутренний носитель, поэтому пользоваться в связке с KeePassDX неудобно. На помощь приходит софтина FolderSync, которая позволяет очень гибко настроить синхронизацию между разными облачными хранилищами по расписанию.

Заключение

Храните пароли надежно, не доверяйте никому.

Полезные ссылки