Вопрос надёжного хранения паролей - головная боль для всех, кто понимает, что в браузере и, тем более в телефоне нельзя хранить конфиденциальные штуки. Вариантов много, лично я остановился на KeepassXC.
Ещё одна порблема в том, что файл базы данных с паролями хранится локально на той же машине, где живёт Keepass. И когда машина помирает или диск помирает или что-то ещё происходит, все пароли и заметки говорят "here we go again". Можно, конечно, после каждого изменения базы кидать себе куда-то в облако или на сервер, но идея такая себе.
Кстати, есть мобильная версия этого же менеджера, об этом тоже под катом.
Для того, чтобы жить спокойно, решил сделал такой алгоритм:
Чтобы всё сделать, нужно пройтись по шагам:
Описываю процесс для Ubuntu, но пойдёт на любой системе, где есть systemd.
Если их по какой-то причине нет, то следует их создать командой:
ssh-keygen -t rsa -b 2048
Эта команда создаст пару ключей: приватный и публичный. Когда программа запросит путь для сохранения ключа, можно просто клацать Enter, пока это не закончится.
ssh-copy-id fovendor@193.38.54.183
Тут надо написать вместо fovendor имя своего пользователя на сервере, а после @
IP-адрес сервера.
Примечание: если порт SSH на сервере отличается от стандартного 22, то нужен флаг -p. Команда будет выглядеть так:
ssh-copy-id -p 2222 fovendor@193.38.54.183
Ввести команду:
ssh fovendor@193.38.54.183
Если подключилось без запроса пароля, всё ок. Это важно, т.к. служба без ручек и сама пароль от машины не напечатает при подключении по SSH.
Для автоматического отслеживания изменений в файле pass.kdbx и его синхронизации нам понадобятся два инструмента: inotify-tools (для отслеживания изменений) и rsync (для копирования файла).
Для автоматического отслеживания изменений в файле pass.kdbx и его синхронизации нужны две утилиты: inotify-tools (для отслеживания контрольных сумм файлов) и rsync (для копирования файла).
sudo apt-get install inotify-tools rsync
Создать файл командой:
nano /home/fovendor/keepass/sync_keepass.sh
Он автоматически откроется после создания. В нём написать скрипт:
#!/bin/bash
LOCAL_FILE="/home/fovendor/keepass/pass.kdbx"
REMOTE_DIR="fovendor@193.38.54.183:/home/fovendor/fo-pass/"
INOTIFY_EVENTS="modify,create,delete,move"
# Проверяем, установлен ли inotifywait
if ! command -v inotifywait &> /dev/null
then
echo "inotifywait не установлен. Установите inotify-tools и попробуйте снова."
exit 1
fi
# Запуск inotifywait для отслеживания изменений
inotifywait -m -e $INOTIFY_EVENTS --format '%w%f' "$(dirname "$LOCAL_FILE")" | while read FILE
do
if [ "$FILE" == "$LOCAL_FILE" ]; then
echo "Файл $LOCAL_FILE был изменен. Выполняется синхронизация..."
rsync -avz "$LOCAL_FILE" "$REMOTE_DIR"
echo "Синхронизация завершена."
fi
done
Каталоги, имена и явки заменить на свои. После этого сделать его исполняемым:
chmod +x /home/fovendor/keepass/sync_keepass.sh
Чтобы скрипт смог (как паровозик) и работал как служба, нужно создаьт службу systemd. Капитан офф.
Создать файл командой:
sudo nano /etc/systemd/system/sync_keepass.service
Написать инструкции:
[Unit]
Description=Sync Keepass Database with VPS
After=network.target
[Service]
User=fovendor
ExecStart=/home/fovendor/keepass/sync_keepass.sh
Restart=on-failure
[Install]
WantedBy=default.target
Перезапустить демон systemd:
sudo systemctl daemon-reload
Включить службу при старте системы:
sudo systemctl enable sync_keepass.service
После этого создаётся символическая ссылка, типа такого: Created symlink /etc/systemd/system/default.target.wants/sync_keepass.service → /etc/systemd/system/sync_keepass.service
.
Запустить службу:
sudo systemctl start sync_keepass.service
Проверить статус:
sudo systemctl status sync_keepass.service
Если всё ок, будет сообщение типа такого:
Чтобы убедиться, что всё ок, надо перезапустить локальную машину и войти на VPS через SSH, перейти в каталог, куда копируется файл (прописано в скрипте) и посмотреть его данные. Можно двумя способами:
Способ 1.
ls -l /home/fovendor/fo-pass/
Команда кажет что-то такое:
fovendor@fovendor:~$ ls -l /home/fovendor/fo-pass/
total 24
-rwxrwxr-x 1 fovendor fovendor 193 Oct 4 2023 backup.sh
-rwxrwxrwx 1 fovendor fovendor 19669 Oct 9 18:43 pass.kdbx
Способ 2.
stat pass.kdbx
Будет типа такого:
fovendor@fovendor:~/fo-pass$ stat pass.kdbx
File: pass.kdbx
Size: 19989 Blocks: 40 IO Block: 4096 regular file
Device: fc02h/64514d Inode: 262306 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/fovendor) Gid: ( 1000/fovendor)
Access: 2024-10-09 18:43:30.788000127 +0200
Modify: 2024-10-09 18:43:29.047752141 +0200
Change: 2024-10-09 18:43:30.788000127 +0200
Birth: 2024-10-09 18:43:30.788000127 +0200
После этого добавляем в Keepass какую-то запись, сохраняем и проверяем снова. Данные создания/изменнеи файла обязаны поменяться.
Создать на VPS рядом с файлом pass.kdbx
файл backup.sh
командой:
nano /home/fovendor/fo-pass/backup.sh
В нём написать скирпт и сохранить:
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/home/fovendor/fo-pass-backups"
SOURCE_FILE="/home/fovendor/fo-pass/pass.kdbx"
# Создание папки для бэкапов, если она не существует
mkdir -p $BACKUP_DIR
# Копирование файла с текущей датой в имени
cp $SOURCE_FILE $BACKUP_DIR/pass-$DATE.kdbx
Открыть редактор cron командой:
crontab -e
Добавить запись, чтобы запускать бэкап каждый день, например, в полночь:
0 0 * * * /home/fovendor/backup.sh
После этого бэкапы будут складываться в папочку /home/fovendor/fo-pass-backups
. Будут лежать там вечно. Если не хочется, чтобы они просто складировались, можно выпендриться перед пацанами и бывшей и написать вместо верхнего такой скрипт:
#!/bin/bash
# Получение текущей даты в формате ГГГГ-ММ-ДД
DATE=$(date +%Y-%m-%d)
# Папка для хранения бэкапов
BACKUP_DIR="/home/fovendor/fo-pass-backups"
# Исходный файл базы данных
SOURCE_FILE="/home/fovendor/fo-pass/pass.kdbx"
# Указать количество дней, по прошествии которых старые бэкапы будут удалены
RETENTION_DAYS=80
# Создание папки для бэкапов, если она не существует
mkdir -p $BACKUP_DIR
# Копирование файла с текущей датой в имени
cp $SOURCE_FILE $BACKUP_DIR/pass-$DATE.kdbx
# Проверка, успешно ли файл был скопирован
if [ $? -eq 0 ]; then
echo "Бэкап создан успешно: pass-$DATE.kdbx"
else
echo "Ошибка при создании бэкапа."
exit 1
fi
# Удаление бэкапов старше $RETENTION_DAYS дней
find $BACKUP_DIR -type f -name "pass-*.kdbx" -mtime +$RETENTION_DAYS -exec rm {} \;
# Сообщение об удалении старых бэкапов
echo "Удалены бэкапы старше $RETENTION_DAYS дней."
Но кому нужны эти дешёвые понты? А вот вероятность, что когда-то может понадобиться какая-то запись, которую удалили год назад, а теперь не можем найти битки, высока. Так что пусть лежат бэкапы))
Объясняю для андроида, как там на iOS - ХЗ.
Установить AndFTP. и добавить новое подключение. Там заполнить IP VPS-сервера. Появится новое подключение (очень большая пикча ниже).
.
Подключаемся, вводим пароль от VPS (который теперь не надо вводить для SSH-доступа с локальной машины). Переходим в каталог /home/fovendor/fo-pass/
и качаем. Чтобы переключиться на телефон в каталог со скаченным файлом надо (интуитивно понятный интерфейс, ага) нажать на иконку телефончика.
Потом всё как в тумане (куча картинок). Нужно перенести в нужный каталог на телефоне файл базы, чтобы потом открыть его через KeepassDX на мобиле.
Профит.
В результате получается достаточно защищённая и отказоустойчивая связка с локальной базой паролей, хранящейся на:
Вдыхаем. Делаем sudo rm -R /home/fovendor/fo-pass/
и sudo rm -R /home/fovendor/fo-pass-backups
. Выдыхаем. Навсегда.
P.S. Это была шутка, не надо так делать!!!