davfs2 и encfs на box.com

в 13:17, , рубрики: bash, Box.net, crypto, davfs2, encfs, linux, метки: , , , , ,

Здравствуй хабраменш,

Хочу поделиться с тобой сокровенными знаниями, а также пополнить запасы своих. Так вот, все началось с того, что проект syncany.org умер не родившись, ну или по крайней мере, судя по активности, разродится еще не скоро. Так как сил ждать больше не было, то решил я воспользоваться уже существующими и работающими методами для организации удаленного облачного файлохранилища (в дальнейшем УФХ) с открытым клиентом, а также с шифрацией на стороне клиента. Все что написано дальше имеет отношение к юниксоподобным операционным системам, поэтому пользователям ОС Виндовс дальнейшее изложение можно пропустить.

Вступление

На сегодняшний день существует такое количество различных облачных хранилищ, что разобраться в их отличиях и преимуществах уже не так просто как раньше — в эпоху царствования дропбокса. Для сравнения сервисов поможет Яндекс или Гуголь, а также, в некоторой степени, вот эта любовно составленная и поддерживаемая табличка в Википедии
Для меня было важно иметь возможность примонтировть удаленный диск с помощью стандартных средств или иметь исходный код клиента, а также иметь возможность самому шифровать содержимое файлов перед их отправкой на удаленный диск. Разбираться с компиляцией клиентов мне не хотелось, поэтому я пошел путем использования стандартных средств операционной системы, тем самым сразу сузив подмножество хороших и годных сервисов.

Часть первая: Монтируем УФХ

После прочтения пары хабростатей я внезапно понял, что некоторые облачные хранилища поддерживают замечательное расширение гипертекстового протокола HTTP как WebDAV. Стандартным средством Линукс для монтирования удаленных веб ресурсов является davfs2. Данный модуль основан на модуле FUSE — файловой системы пространства пользователя (user space module). После установки модуля его нужно переконфигурировать чтобы простые смертные пользователи могли монтировать свои удаленные хранилища. Как это сделать можно легко найти в интернетах или прочитать например вот здесь. Затем нужно не забыть добавить себя в группу davfs2, например вот так:

sudo adduser IchBins davfs2

Теперь можно приступить к вдумчивому выбору сервиса УФХ. Недолго думая, выбираю Box.com. Тем более что после нескольких акции продвижения сервиса любой пользователь мог бесплатно получить целых 50ГБайт бесценного дискового пространства. Единственным недостатком сервиса является, пожалуй, наличие ограничения на максимальный размер файлов в 100МБайт для обычных пользователей (халявщиков). После бесплатной регистрации на сервисе у вас появятся такие атрибуты как — имя пользователя и пароль. Воспользуйтесь ими для доступа к файловой системе с помощью веб интерфейса сервиса, так, чисто для интереса. Теперь для облегчения процесса монтирования УФХ можно добавить в /etc/fstab следующую строку:

https://www.box.com/dav/    /home/IchBins/box.com    davfs    noauto,user    0 0

Здесь УФХ будет смонтировано в директорию ~/box.com, которая предварительно должна быть создана. Чтобы избежать необходимости вводить пароль каждый раз когда УФХ монтируется, нужно сделать следующее:

mkdir ~/.davfs2
cp /etc/davfs2/davfs2.conf ~/.davfs2
echo "use_locks    0" >> ~/.davfs2/davfs2.conf
echo "https://www.box.com/dav BoxUserName BoxPassword" > ~/.davfs2/secrets
chmod 600 ~/.davfs2/secrets

Здесь BoxUserName и BoxPassword это те атрибуты, которые тебе выдали при регистрации на сервисе, помнишь? Если ты все сделал правильно, то примонтировать и протестировать УФХ можно следующим образом:

mount /home/ichbins/box.com
echo "Eine Datei zum testen" > ~/box.com/testfile.txt
cat ~/box.com/testfile.txt

Т.е. теперь c удаленными (remote) файлами мы можем работать как с локальными

Часть вторая: Шифруемся

Теперь остается решить вопрос с шифрованием. Не все файлы полезно хранить в открытом виде на удаленном сервере, который тебе не принадлежит. Поэтому имеет смысл создать дополнительно удаленную директорию, в которой вся информация будет шифроваться на лету. Можно воспользоваться например TruCrypt и создать зашифрованный контейнер в этой директории, но размер контейнера не может превышать 100МБайт (ограничение Box.com помнишь?) и его придется постоянно перекачивать целиком чтобы изменить 2 байта. Т.е минимум 200МБайт трафика из-за 2ух байт! Тут на помощь приходит encfs. Преимуществом encfs является то, что она работает как дополнительный слой над уже существующей файловой системой, а следовательно позволяет работать с отдельными файлами, без необходимости пересылать зашифрованный контейнер целиком.
После установки encfs и добавления себя любимого в группу fuse

sudo adduser IchBins fuse

можно приступить к созданию зашифрованной директории в УФХ:

mkdir ~/box.com/crypt # директория будет создана в УФХ
mkdir ~/box.com.crypt # локальная директория куда отобразится директория выше
encfs /home/IchBins/box.com/crypt /home/IchBins/box.com.crypt # тут ~ нельзя, полный путь

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

cat /etc/passwd > ~/box.com.crypt/mypasswd
ls -la ~/box.com/crypt

На выходе (т.е в поддиректори УФХ) должно быть что-то вроде этого:

ichbins@xubuntu:~$ ls -la ~/box.com/crypt/
total 1.7K
-rw-rw-r-- 1 ichbins ichbins 1.7K May 13 15:25 FPcfOjww7ZzucMGSMgncWXEt
drwxr-xr-x 2 ichbins ichbins  368 May 13 15:25 ./
drwxr-xr-x 5 ichbins ichbins  136 May 13 15:25 ../
-rw-r--r-- 1 ichbins ichbins 1.1K Apr 14 23:24 .encfs6.xml

Таким образом любые файловый операции с файлами из локальной директории ~/box.com.crypt будут автоматически шифроваться и отправляться в УФХ.

Часть 3: Монтируем все автоматически.

Теперь осталось научиться автоматически монтировать зашифрованный раздел, после того как примонтировалась davfs. После нескольких безвозмездно потраченных часов поиска в интернетах, мне так и не удалось выяснить как в Линуксе получить сообщение от системы о том что некая файловая система примонтировалась. Единственным возможным вариантом было мониторить изменения файла /proc/mounts с помощью incrond и скрипта фильтра. Возиться с этим мне не хотелось, поэтому был написан простой скрипт:

cat ~/mount.box.com
#!/bin/sh

userhome=/home/IchBins
service=box.com
isdavmounted=$(mount | grep $service | grep davfs)
isencmounted=$(mount | grep $service | grep encfs)

if [ -n "$isencmounted" -o -n "$isdavmounted" ]; then
  #unmount
  [ -n "$isencmounted" ] &/${service}.crypt" && msg="Encfs,"
  }
  [ -n "$isdavmounted" ] &/${service}" && msg="${msg}Davfs "
  }
  if [ -n "$msg" ]; then
    notify-send -u low -i info "$service unmounting" "$msg unmouned successfuly!"
  else
    notify-send -u low -i error "$service unmounting" "Failed to unmouned $service!"
  fi
else
  #mount
  mount /${userhome}/box.com &/box.com/crypt /${userhome}/box.com.crypt/ &Encfs "
    }
  }
  if [ -n "$msg" ]; then
    notify-send -u low -i info "$service mounting" "$msg mouned successfuly!"
  else
    notify-send -u low -i error "$service mounting" "Failed to mouned $service!"
  fi
fi

Чтобы скрипт все время не запрашивал пароль к зашифрованному разделу я сделал следующее:

mkdir ~/.encfs
echo "EncfPass" > ~/.encfs/box.com
chmod 600 ~/.encfs/box.com

Таким образом encfs считывает этот пароль с помощью параметра --extpass

Так и не отыскав в интернетах правильный способ создать в Линуксе на десктопе иконку для монтирования размонтирования файловой системы, я просто создал иконку лаунчер, которая запускает вышеупомянутый скрипт и монтируюет/размонтирует файловую систему УФХ и ее зашифрованного раздела.
При успешной операции монтирования/размонтирования скрипт покажет сообщение вида:
image

ЗЫ: Пользователи убунту, а также ее производных, могут установить devfs2 и encfs прямо из Ubuntu Software Center

Автор: ichbins


  1. DeyS:

    Спасибо, заработало. Единственное, что непонятно, почему-то через браузер показывает что всего 5 гигов и 139мб занято, а в консоли df показывает, что всего 26 гигов, и занято 13 гигов

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js