LINUX.ORG.RU

Зашифрованный раздел на HDD/USB для хранения данных.

 , ,


0

1

Всем привет!

  • Возникла необходимость создать зашифрованный раздел на диске/флешке для хранения GPG, SSH ключей и подобного рода конфиденциальной информации.
    Подскажите как это правильно организовать.
  • Так же интересует вопрос автоматического бекапа файлов, которые расположены на диске ноутбука (и периодически изменяются/добавляются/удаляются) в этот самый зашифрованный раздел.

На данный момент установлена ОС Kubuntu 18.04 LTS. При установке был сделан выбор установки все в один раздел (если это вообще имеет значение).

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

Если ты собираешься бэкапить на флэшку регулярно, то придётся городить дополнительные проверки на наличие этой флэшки, и что она примонтирована. Потому раздел на постоянно наличиствующем диске будет более удобным для регулярного бэкапа.

Для регулярного бэкапа нужно написать скрипт (своим не поделюсь — он всё равно не будет работать в Linux), написать systemd-timer или добавить его в crontab (в Kubuntu предпочтительнее первое).

С выбором шифрования в Linux ничего не подскажу.

mord0d ★★★ ()

В zfs можно зашифровать интересующий датасет. Zfs send может в инкрементальные изменения даже при шифровании. В общем, маст хэв.

Deleted ()
Ответ на: комментарий от Deleted

zfs send требует наличия другого датасета, в котором его примут (zfs recv). Хотя, конечно, можно слать в файл, но тогда инкрементально не выйдет.

Сам использую это для бэкапа с ноутбука на десктоп.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Ну а через GIT, к примеру, это никак не организовать локально? Ведь по сути GIT тем и занимается, что сравнивает версии файлов и проверяет наличие новых, а так же удаленных файлов.
Т.е. в моем представлении это выглядит так:

  1. Указать GIT’у откуда нужно тащить информацию о файлах/каталогах при их изменении/добавлении/удалении.
  2. На флешке создаем что-то вроде хранилища, подобного тому, с которым мы привыкли работать через GIT (GitHub-подобные). Только не через мировую паутину, а локально.
  3. Подключаем нушу флешку ==> Встаем на нее в терминале ==> Выполняем команду git status и GIT понимает, что мы хотим собрать информацию о внесенных изменениях в те файлы/каталоги, которые мы указали GIT’у ранее.
  4. Если GIT обнаруживает внесенные изменения/добавления/удаления в указанных ему ранее файлах/каталогах, то от сообщает нам об этом.
  5. Ну и мы командой push все это дело сливаем на флешку.

Для матерых пользователей Linux вероятно вышеизложенное звучит как бред пьяной обезьяны. Но тем не менее я всего лишь высказал свое предположение. А можно это реализовать таким способом или нет я не знаю…

parnyagan ()
Ответ на: комментарий от parnyagan

Git хранит промежуточные данные самих изменений. Это нужно для разработки, но не для хранения резервных копий.

Со временем оба репозитория (исходный с конфигами и целевой на флэшке) разрастутся, рефы будут занимать много больше места, чем сами файлы. Ну и для бинарных данных (а связки ключей gpg — бинарные) git годится совсем никак.

Указать GIT’у откуда нужно тащить информацию о файлах/каталогах при их изменении/добавлении/удалении.

Для git тебе придётся инициировать репозиторий как в дире с конфигами (отдельно для gpg и отдельно для ssh), так и на флэшке.

Если GIT обнаруживает внесенные изменения/добавления/удаления в указанных ему ранее файлах/каталогах, то от сообщает нам об этом.

Находясь на флэшке ты этих данных не получишь, так как они ещё не запушены туда.

В общем, не пытайся изобрести велосипед, используй tar, храни по 10-20 архивов (весить они будут мало), делай их раз в неделю-две или месяц. Проверенный метод, который никогда не подводил. Плюс с tar у тебя не будет проблем с правами, даже если на флэшке у тебя FAT.

mord0d ★★★ ()
Последнее исправление: mord0d (всего исправлений: 1)

как это правильно организовать

Эти слова подразумевают, что для достижения цели существует единственно верный способ?

Вот что тебе нужно сделать:

  • Используя crypt-setup создать на флэшке зашифрованный раздел.

  • Написать скрипт для бэкапов.

  • Добавить запуск скрипта в systemd-timer.

Prosto_user ★★ ()
Ответ на: комментарий от mord0d

Доброго времени!
Вы в этом сообщении объясняли мне как делать бекап gpg и ssh через tar. Выглядит это так:

#!/bin/sh
cd ${HOME}/.gnupg
tar -cJpf /mount/usbstick/gnupg-$(date '+%Y-%m-%d').tar.xz .

cd ${HOME}/.ssh
tar -cJpf /mount/usbstick/ssh-$(date '+%Y-%m-%d').tar.xz .

sync

Но у меня почему-то пишет ошибку

user ~ $ #!/bin/sh
user ~ $ cd ${HOME}/.gnupg
user ~/.gnupg $ tar -cJpf /mnt/usb/gnupg-$(date '+%Y-%m-%d').tar.xz
tar: Робкий отказ от создания пустого архива
Попробуйте «tar --help» или «tar --usage» для
получения более подробного описания.

Директорию в команде
tar -cJpf /mount/usbstick/gnupg-$(date '+%Y-%m-%d').tar.xz
я должен заменить на ту, в которую смонтировал флешку, верно? Т.е. у меня получилось
tar -cJpf /mnt/usb/gnupg-$(date '+%Y-%m-%d').tar.xz

parnyagan ()
Ответ на: комментарий от parnyagan

tar: Робкий отказ от создания пустого архива

У меня в конце точка через пробел не просто так, сравни наши с тобой строки:

Моё:

tar -cJpf /mount/usbstick/gnupg-$(date '+%Y-%m-%d').tar.xz .
#                                                         ^^

Твоё:

tar -cJpf /mnt/usb/gnupg-$(date '+%Y-%m-%d').tar.xz
#                                                  ??

я должен заменить на ту, в которую смонтировал флешку, верно? Т.е. у меня получилось

Да, всё правильно, но tar нужно указать откуда делать архив, потому . говорит ему, что это нужно делать из pwd (не просто так делается cd в диру).

mord0d ★★★ ()
Ответ на: комментарий от mord0d

У меня в конце точка через пробел не просто так

Да, что-то с точку я резанул не глядя :-)
С ней все прошло успешно.
Ну и теперь вопросы по правильности организации всего процесса:

  1. Вы упоминали про зашифрованный раздел на флешке. При этих командах с tar его все же нужно создавать или это происходит автоматически при вводе команды tar?
  2. Как всем этим воспользоваться в случае переустановки системы? Ведь банальный перенос созданных на флешке файлов не решит проблему восстановления ключей, т.к. они теперь в .xz (кстати, что это вообще за расширение такое? архив?)?
parnyagan ()
Ответ на: комментарий от parnyagan

Вы упоминали про зашифрованный раздел на флешке.

tar занимается только архивацией файлов, ему нет никакого дела до файловой системы. Создавать шифрованный раздел и монтировать его — это совсем другая задача, о которой tar ничего не знает.

что это вообще за расширение такое? архив?

Да.

Как всем этим воспользоваться в случае переустановки системы?

#!/bin/sh

backup_dir="/mnt/usb"

mkdir -p ~/.gnupg
mkdir -p ~/.ssh

last_gnupg="$(ls -1t ${backup_dir}/gnupg-*.tar.xz | head -n1)"
last_ssh="$(ls -1t ${backup_dir}/ssh-*.tar.xz | head -n1)"

cd ~/.gnupg && \
  tar -xpf ${backup_dir}/${last_gnupg}

cd ~/.ssh && \
  tar -xpf ${backup_dir}/${last_ssh}

И этот скрипт, и скрипт бэкапа можешь хранить вместе с архивами на флэшке… если уверен, что она сама по себе не сдохнет.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

А команда

cd ~/.gnupg && \
  tar -xpf ${backup_dir}/${last_gnupg}

вводится одной командой в терминале?

cd ~/.gnupg && \
  tar -xpf ${backup_dir}/${last_gnupg}

-> Enter
Или поочередно/построчно?
сначало
cd ~/.gnupg && \ -> Enter
замем
tar -xpf ${backup_dir}/${last_gnupg} -> Enter

parnyagan ()
Ответ на: комментарий от mord0d

И этот скрипт, и скрипт бэкапа можешь хранить вместе с архивами на флэшке

Сорри, поторопился с ответом, не дочитав до конца…
Т.е. я могу это

#!/bin/sh
cd ${HOME}/.gnupg
tar -cJpf /mount/usbstick/gnupg-$(date '+%Y-%m-%d').tar.xz .

cd ${HOME}/.ssh
tar -cJpf /mount/usbstick/ssh-$(date '+%Y-%m-%d').tar.xz .

sync

и это

#!/bin/sh

backup_dir="/mnt/usb"

mkdir -p ~/.gnupg
mkdir -p ~/.ssh

last_gnupg="$(ls -1t ${backup_dir}/gnupg-*.tar.xz | head -n1)"
last_ssh="$(ls -1t ${backup_dir}/ssh-*.tar.xz | head -n1)"

cd ~/.gnupg && \
  tar -xpf ${backup_dir}/${last_gnupg}

cd ~/.ssh && \
  tar -xpf ${backup_dir}/${last_ssh}

сохранить в файлы, к примеру backup и restore, с расширение .sh и запускать их при необходимости для бекапа и восстановления?

parnyagan ()
Ответ на: комментарий от mord0d

Проверьте, пожалуйста! Все ли я правильно прописал?
backup.sh

#!/bin/sh                                                                                                         
cd ${HOME}/.gnupg                                                                
tar -cJpf /mnt/usb/gnupg-$(date '+%Y-%m-%d').tar.xz .                            
                                                                                 
cd ${HOME}/.ssh                                                                  
tar -cJpf /mnt/usb/ssh-$(date '+%Y-%m-%d').tar.xz .                              
                                                                                 
cd ${HOME}/.password-store                                                       
tar -cJpf /mnt/usb/password-store-$(date '+%Y-%m-%d').tar.xz .                   
                                                                                 
cd ${HOME}/wiki                                                                  
tar -cJpf /mnt/usb/wiki-$(date '+%Y-%m-%d').tar.xz .                             
                                                                                 
sync

restore.sh

#!/bin/sh                                                                                                         
                                                                                 
backup_dir="/mnt/usb"                                                            
                                                                                 
mkdir -p ~/.gnupg                                                                
mkdir -p ~/.ssh                                                                  
mkdir -p ~/.password-store                                                       
mkdir -p ~/wiki                                                                  
                                                                                 
last_gnupg="$(ls -1t ${backup_dir}/gnupg-*.tar.xz | head -n1)"                   
last_ssh="$(ls -1t ${backup_dir}/ssh-*.tar.xz | head -n1)"                       
last_password-store="$(ls -1t ${backup_dir}/password-store-*.tar.xz | head -n1)" 
last_wiki="$(ls -1t ${backup_dir}/wiki-*.tar.xz | head -n1)"                     
                                                                                 
cd ~/.gnupg && \                                                                 
  tar -xpf ${backup_dir}/${last_gnupg}                                           
                                                                                 
cd ~/.ssh && \                                                                   
  tar -xpf ${backup_dir}/${last_ssh}                                             
                                                                                 
cd ~/.password-store && \                                                        
  tar -xpf ${backup_dir}/${last_password-store}                                  
                                                                                 
cd ~/wiki && \                                                                   
  tar -xpf ${backup_dir}/${last_wiki}

Т.е. предпологается резервирование / восстановление 4-ех директорий:

  1. ~/.gnupg
  2. ~/.ssh
  3. ~/.password-store
  4. ~/wiki
parnyagan ()
Ответ на: комментарий от parnyagan

- недопустимый символ в названии переменной.

last_password-store должно быть last_password_store.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Проверьте еще раз. Я немного изменил последовательность создания и восстановления бэкапов, а так же изменил имя переменной.
Все ли правильно сделал? Нигде не накосячиил? ;-)
backup.sh

#!/bin/sh
cd ${HOME}/.gnupg
tar -cJpf /mnt/usb/gnupg-$(date '+%Y-%m-%d').tar.xz .

cd ${HOME}/.password-store
tar -cJpf /mnt/usb/password-store-$(date '+%Y-%m-%d').tar.xz .

cd ${HOME}/.ssh
tar -cJpf /mnt/usb/ssh-$(date '+%Y-%m-%d').tar.xz .

cd ${HOME}/wiki
tar -cJpf /mnt/usb/wiki-$(date '+%Y-%m-%d').tar.xz .

sync

restore.sh

#!/bin/sh

backup_dir="/mnt/usb"

mkdir -p ~/.gnupg
mkdir -p ~/.password-store
mkdir -p ~/.ssh
mkdir -p ~/wiki

last_gnupg="$(ls -1t ${backup_dir}/gnupg-*.tar.xz | head -n1)"
last_password_store="$(ls -1t ${backup_dir}/password-store-*.tar.xz | head -n1)"
last_ssh="$(ls -1t ${backup_dir}/ssh-*.tar.xz | head -n1)"
last_wiki="$(ls -1t ${backup_dir}/wiki-*.tar.xz | head -n1)"

cd ~/.gnupg && \
  tar -xpf ${backup_dir}/${last_gnupg}

cd ~/.password-store && \
  tar -xpf ${backup_dir}/${last_password_store}

cd ~/.ssh && \
  tar -xpf ${backup_dir}/${last_ssh}

cd ~/wiki && \
  tar -xpf ${backup_dir}/${last_wiki}
parnyagan ()
Ответ на: комментарий от parnyagan

Годится.

Но могу предложить вариант "всё в одном":

#!/bin/sh

backup_dir="/mnt/usb"
dirs=".gnupg .password-store .ssh wiki"

_die_if_error() {
  if [ ${1} -ne 0 ]; then
    shift
    echo "${@}" >&2
    exit 1
  fi
}

_check_mounted() {
  df | grep -q "${backup_dir}"'$'
  _die_if_error ${?} "backup_dir not mounted"
}

_backup() {
  _check_mounted
  for dir in ${dirs}; do
    cd "${HOME}/${dir}" && \
      tar -cJpf "${backup_dir}/${dir#.}-${date '+%Y-%m-%d').tar.xz" .
      _die_if_error ${?} "${dir}: backup error"
  done
  sync
}

_restore() {
  _check_mounted
  for dir in ${dirs}; do
    mkdir -p "${HOME}/${dir}" && \
      cd "${HOME}/${dir}" && \
      tar -xpf "${backup_dir}/$(ls -1t ${backup_dir}/${dir#.}-*.tar.xz | head -n1)"
      _die_if_error ${?} "${dir}: restore error"
  done
  sync
}

case ${1} in
  (backup) _backup ;;
  (restore) _restore ;;
  (*) echo "unknown command" >&2; exit 1 ;;
esac

Если ты назовёшь скрипт например brs (backup/restore script), то запускать так:

# сделать бэкап:
brs backup
# развернуть из бэкапа:
brs restore

Если нужно добавить какую-нибудь диру, то делается это в переменной dirs, но в данном виде умеет работать с директориями лежащими в $HOME и нигде больше.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Вуфф… я еще с тем не успел разобраться, а тут такое… для меня пока что слишком сложно…
Меня на данный момент другой вопрос интересует.
При вводе команды
tar -cJpf /mnt/usb/одна_из_директорий-$(date '+%Y-%m-%d').tar
завершается с ошибкой, выполняю с sudo - все ок. Так и должно быть?

parnyagan ()
Ответ на: комментарий от parnyagan

или в этих скриптах нужно, чтобы все строки выполнялись с sudo?

parnyagan ()
Ответ на: комментарий от parnyagan

Вуфф… я еще с тем не успел разобраться, а тут такое… для меня пока что слишком сложно…

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

При вводе команды
tar -cJpf /mnt/usb/одна_из_директорий-$(date '+%Y-%m-%d').tar
завершается с ошибкой, выполняю с sudo - все ок. Так и должно быть?

У тебя на флэшку запись от пользователя запрещена?

ls -l /mnt/usb

Что кажет?

mord0d ★★★ ()
Ответ на: комментарий от mord0d
итого 20352
-rwxr-xr-x 1 root root    36920 мая  5 01:23 gnupg-2020-05-05.tar.xz
-rwxr-xr-x 1 root root   970772 мая  5 01:24 password-store-2020-05-05.tar.xz
-rwxr-xr-x 1 root root     2348 мая  5 01:25 ssh-2020-05-05.tar.xz
-rwxr-xr-x 1 root root 19815664 мая  5 01:26 wiki-2020-05-05.tar.xz
parnyagan ()
Ответ на: комментарий от parnyagan

root root

chown -R $(id -urn):$(id -grn) /mnt/usb

Затем отмонтируй, примонтируй заново и проверь значения пользователя и группы.

mord0d ★★★ ()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от mord0d

У тебя на флэшку запись от пользователя запрещена?

Ну так правильно, монтирую флешку то я из под рута, т.е. sudo mount /dev/sda1 /mnt/usb

parnyagan ()
Ответ на: комментарий от parnyagan

монтирую флешку то я из под рута

От пользователя без делегации ты и не сможешь. Ext4 может переопределять права на файловую систему (не на устройство).

mord0d ★★★ ()
Ответ на: комментарий от mord0d
user ~ $ chown -R $(id -urn):$(id -grn) /mnt/usb
chown: изменение владельца '/mnt/usb/gnupg-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/password-store-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/ssh-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/wiki-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb': Операция не позволена
parnyagan ()
Ответ на: комментарий от mord0d
user ~ $ sudo chown -R $(id -urn):$(id -grn) /mnt/usb
[sudo] пароль для user: 
chown: изменение владельца '/mnt/usb/gnupg-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/password-store-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/ssh-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb/wiki-2020-05-05.tar.xz': Операция не позволена
chown: изменение владельца '/mnt/usb': Операция не позволена
parnyagan ()
Ответ на: комментарий от parnyagan

Ой, блин…

Какая файловая система на флэшке? Если FAT32, то можешь даже не пытаться — оно во владельца не умеет.

Если Ext4, возьми значения id -urn и id -grn от пользователя, и вставь их в команду от рута (% от пользователя; # — от рута):

% id -urn
<пользователь>
% id -grn
<группа>
# chown -R <пользователь>:<группа> /mnt/usb
mord0d ★★★ ()
Ответ на: комментарий от parnyagan

Тогда требуется некоторая модернизация и запуск через sudo.

Можешь перед всеми операциями с флэшкой (на данный момент это только tar в функции _backup) прописать sudo.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

А через терминал эти файлы бекап/рестор как зупустить то? Терминалу ведь надо дать понять с помощью чего мы будем открывать данные файлы

parnyagan ()
Ответ на: комментарий от parnyagan

Я ничего не понял.

Терминал не умеет "понимать", он умеет отображать байты человекопонятным текстом.

В данном случае понимать должен шелл. И ядро.

С FAT32 ты скрипт не запустишь, так как у нормальных админов/мейнтейнеров оно монтируется с noexec.

mord0d ★★★ ()
Ответ на: комментарий от mord0d

И что мне в таком случае делать? Флешку надо перегонять в какой то другой формат?

parnyagan ()
Ответ на: комментарий от parnyagan

Хранить скрипт там, откуда его можно запускать.

И бэкапить сам скрипт на флэшку. ☺

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Я конечно понимаю, что я наверное изъясняюсь, мягко говоря «криво», но попробую все же объяснить «на пальцах»…
Вот смотри, к примеру я хочу открыть файл test.txt в редакторе Vim. Для этого мне надо прописать в терминале
~$ vim test.txt
Так и тут, чтобы открыть файл скрипта backup.sh ему надо прописать через что он будет открыт.
Просто sudo backup.sh, так что ли?

parnyagan ()
Ответ на: комментарий от parnyagan

Просто sudo backup.sh, так что ли?

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

vim же ты запускаешь не указывая, чем его запускать. ☺

mord0d ★★★ ()
Ответ на: комментарий от mord0d
user ~/Загрузки $ sudo backup.sh
[sudo] пароль для user: 
sudo: backup.sh: команда не найдена

Я же говорю че то не то. Потому что после sudo и когда начинаешь прописывать back… и нажимаешь TAB, то автодополнение не срабатывает.

parnyagan ()
Ответ на: комментарий от parnyagan

Я же говорю че то не то.

Делаешь не то, вот и получаешь не то. ☺

Чтобы запускать команду без полного пути до неё нужно поместить её в PATH. Или прописывать полный путь до скрипта.

mord0d ★★★ ()
Ответ на: комментарий от mord0d
user ~/Загрузки $ ls -l
итого 8
-rw-rw-r-- 1 user user 318 мая  5 00:32 backup.sh
-rw-rw-r-- 1 user user 615 мая  5 00:52 restore.sh
user ~/Загрузки $ sudo /home/user/Загрузки/backup.shsudo: /home/user/Загрузки/backup.sh: команда не найдена
parnyagan ()
Ответ на: комментарий от parnyagan
user ~/Загрузки $ ls -l
итого 8
-rw-rw-r-- 1 user user 318 мая  5 00:32 backup.sh
-rw-rw-r-- 1 user user 615 мая  5 00:52 restore.sh
user ~/Загрузки $ sudo /home/user/Загрузки/backup.sh
sudo: /home/user/Загрузки/backup.sh: команда не найдена

Копируется криво.

parnyagan ()
Ответ на: комментарий от parnyagan

Скрипты не так запускаются. sudo ./backup.sh. Если будет нужен короткий вариант (если лень вводить путь до скрипта), то используй алиас. alias blablabla='sudo ./Загрузки/backup.sh'. Теперь, если ввести blablabla, то запустится скрипт.

Prosto_user ★★ ()
Последнее исправление: Prosto_user (всего исправлений: 1)
Ответ на: комментарий от parnyagan

-rw-rw-r--

Я же тебе писал про исполняемый бит…

chmod a+x ~/Downloads/backup.sh
mord0d ★★★ ()
Ответ на: комментарий от mord0d

про исполняемый бит

Что это значит? Я не понимаю просто о чем идет речь.

chmod a+x ~/Downloads/backup.sh

У меня директория Загрузки, а не Downloads. Как мне прописывать команду? Как написали вы или заменить на chmod a+x ~/Загрузки/backup.sh?

parnyagan ()
Ответ на: комментарий от parnyagan

Что это значит? Я не понимаю просто о чем идет речь.

Объяснять самую-самую базу прав UNIX — это как-то совсем-совсем за рамками этого треда.

У меня директория Загрузки, а не Downloads. Как мне прописывать команду? Как написали вы или заменить на chmod a+x ~/Загрузки/backup.sh?

Заменить, конечно. Мне просто лень было переключать раскладку ради одного слова. ☺

mord0d ★★★ ()
Ответ на: комментарий от mord0d

Так, ну бэкап прошел успешно.
Т.е. мне сейчас можно попробовать сделать ресторе? Предварительно скопировать директории .gnupg, .ssh, .password-store и wiki куда нибудь на всяки случай, а затем удалить их из домашней директории и попробовать восстановить с помощью restore.sh?

parnyagan ()
Ответ на: комментарий от parnyagan

скопировать директории .gnupg, .ssh, .password-store и wiki куда нибудь на всяки случай, а затем удалить их из домашней директории

Просто переименуй их в .gnupg_, .ssh_, .password-store_ и wiki_ соответственно. В случае чего переименуешь обратно.

mord0d ★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей