Как запустить свой менеджер паролей?
В свое время прочитал книгу «Искусство вторжения» и она оказала большое влияние на меня, в частности начал задумываться о том как я подхожу к хранению своих данных. На тот момент стало очевидно, что использовать основной пароль и какие-то добавочные цифры или вообще один основной пароль для сокращения времени на запоминание для нескольких сайтов/сервисов не самая лучшая идея. Основной фактор здесь - желание пароли держать в своей памяти. Такое поведение позволяет мошенникам постоянно быть при работе, если вы поняли про что я. Если не понятно, то достаточно взломать 1 сервис и потом найденную связку пароль-логин использовать для подключения и к другим сайтам/сервисам. В идеальном пароле должен быть элемент случайности и абсолютное отсутствие связи с вашей личностью и личностями Вашего ближайшего окружения. У хакеров достаточно примитивные технологии взлома, но при наличии времени, знаний человеческой психологии и необходимого оборудования можно сделать почти невозможное…. взломать ваши «секретные» пароли. Дополнительный риски могут быть если Вы работаете в IT, а свои привычки в части паролей не меняете и используете «простые» пароли или 1 пароль для многих сервисов. У меня был именно такой случай, поэтому начал искать решение. У организаций могут быть свои решения для хранения личных секретов (паролей и других чувствительных данных), но у организации в которой на тот момент работал такого решения не было. Требования к решению были у меня на тот момент такие:
Возможность версионирования паролей и откатываться к нужной версии, если это будет необходимо.
Локальное хранение паролей для случаев, когда интернет недоступен, а доступ к паролям нужен.
Шифрование паролей для случаев получения третьими лицами доступа к моим паролям.
Возможность доступа к паролей со всех моих устройств: ПК, смартфон, планшет.
Весь софт желательно должен быть open-source, чтобы не было зависимостей от корпораций.
Возможность автозаполнения для форм сайтов в первую очередь.
Сразу отмечу, что я использую ядро Linux, поэтому текст ниже будет связан с Linux.
gpg
GNU Privacy Guard (GnuPG, GPG) — свободное программное обеспечение для шифрования информации и создания электронных цифровых подписей. GnuPG присутствует во всех свободных операционных системах, включая GNU/Linux, распространяется под свободной лицензией GNU General Public License. GnuPG полностью совместима со стандартом IETF OpenPGP. Текущие версии GnuPG могут взаимодействовать с PGP и другими OpenPGP-совместимыми системами.
Создание gpg
Создаем ключи: gpg --full-generate-key
Выбираем RSA как алгоритм шифрования.
4096
для длины ключа.1y
- срок действия ключа.y
- подтверждаем сделанные изменения.Указываем имя, почту и комментарий для идентификации внутри Вашей системы.
O
- финальное подтверждение.Вводим парольную фразу, которую нужно запомнить или сохранить в надежном месте. Ключи сохраняются
~/.gnupg
gpg (GnuPG) 2.4.4; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Sun 22 Feb 2026 10:49:34 AM UTC
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: test_name
Email address: example@mail.ru
Comment: test
You selected this USER-ID:
"test_name (test) <example@mail.ru>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: revocation certificate stored as '/home/volokzhanin/.gnupg/openpgp-revocs.d/02DC54E3B86AC11836AFA6C538F852C74D90A892.rev'
public and secret key created and signed.
pub rsa4096 2025-02-22 [SC] [expires: 2026-02-22]
02DC54E3B86AC11836AFA6C538F852C74D90A892
uid test_name (test) <example@mail.ru>
sub rsa4096 2025-02-22 [E] [expires: 2026-02-22]
Проверка публичных ключей: gpg -k
/home/volokzhanin/.gnupg/pubring.kbx
------------------------------------
pub rsa4096 2025-02-22 [SC] [expires: 2026-02-22]
02DC54E3B86AC11836AFA6C538F852C74D90A892
uid [ultimate] test_name (test) <example@mail.ru>
sub rsa4096 2025-02-22 [E] [expires: 2026-02-22]
Проверка приватных ключей: gpg -K
/home/volokzhanin/.gnupg/pubring.kbx
------------------------------------
sec rsa4096 2025-02-22 [SC] [expires: 2026-02-22]
02DC54E3B86AC11836AFA6C538F852C74D90A892
uid [ultimate] test_name (test) <example@mail.ru>
ssb rsa4096 2025-02-22 [E] [expires: 2026-02-22]
Описание значения записей
rsa4096
- алгоритм и количество бит.118EEBD82FE765A62602F3D26932594A6CF38770
– это id ключа.2025-02-22
– дата создания ключа.[expires: 2026-02-22]
– когда истекает ключ.uid
– идентификатор ключа.test_name
– имя, которое мы задавали.test
– комментарий.<example@mail.ru>
– e-mail.
Импорт/Экспорт gpg
Экспортируем ключи с целью их импорта на других устройствах:
gpg -a --export-secret-keys test_name > keys_secret.gpg
gpg -a --export test_name > keys_public.gpg
Импорт ключа на другом устройстве:
gpg --import keys_public.gpg
gpg --import keys_secret.gpg
Подпись с помощью gpg
Вводим в терминале: echo "test" | gpg --clearsign
Если возникла ошибка:
test
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
Вводим: export GPG_TTY=$(tty)
Пробуем повторно: echo "test" | gpg --clearsign
Должна будет запроситься парольная фраза, которую мы должны были запомнить выше. Вводим ее и должны получить примерно такой вывод:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
test
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAdFiEEAtxU47hqwRg2r6bFOPhSx02QqJIFAme5rxgACgkQOPhSx02Q
qJIJBg/+OFluWbpPniv9g4FZAI8Dk7NPr7wUuQgfgV6gbPEwtRqFbi58twI37Yoj
Ch0jfL1kTybamrM3jb/UfbLsdBX2TwjS6u4G9u/uwO3OrtqVuUDy6L/ysXaA1IWk
voO2iboxl6sFUIyDcAztBKmwQMmCehHwCi3qZPWatHlKRaf4Dq+smkpfPWqrDdXy
p0Deowcb/OnkfYiB2M1kXDmP2dLWdXXGW32jH+Zk5nyRdcikeXtW5vOvmZWTNCtb
r5GyVwhMA0qASfonDll9nakIm5bAC/rhbf3wz1XKUTQB/S/Bq6Dnzq3/RpX6BLS0
MosaxPqfYHKjDNsGDsjbvmFw4kfvwT9sBn3vjrIIOJrPAoVDMW005QEo8AaXVw7U
8XzJdFjnMqPHyBdPS1Sc39gkN6P7zxks8iy1sra8/U3ZeoIhIapp7tB5IGkq8jhf
vYNjfy5jBzY8goievQwkWYwhLk2lk/NJQPfd9/hbmAai/bR/S8I9CsJNMcgXT6ey
XjJQffcZivHTQ+mnC8ptMbXFvI3oZKS/a3bKxHvh6/1Etq0zN0ApmRpjtH6F6kFc
fN8hxm6vSis5mw66Wvy3EHns3/KMnMYDRy6PnQx1jkdcB48WtYiTLnsTZLKqRvpT
K6s/jsqFqmdPF++92CY+t3wMrCqzFL71yCov86LhfKyDSEDBWbM=
=CbCv
-----END PGP SIGNATURE-----
Шифрование с помощью gpg
Создаем файл и шифруем его: touch 1.txt | echo "123" > 1.txt | gpg -r test_name --armor --encrypt 1.txt
Откроем зашифрованный файл: nano 1.txt.asc
-----BEGIN PGP MESSAGE-----
hQIMA9D0jExa+BFaARAAya2tyuST6gg39kWr3hbDRg1Fr9J3m758pZIZUu4cUnJn
QbjjupKOqGIT4878Bh1qp833v08yU4GgOPbRpXj3yPt8UbZ+CwY5ex93UcwJPRd/
/tEhaieouA6siB8KYACwHPZH8oMmgv+d+Ius7lGb0R8jLmHTaDNZsQ7U4HxNpQQ6
UDW7boCWKp+qzPr/+ihwuV/DmqiZcMPwBs6K8ICaQTxTS/ZMquiWo0+eqpqmHbdE
zrDYenyRS4eMQwGGjwo1NJJc+CRDZrPdXsE6HaRHxx0owHiaSsdi5NJYC8RBB352
3q85mLyUnYMP2cklCY1aGtP3fXJstTVmYjUnKV9nbcZphZZQtokkHDrIQcOj3z5K
mS1farmCBiHRaPvd6YuVSvU+CZay3aoHes5AvDMOrsRNdX6/Yhllao2Fb2a8naBH
K869yWvww2weW0bhcn3kmC+XvY1Qbo4zEukYxztwivCiiZIl5/V+MlFY+CcKsvMv
8rqyy7ATinOCr/RedQG9/ZUqP3QreDL8lC0bess23RQ7blOITz8FBi2GckfH20S+
SxqZPPQf12g9SSeMDYqDh30FDtaTEazX1C2R2M2RUVcFQ995I4ncnAQ+is7m9pA+
QqMDO8fIuH91/bxNpsoV2rOh3RHy7qdIJ8o2/JsTfdCoWbC5ve91XqDhezC05t7U
TgEJAhBA4diXScbfZn1jmHqt6pfydHqG1ceX03WQYfIklOctFy1IIE7goJpFZ/4W
C/qMdk3J+v1lCVMbyY6SEAb/Z9Hw0mtwUIKkTyYyjA==
=HQ0i
-----END PGP MESSAGE-----
Расшифруем файл: gpg -d 1.txt.asc
:
gpg: encrypted with rsa4096 key, ID D0F48C4C5AF8115A, created 2025-02-22
"test_name (test) <example@mail.ru>"
123
Настройка ПК
Программа для работы с паролями
Устанавливаем программу для работы с паролями и OTP:
# Arch
sudo pacman -S pass pass-otp
# Ubuntu
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install pass pass-otp -y
Инициализируем хранилище для ключа pass init test_name
:
mkdir: created directory '/home/volokzhanin/.password-store/'
Password store initialized for test_name
Для импорта паролей в pass можно воспользоваться решением.
Git
Указываем e-mail и имя нашего пользователя:
git config --global user.email "example@mail.ru"
git config --global user.name "test_name"
Инициализируем репозиторий: pass git init
:
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /home/volokzhanin/.password-store/.git/
[master (root-commit) 4883740] Add current contents of password store.
1 file changed, 1 insertion(+)
create mode 100644 .gpg-id
[master e379b25] Configure git repository for gpg file diff.
1 file changed, 1 insertion(+)
create mode 100644 .gitattributes
Для доступа к нашему репозиторию создаем токен c правами write:repository
:
Прописываем наш удаленный репозиторий: pass git remote add origin https://user:token@repo.git
Делаем первый коммит со всем содержимым папки .password-store
:
cd ~/.password-store
git add .
git commit -m “123”
git push -u origin master
Для проверки вставляем пароль pass insert test_password
Enter password for test_password:
Retype password for test_password:
[master 448bd75] Add given password for test_password to store.
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test_password.gpg
Отправляем изменения git push
:
umerating objects: 4, done.
Counting objects: 100% (4/4), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 888 bytes | 888.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To https://your_repo.git
b87d2b1..448bd75 master -> master
Через UI смотрим изменения на сервере.
Проверяем дерево наших паролей pass list
:
Password Store
├── test
└── test_password
Можем редактировать пароль pass edit test_password
или просматривать его pass test_password
. Периодически будет запрашиваться парольная фраза. При каждом таком запросе будет запрашиваться парольная фраза для gpg. Парольная фраза может запрашиваться реже, настраивается (default-cache-ttl, max-cache-ttl) ~/.gnupg/gpg-agent.conf.
Программа для работы с паролями с графическим интерфейсом
На Arch Linux устанавливаем QtPas: sudo pacman -S qtpass
Для работы копирования в терминале устанавливаем: sudo pacman -S wl-clipboard
. Тогда возможно копировать в терминале пароли, например: pass -c test_password
. Примечание: pass -c
требует наличия графической среды (X11 или Wayland). Это значит, что команда будет работать только на устройстве, где установлен графический интерфейс.
Браузер
Ставим расширение для Firefox PassFF.
Для взаимодействия с pass выполняем : curl -sSL github.com/passff/passff-host/releases/latest/download/install_host_app.sh | bash -s -- firefox
Настройка смартфона
На смартфоне с Android устанавливаем F-Droid и через него устанавливаем OpenKeychain. Через магазин Google устанавливаем Password store.
OpenKeychain
На смартфон переносим
keys_secret.gpg
иkeys_public.gpg
(см. выше).Открываем OpenKeychain и импортируем загруженные файлы.
Password store
Генерируем ssh-ключ.
Вставляем этот ключ в настройках нашего репозитория.
Переходим в «Password store» в настройки репозитория и прописываем адрес репозитория. Предварительно необходимо убедиться, что ssh-порт открыт.
В итоге получили сервис, который максимально удовлетворяет нашим потребностям. В этом менеджере храню все свои чувствительные данные: пароли, логины, текст документов (паспорт и т.д.), дебетовые карты, токены и т.п.
Ссылки: