- PVSM.RU - https://www.pvsm.ru -

davfs2 и encfs на box.com

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

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

Вступление

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

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

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

sudo adduser IchBins davfs2

Теперь можно приступить к вдумчивому выбору сервиса УФХ. Недолго думая, выбираю Box.com [6]. Тем более что после нескольких акции продвижения сервиса любой пользователь мог бесплатно получить целых 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 [7]. Преимуществом 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


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/7507

Ссылки в тексте:

[1] табличка в Википедии: http://en.wikipedia.org/wiki/Comparison_of_online_backup_services

[2] WebDAV: http://en.wikipedia.org/wiki/WebDAV

[3] davfs2: http://savannah.nongnu.org/projects/davfs2

[4] FUSE: http://fuse.sourceforge.net/

[5] вот здесь: http://sysblogd.wordpress.com/2007/09/09/ubuntu-mounting-remote-filesystem-using-davfs2-fuse/

[6] Box.com: http://box.com/

[7] encfs: http://www.arg0.net/encfs