WebDav eСryptFS - dim13/lor GitHub Wiki
Чтоб использовать Яндекс.Диск или другие публичные файлопомойки с 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.
- Создаем точку монтирования для 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 есть очень много документации (например в Archwiki), поэтому просто воспользуемся дефолтовым скриптом для настройки локальной шифрованной директории eCryptFS. От простого пользователя (т.е. от вышеупомянутого user1) запускаем
$ ecryptfs-setup-private
и отвечаем на пару элементарных вопросов касательно паролей.
В результате работы скрипта, в домашней директории пользователя user1 появятся три новые поддиректории:
- ~/.Private - пока пустая папка. Сюда будут попадать зашифрованные файлы с зашифрованными именами.
- ~/Private - пользовательская точка монтирования eCryptFS. Изначально, она не примонтирована и содержит пару ознакомительных файлов.
- ~/.ecryptfs - файлы, необходимые для монтирования, в том числе пароль. Имеет права 700.
Пока ничего не монтируем никуда.
- В файле /etc/fuse.conf убеждаемся, что строка user_allow_other раскомменчена.
- Монтируем одну папку в другую: $ bindfs /mnt/yad/data -o noatime /home/user1/.Private
Теперь изменения, происходящие в /home/user1/.Private, на самом деле перенаправляются в /mnt/yad/data, а 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 с исходного компьютера на целевой.