gocryptfs — шифрованная файловая система в пространстве пользователя. Она не шифрует диск целиком: вы создаёте каталог-контейнер, монтируете его и работаете с файлами как обычно. Шифруются и содержимое, и имена файлов, а на диске остаётся набор нечитаемых файлов. Это удобно для облачной синхронизации и для защиты данных украденного ноутбука.
Установка и требования
Нужны FUSE и сам пакет gocryptfs. В большинстве дистрибутивов FUSE уже собран в ядре, а пользовательские утилиты стоят по умолчанию. Проверьте версию: ветка 2.x актуальна и содержит команду проверки целостности.
sudo apt install gocryptfs fuse3
sudo dnf install gocryptfs fuse3
gocryptfs -version
fusermount3 --version
В старых системах утилита называется fusermount без тройки. Права root для работы не нужны: контейнер монтируется от вашего пользователя, а доступ к нему регулируется обычными правами файлов.
Создание контейнера
Шифрованный каталог должен быть пустым, точка монтирования — тоже. При инициализации gocryptfs создаёт файл gocryptfs.conf с зашифрованным мастер-ключом и просит пароль. Пароль нигде не хранится, восстановить его нельзя; без gocryptfs.conf не восстановить и мастер-ключ.
mkdir -p ~/cipher ~/plain ~/vault
gocryptfs -init ~/cipher
gocryptfs -speed
gocryptfs -init -scryptn 18 ~/vault
Параметр -scryptn повышает стоимость перебора пароля, но увеличивает время разблокировки. Значение 18 — разумный компромисс для слабых машин; на быстром процессоре можно оставить 16. Команда -speed показывает скорость шифрования с учётом AES-NI и полезна, чтобы понять, хватит ли производительности для больших файлов.
Монтирование и работа
После монтирования в ~/plain появляется обычный каталог: создавайте файлы, редактируйте, удаляйте. Всё, что записано, шифруется на лету. Размонтирование желательно перед копированием контейнера и обязательно перед выключением, иначе часть данных останется в кэше.
gocryptfs ~/cipher ~/plain
gocryptfs -idle 15m ~/cipher ~/plain
fusermount3 -u ~/plain
mount | grep gocryptfs
Ключ -idle автоматически размонтирует контейнер после указанного простоя — хорошая страховка, если вы забыли закрыть сеанс. Для доступа другим пользователям нужен -allow_other и строка user_allow_other в /etc/fuse.conf; включайте это только осознанно.
Что видно снаружи
gocryptfs скрывает содержимое и имена, но не размеры файлов, их количество и структуру каталогов. Сторонний наблюдатель видит, что в контейнере есть данные, сколько файлов и какого они размера. Это принципиальное ограничение любого шифрования на уровне файловой системы.
- Имена файлов и каталогов зашифрованы.
- Содержимое защищено AES-256-GCM.
- Размеры, количество и время изменения остаются заметны.
- Факт наличия контейнера скрыть нельзя.
Если метаданные критичны, используйте контейнер целиком в образе диска или полнодисковое шифрование. Для защиты от кражи ноутбука и от любопытного облачного провайдера возможностей gocryptfs обычно достаточно.
Отдельно учтите, что программа, запущенная от вашего пользователя, видит расшифрованные файлы. Шифрование защищает диск и резервные копии, но не заменяет антивирус и не спасает от вредоносного кода в активном сеансе.
Автоматизация и удобство
Пароль можно передавать через внешнюю программу ключом -extpass, например через keyring рабочего стола. Это удобнее ручного ввода, но пароль оказывается в хранилище сеанса. Для постоянной работы соберите user-юнит systemd — он запустит монтирование при входе и размонтирует контейнер при выходе. Файл ~/.config/systemd/user/gocryptfs.service:
[Unit]
Description=Шифрованный контейнер gocryptfs
[Service]
Type=simple
ExecStart=/usr/bin/gocryptfs -f -idle 15m -extpass "/usr/bin/secret-tool lookup service gocryptfs" %h/cipher %h/plain
ExecStop=-/usr/bin/fusermount3 -u %h/plain
Restart=on-failure
[Install]
WantedBy=default.target
Пароль предварительно положите в keyring командой secret-tool store —label=gocryptfs service gocryptfs. После сохранения юнита включите его и проверьте статус:
systemctl --user daemon-reload
systemctl --user enable --now gocryptfs.service
systemctl --user status gocryptfs.service
Проверьте, что secret-tool возвращает пароль в неинтерактивном сеансе: демон пользователя не всегда имеет доступ к разблокированному keyring. Если это не работает, оставьте ручной ввод — надёжнее, чем хранить пароль в открытом файле.
Резервные копии
Копировать нужно шифрованный каталог, а не точку монтирования. Пока контейнер размонтирован, ~/cipher можно архивировать и синхронизировать любым способом. Обязательно сохраните gocryptfs.conf отдельно: без него данные не восстановить даже при известном пароле.
fusermount3 -u ~/plain
rsync -a --delete ~/cipher/ /mnt/backup/cipher/
cp ~/cipher/gocryptfs.conf /mnt/backup/gocryptfs.conf.bak
sha256sum ~/cipher/gocryptfs.conf
Не отправляйте в облако расшифрованный каталог: смысл схемы теряется. Если синхронизация идёт постоянно, помните, что незавершённая запись может дать повреждённый файл — версионные бэкапы надёжнее зеркала. Когда контейнер лежит на внешнем SSD, размонтируйте его перед отключением кабеля: иначе кэш не успеет записаться и появится ошибка ввода-вывода.
Проверка целостности
Команда -fsck проверяет размонтированный шифрованный каталог и сообщает о повреждённых файлах. Запускайте её после сбоев питания и перед важным копированием. Учтите, что проверка не восстанавливает данные, а только диагностирует.
gocryptfs -fsck ~/cipher
gocryptfs -passwd ~/cipher
gocryptfs -ro ~/cipher ~/plain
lsof +D ~/plain
Смена пароля перешифровывает мастер-ключ, но не сами файлы. Режим -ro монтирует контейнер только для чтения — полезно, когда нужно посмотреть архив, не рискуя что-то изменить. Если размонтирование не проходит, найдите процессы с открытыми файлами через lsof или fuser. Следите за свободным местом: заполненный диск даёт ошибки записи и может повредить файлы внутри контейнера.
Диагностика
- «mountpoint is not empty» — точка монтирования должна быть пустой.
- «fuse: device not found» — не загружен модуль fuse или нет прав.
- Медленная работа — проверьте -speed и размер файлов, FUSE даёт накладные расходы.
- Контейнер не открывается — сверьте пароль и сохранность gocryptfs.conf.
- Ошибка ввода-вывода — сначала размонтируйте, затем запустите -fsck.
Не монтируйте контейнер с сетевых файловых систем и не храните его внутри каталога, который сам синхронизируется в момент записи. Для диагностики используйте dmesg и journalctl —user -b: они показывают ошибки FUSE и таймауты.
Чек-лист
- Пароль длинный и уникальный, есть менеджер паролей.
- Копия gocryptfs.conf лежит отдельно от контейнера.
- Контейнер размонтирован перед бэкапом и выключением.
- В облако уходит только шифрованный каталог.
- Проверка -fsck выполняется после сбоев.
Итог
gocryptfs даёт прозрачное шифрование отдельной папки без разметки диска и переустановки системы. Он хорошо ложится на облачные диски и внешние носители, но не скрывает метаданные и не защищает данные, пока контейнер смонтирован. Держите резервную копию конфига, размонтируйте контейнер после работы и проверяйте целостность — тогда схема будет надёжной.