davfs2 и encfs на box.com

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

Хочу поделиться с тобой сокровенными знаниями, а также пополнить запасы своих. Так вот, все началось с того, что проект 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" ] && {
    fusermount -u "/${userhome}/${service}.crypt" && msg="Encfs,"
  }
  [ -n "$isdavmounted" ] && {
    umount "/${userhome}/${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 && {
    msg="Davfs,"
    encfs --extpass="cat ~/.encfs/$service" /${userhome}/box.com/crypt /${userhome}/box.com.crypt/ && {
      msg="${msg}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

ЗЫ: Пользователи убунту, а также ее производных, могут установить davfs2 и encfs прямо из Ubuntu Software Center
Правка 1: не считайте статью рекламой конкретного сервиса УФХ, просто Бокс.ком попался первым под руку. Можно использовать любой сервис, у которого есть доступ по WebDAV, например Яндекс.Диск (ЯД дает бесплатно 10ГБайт)
Правка 2: Я слегка изменил скрипт автоматической монтировки УФХ, чтобы он был более универсален и позволял в качестве параметра задавать сервис. Дабы не вносить серьезных изменений в оригинальную статью, я поместил исходник скрипта сюда
Поделиться публикацией

Комментарии 14

    0
    А как у них с коростью? Можно использовать для бэкапов? Читал гдето у них что есть ограничение на размер файла.
      0
      Ограничений на размер файла нет, но у меня лично он несколько странно работает. Т.е. я могу скопировать пару файлов, потом получая input/output error. Предвосхищая вопрос, отвечу, что use_blocks стоит на 0 а все операции проводятся через консоль.
      0
      У кого у них? Если вопрос о бокс.ком, то статья не о них, а о методологии. Использовать можно любой сервис поддрживающий WebDAV. Для пользователей из России удобнее всего использовать яндекс диск — он вроде поддерживает WebDAV.
        0
        У Яндекса в соглашении ясно написано, что щифрование использовать никак нельзя. Даже архивы.
        0
        когда-то проходил этот квест. трансфер файлов в/из davfs ужасно глючит, по крайней мере в наутилусе юбунты. единственный адеквактный клиент с которым смог работать — cadaver.
          0
          у меня ксубунту и thunar, глюков пока не заметил
          0
          Проблема в том, что всё это не кешируется локально как в дропбоксе.
            0
            уточните что конкретно не кешируется. Но для начала беседы — man davfs2.conf -> Cache Related Options
              0
              Дропбокс хранит локальную копию всех файлов и обменивается с сервером только дельтами. Это значительно увеличивает юзабилити всего этого дела. Вебдав так принципиально не умеет. Вот если бы rsync, тогда да.

              Но, к сожалению, кроме своего велосипеда я ничего не видел, чтобы удовлетворяло мои требования. Дропбокс хорош, но клинет бинарный и закрытый, что меня никак не устраивает.
            0
            Добавлю свои пять копеек:
            У меня скрипт делает немного иначе:
            # Проверяем примонтирован ли yandex disk к директории если да, то отключаем 
            if grep -q "ya.disk" /proc/mounts; then
            # Выводим сообщение в области уведомлений.
            notify-send -u normal "Yandex Disk" "На данный момент примонтирован \n ОТМОНТИТРОВАНИЕ !" 
            # Отключаем шифрованный раздел
            # пользователь должен быть в группе fuse
            fusermount -u /home/user/ya.disc.encrypted 
            # Отмонтируем Диск с правами пользователя
            # в /etc/fstab , в парметрах монтирования должен быть параметр user (все параметры: rw,uid=1000,gid=1000,user,noauto)
            umount /home/andrey/ya.disk
            # если не примонтирован
            else
            # Выводим сообщение в области уведомлений.
            notify-send -u normal "Yandex Disk" "Не примонтирован"
            # Спрашиваем пароль шифрования во всплывающем окне
            pass=$(zenity --password  --title "Пароль от EncFS" )
            # Монтируем яндекс диск с учётными данными из /etc/davfs2/secrets
            mount /home/andrey/ya.disk
            # Подключаем шифрованную папку
            echo $pass | encfs -S -o uid=1000,gid=1000 /home/andrey/ya.disk/encrypted/ /home/andrey/ya.disc.encrypted/
            # Ждём (lol)
            ping ya.ru -c 1
            # Выводим сообщение в области уведомлений
            notify-send -u normal "Yandex Disk" "Успешно примонтирован"
            fi
            
            
              0
              sleep 1
              :)
              0
              Спасибо за статью, штудировал как настольный справочник :)
              Благодаря ей настроил yandex.disk и навесил на него синхронизацию с локальными папками а-ля дропбокс (rsync — encfs — davfs2 — webdav.yandex.ru)

              С box.com не удалось сдружиться из-за его неприязни к кириллице в именах файлов, причем через веб-морду все прекрасно поддерживается, а вот по webdav — сразу же после закачки файла, при листинге файлов видим удаление кириллических символов из имени файла.

              Сталкивался ли автор с такой проблемой?
              Не подскажет ли кто, это у меня руки кривые и есть магическая настройка или все же это ограничения сервиса?

                0
                Пытаюсь таким образом смонтировать OneDrive.

                [root@oracle2 ~]# cat /etc/fstab | grep /mnt/cloud
                d.docs.live.net/C714EF83A3FDFAD0 /mnt/cloud davfs user,noauto,uid=username,file_mode=600,dir_mode=700 0 1
                [root@oracle2 ~]# mount /mnt/cloud/
                /sbin/mount.davfs: Mounting failed.
                302 Found

                Кто-нибудь сталкивался с такой ошибкой?
                  0
                  Да. Вроде у Microsoft'а какой-то хитрый протокол аутентификации, который davfs2 не поддерживает.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое