[О блоге] [наверх] [пред] [2023-09-05 22:48:03+03:00] [e5d1f8fc7767cbe567ed39dc0e568f4216921e6e]

passman менеджер паролей

http://www.git.stargrave.org/?p=passman.git;a=summary
Что-то ни разу не писал про свой менеджер паролей тут. Видимо, потому
что он был сделан задолго до создания блога.

Давным давно я хранил пароли в текстовом файле в TSV формате,
зашифрованном GnuPG. gpg -d < passwords.tsv.gpg | grep foo.com

Дальше я перешёл на хранение всего этого в виде иерархии директорий и
текстовых файлов. www.foo.com/stargrave+foo@stargrave.org/passwd файл
содержит пароль, просто одной строчкой. Соответственно я вводил "passman
foo.com" и он найдёт www.foo.com. Если в нём одна запись
(поддиректория), то сразу же в X11 буферы обмена копирует
stargrave+foo@stargrave.org и пароль. Если учётных записей несколько,
скрипт вернёт плохой код возврата и покажет доступные найденные
варианты. А я уже уточню "passman foo.com/stargrave2" каким-нибудь.

В GUI программах вставить из одного буфера обмена просто третьей
кнопкой, а из второго через контекстное меню. В эмуляторах терминалов,
даже в suckless terminal, shift+ins и alt+shift+ins тоже позволяет из
одного и другого буфера вставку произвести. Через десять секунд скрипт
очищает буфер с паролем.

А сейчас решил что всё же стоит хоть какой-то дополнительный порог
добавить, а не в открытом виде (для моего пользователя) хранить всю эту
кучу паролей. Безусловно это всё на зашифрованном диске должно быть,
чтобы никакого plaintext на самом накопителе не оказалось.

Теперь passman хранит всё в одном recfile. И все действия используют
родной инструментарий recutils для поиска и вывода паролей. Ищем пароль
регулярным выражением через recsel. На вход ему подаётся БД всех
паролей, а на выходе тоже будет уже отфильтрованная другая БД. recsel
--count покажет сколько записей найдено, recsel -P Password уже выведет
только пароль из этой БД.

passman gen -- сгенерирует случайный пароль (16 случайных байт в
Base64). passman add name [password] -- добавит новую запись под именем
name (если пароль не задан, то сгенерирует его). Можно её добавить, а
дальше уже вызвать passman name чтобы в буфере получить пароль для
копирования в броузере -- таким образом я его на мониторе вообще ни разу
не увижу. passman mod -- позволяет отредактировать весь recfile в
редакторе, например чтобы добавить Data: поле с произвольными данными,
которые при поиске пароля тоже будут выведены на экран.

И этот файл автоматически шифруется age-ем с использованием парольной
фразы и сжимается zstd. passman mod конечно же натравит редактор на
временный дешифрованный файл, а дальше его зашифрует. Надо сменить
парольную фразу на БД? Просто запустить passman mod и сохранить файл
ничего в нём не изменяя -- age всё равно перешифрует всё в другой
временный файл.

Переконвертировать 238 паролей из иерархии директорий: одной строчкой
zsh-а сделал и к началу только добавил схему этой БД, чисто чтобы была,
для красоты и порядка.

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

    [оставить комментарий]
    комментарий 0:
    From: Egor Petrov
    Date: 2023-09-05 21:56:52Z
    
    > громоздкие GUI
    
    Слышал, что сногие пользуются pass_.
    На его сайте даже говорят, мол,
    самый юникс-вейный менеджер паролей.
    
    .. _pass: https://www.passwordstore.org/
    
    комментарий 1:
    From: Sergey Matveev
    Date: 2023-09-05 22:58:26Z
    
    *** Egor Petrov [2023-09-06 00:56]:
    >Слышал, что сногие пользуются pass_.
    
    Открыл его. Вижу bash. Сразу нет :-)
    Умеет он побольше конечно чем мой вариант, например в git там что-то
    пушить умеет, но это на 700+ строк кода. У меня по сути на одном экране
    всё умещается.
    
    В моём варианте хоть и POSIX shell, но нужны recutils ещё, *опционально*
    age и zstd. В прошлом варианте даже recutils не нужны были.
    
    В pass я с ходу вижу tree, base64, не считая GnuPG (+X11/Wayland
    утилиты). Ладно, в README перечислен tree как зависимость, но base64 не
    знаю где стоит по умолчанию. Вижу что нужен shred -- я знаю эту утилиту,
    но у меня она вообще сейчас отсутствует в системе. Да и на ZFS она
    просто бесполезна. Нужен не просто getopt, а именно GNU getopt.
    Предполагаю, что без qrencode работать наверное будет, если не
    запрашивать QR. Вижу вызов qdbus, но без проверки существования этой
    команды. Такое не шибко тривиально запустить не на GNU системе (да и на
    голом Debian bash-ей нет например тоже, не говоря про base64 и tree)
    Вижу что если платформа freebsd/openbsd/etc, то ряд команд
    переопределяются. shred молча превращается в rm, base64 в "openssl
    base64", но GNU getopt всё равно требуется.
    
    У меня сменить утилиту шифрования: поправить тело одной функции из одной
    строки, а в pass на gpg много чего завязано. Не гибко. Не то чтобы это
    прям недостаток, но значит не шибко простая программа.
    
    Вроде бы Jason A. Donenfeld толковый разработчик, но вот в самом начале
    скрипта: which gpg2 &>/dev/null && GPG="gpg2"
    это паршивый код, ибо так совершенно некорректно определять наличие
    команды. command -v gpg2 >/dev/null -- это POSIX-совместимый вариант
    работающий как надо (не смотрит на alias например) и везде.
    
    Скрипт проверяет наличие /dev/shm и ожидает от пользователя ответ готов
    ли он использовать файл просто созданный через mktemp? Опять же, вот у
    меня нет например /dev/shm никакого -- и он меня будет спрашивать? Я
    понимаю, что понять будет ли файл создан на tmpfs это нетривиально, но
    подобная "забота" будет только выбешивать, ибо вообще вроде бы у многих
    TMPDIR это /tmp, который tmpfs. То есть, очередная Linux-centric штука.
    
    В общем этот pass -- вполне себе огромная и громоздкая штука. Да,
    безусловно легче всяких GUI решений, но 700+ строк bash-а, не без
    недостатков, это точно не про минимализм и минимум геморроя.
    
    Да и собственно главное что касается удобства использования: насколько
    бегло вижу -- он копирует в буфер обмена только пароль. Тогда как логин
    придётся, значит, вводить руками! У меня давным давно заполняются два
    буфера обмена (в X11 их два (как минимум)) и я что в GUI броузере
    (Xombrero, Firefox когда их использовал), что в терминале мог и логин и
    пароль вставлять, ведь логин мог быть email-ом с "+"-суффиксом, что
    вообще-то длинная строка. Не, не годится pass.
    
    комментарий 2:
    From: Sergey Matveev
    Date: 2023-09-05 23:09:52Z
    
    *** Sergey Matveev [2023-09-06 01:58]:
    >which gpg2 &>/dev/null && GPG="gpg2"
    >это паршивый код, ибо так совершенно некорректно определять наличие
    >команды.
    
    Был не прав. Раз это явно запускается под bash-ем, то в нём which вроде
    бы работает как ожидается: игнорирует функции и alias-ы. Именно команду
    проверяет. Так что сойдёт.