WebDav+eСryptFS
Зачем?
Чтоб использовать Яндекс.Диск или другие публичные файлопомойки с WebDAV-доступом для безопасного хранения приватной информации.
А в чем проблемы?
eCryptFS принадлежит к классу pseudo-filesystems, т.е. к файловым системам, которые работают прослойкой поверх обычных ФС. Но davfs2 относится к сетевым стековым файловым системам, которые несовместимы с eCryptFS.
Поэтому нужно использовать фс-враппер - bindfs. Она скроет все несовместимости, хоть и вызовет некоторые неудобства.
Достоинства
- Прозрачное для пользователя шифрование информации, хранимой на сервисах третьих лиц.
- Особенностью eCryptFS является то, что к примонтированной ФС доступ имеет только один локальный пользователь - тот, кто выполнил монтирование. Другие локальные пользователи компьютера не могут получить прямой доступ к расшифрованным данным на примонтированной пользователем eCryptFS.
- Возможность доступа к данным с нескольких рабочих мест.
Недостатки
- Нетривиальность решения.
- Плохая переносимость между различными платформами: eCryptFS доступна только под Linux и FreeBSD.
- Зашифрованные имена файлов и папок имеют префиксы вида ECRYPTFS_FNEK_ENCRYPTED и значительно бОльшую длину (от ~70 символов). Это может привлекать внимание третьих лиц или вызывать проблемы несовместимости соответственно.
- Зашифрованные файлы не являются однородными двоичными файлами. Формат каждого зашифрованного файла легко идентифицируется по заголовку и метаданным как eCryptFS-криптоконтейнер.
Софт
Используем дистрибутив Archlinux. Нужно доустановить:
- davfs2 - утилиты для монтирования удаленных хранилищ через WebDAV
- ecryptfs-utils - утилиты для работы с ecryptfs.
- bindfs - аналог mount -o bind, но работает через fuse, то есть полноценный костыль. bindfs нужен, потому что есть проблемы со скрещиванием 1 и 2.
# yaourt -S davfs2 bindfs ecryptfs-utils
Настройка davfs2
- Создаем точку монтирования для WebDAV-ресурса
# mkdir /mnt/yad
- Редактируем /etc/davfs/secrets. Добавляем строчку с точкой монтирования, именем и паролем для webdav-ресурса:
/mnt/yad my_username my_password
- Редактируем /etc/fstab. Добавляем точку монтирования:
https://webdav.yandex.ru/ /mnt/yad davfs user,uid=user1,gid=user1,file_mode=600,dir_mode=700,rw,noexec,nosuid 0 0
где user1 поменять на uid/gid локального юзера, который будет пользоваться этим webdav-ресурсом. - Монтируем:
mount /mnt/yad
- На webdav-ресурсе создаем поддиректорию data, чтобы не засорять корень точки монтирования зашифрованными файлами:
mkdir /mnt/yad/data
Подготовка eCryptFS
По настройке eCryptFS есть очень много документации (например в Archwiki), поэтому просто воспользуемся дефолтовым скриптом для настройки локальной шифрованной директории eCryptFS. От простого пользователя (т.е. от вышеупомянутого user1) запускаем
$ ecryptfs-setup-private
и отвечаем на пару элементарных вопросов касательно паролей.
В результате работы скрипта, в домашней директории пользователя user1 появятся три новые поддиректории:
- ~/.Private - пока пустая папка. Сюда будут попадать зашифрованные файлы с зашифрованными именами.
- ~/Private - пользовательская точка монтирования eCryptFS. Изначально, она не примонтирована и содержит пару ознакомительных файлов.
- ~/.ecryptfs - файлы, необходимые для монтирования, в том числе пароль. Имеет права 700.
Пока ничего не монтируем никуда.
bindfs
- В файле /etc/fuse.conf убеждаемся, что строка user_allow_other раскомменчена.
- Монтируем одну папку в другую:
$ bindfs /mnt/yad/data -o noatime /home/user1/.Private
Теперь изменения, происходящие в /home/user1/.Private, на самом деле перенаправляются в /mnt/yad/data, а eCryptFS работает надежно и без ошибок.
Монтирование eCryptFS и проверка
$ ecryptfs-mount-private $ ls /mnt/yad/data И ничего нет $ touch ~/Private/abcdef $ ls /mnt/yad/data ECRYPTFS_FNEK_ENCRYPTED.ABVCy.SDFHTHRDSTHSdgfhdthdRH5454ye4hHGFDGHrh6rhedrhdRTh46--
На последней строчке - имя зашифрованного файла на webdav-ресурсе, который является шифрованной копией файла abcdef.
Скрипт быстрого монтирования
Для автоматизации рутинных действий ручного монтирования можно использовать следующий скрипт. Перед созданием скрипта делаем это:
# cd /home/user1 # umount Private # cd Private # touch mount # chmod +x mount # chown user1:user1 mount
В созданный файл ~/Private/mount записываем следующий скрипт:
#!/bin/bash YAD_ROOT=/mnt/yad PRIV_ROOT=$HOME/.Private YAD_DATA=$YAD_ROOT/data ## модуль ecryptfs загружен? lsmod | grep ecryptfs >/dev/null || sudo modprobe ecryptfs ## webdav-ресурс примонтирован? mountpoint -q "$YAD_ROOT" || mount $YAD_ROOT ## bindfs сделан? mountpoint -q "$PRIV_ROOT" || bindfs $YAD_DATA -o noatime $PRIV_ROOT ## и теперь монтируем ecryptfs ecryptfs-mount-private
На несколько компьютеров
Чтобы использовать зашифрованный ресурс на другом компьютере, нужно повторить вышеописанные шаги. Но если при вызове ecryptfs-setup-private вы выбрали случайный пароль для шары, то нужно будет дополнительно скопировать файлы ~/.ecryptfs/wrapped-passphrase и ~/.ecryptfs/Private.sig с исходного компьютера на целевой.