LINUX.ORG.RU
решено ФорумAdmin

Юнит systemd для EncFS

 ,


0

2

Всё работает, если монтировать EncFS руками:

ENCFS6_CONFIG=/etc/encfs/.encfs6.xml \
encfs /var/webdav/yandex.disk.union/yandex.disk.00000 \
/mnt/yandex.disk --extpass=" cat /etc/encfs/passwd"
В файле /etc/encfs/passwd, соответственно находится пароль шифрования.

Вопрос такой: как должен выглядеть работающий юнит для systemd, чтобы шифрование подключалось при загрузке системы?

Сейчас получается что-то вроде этого: /etc/systemd/system/mnt-yandex.service

[Unit]
Description=Enable EncFS for /mnt/yandex.disk
Requires = var-webdav-yandex.disk.union.mount
After    = var-webdav-yandex.disk.union.mount

[Service]
Type=oneshot
Environment=ENCFS6_CONFIG=/etc/encfs/.encfs6.xml
ExecStart=/usr/bin/encfs --extpass=" /bin/cat /etc/encfs/passwd" /var/webdav/yandex.disk.union/yandex.disk.00000 /mnt/yandex.disk

*.mount юниты отрабатывают корректно, каталоги все существуют...

Юнит не работает systemctl start mnt-yandex.service выдаёт ошибку, словно у программы encfs были заданы неверные аргументы.

Предполагаю, что не отрабатывает --extpass=" /bin/cat /etc/encfs/passwd"

Пробовал

ExecStart=/bin/echo "ПарольШифрования" | /usr/bin/encfs --stdinpass /var/webdav/yandex.disk.union/yandex.disk.00000 /mnt/yandex.disk
Тоже не работает.

Пробовал сделать скрипт

#!/bin/bash 
ENCFS6_CONFIG=/etc/encfs/.encfs6.xml \
encfs /var/webdav/yandex.disk.union/yandex.disk.00000 \
/mnt/yandex.disk --extpass=" cat /etc/encfs/passwd"
и запустить его через ExecStart, тоже не взлетело.

Какие ещё можно придумать варианты?

★★★★★

--extpass=" /bin/cat /etc/encfs/passwd"
--extpass=" cat /etc/encfs/passwd"

Можно придумать вариант почитать ман по sh в области «как поиметь вывод команды в переменную».

thesis ★★★★★
()
Ответ на: комментарий от intelfx

Во как. Облажался, стало быть, прошу прощения у ТСа.

thesis ★★★★★
()

Не нужно юниты, можно просто в /etc/fstab дописать:

/etc/davfs2/encfs-wrapper#/mnt/yadisk/crypted   /mnt/crypted            fuse            noauto,x-systemd.automount,_netdev,rw,uid=1000,gid=100
Где /etc/davfs2/encfs-wrapper - исполняемый скрипт вида:
#!/usr/bin/sh
encfs --public --extpass="cat /etc/davfs2/encfs.passwd" $*

disarmer ★★★
()
Ответ на: комментарий от Jurik_Phys

Ага.

Первый вариант, с --stdinpass, заработать не может никак, поскольку systemd — это не шелл, и символ вертикальной черты он не обрабатывает. Т. е. строчка ExecStart= интепретируется как запуск echo с параметрами | /usr/bin/encfs ....

Во втором варианте попробуй взять в кавычки весь аргумент --extpass, потому что, опять же, я сомневаюсь, что systemd умеет обрабатывать кавычки в середине слова:

ExecStart=/usr/bin/encfs "--extpass= /bin/cat /etc/encfs/passwd" ...
intelfx ★★★★★
()

Нашёл вариант запуска EncFS через /bin/sh:

 [Service]
 Type=oneshot
 RemainAfterExit=true
 Environment=RootDir=/home/.encfs/crypt
 Environment=MountPoint=/home/crypt
 ExecStart=/bin/sh -c "systemd-ask-password --no-tty --timeout=30 'Unlock
 EncFS' | encfs --stdinpass $RootDir $MountPoint"
 ExecStop=/bin/umount $MountPoint

Переделал строку запуска через --stdinpass (в окружении работает):

export ENCFS6_CONFIG=/etc/encfs/.encfs6.xml; cat /etc/encfs/passwd | encfs --stdinpass /var/webdav/yandex.disk.union/yandex.disk.00000 /mnt/yandex.disk

По идее, вариант должен сработать, но что-то пока не желает...

ExecStart=/bin/sh -c "export ENCFS6_CONFIG=/etc/encfs/.encfs6.xml; cat /etc/encfs/passwd | encfs --stdinpass /var/webdav/yandex.disk.union/yandex.disk.00000 /mnt/yandex.disk"

Jurik_Phys ★★★★★
() автор топика

В файле /etc/encfs/passwd, соответственно находится пароль шифрования.

facepalm.rot13

anonymous
()
Ответ на: комментарий от anonymous

Что не нравится анониму?

Шифрование вводится для защиты от дяди в облаке. Доступа к машине с паролем у дяди нет, все Ок.

Jurik_Phys ★★★★★
() автор топика

Ох, уж это SystemD

mkdir /mnt/root
mkdir /mnt/mount
encfs /mnt/root /mnt/mount

После первого запуска просят ввести пароль, например, «test», сохраняем его в файл

echo test > /mnt/pass

Создаём для теста файл в зашифрованном разделе и смотрим результат.

echo "test" > /mnt/mount/file.txt
ls /mnt/mount/
ls /mnt/root/

Видно, что корневой каталог /mnt/root содержит шифрованные даныне, /mnt/mount расшифрованные.

Отмонтируем каталог /mnt/mount

 fusermount -u /mnt/mount

Shell-скрипт, монтирования каталога mnt-mount.sh (полный путь может отличаться, в данном случае Debian 8.2):

echo -e '#!/bin/sh \n/bin/cat /mnt/pass | /usr/bin/encfs --stdinpass /mnt/root /mnt/mount' > mnt-mount.sh
Даём ему права на запись:
chmod 755 mnt-mount.sh

Монтируем шифрованный каталог с помощью скрипта:

./mnt-mount.sh

Смотрим, что всё заработало:

ls /mnt/mount

Отмонтируем каталог после теста скрипта /mnt/mount

 fusermount -u /mnt/mount
Вывод: скрипт работоспособный.

Переходим к SystemD и создаём юнит (/etc/systemd/system/mnt-mount.service) следующег содержания:

[Unit]
Description=Enable EncFS for /mnt/mount
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/mnt/mnt-mount.sh 

[Install]
WantedBy=multi-user.target
Видно, что это самый простейший юнит запускающий скрипт и всё. Перезагружаем содержимое юнитов
systemctl daemon-reload

Запускаем mnt-mount.service

systemctl start mnt-mount.service
Если каталог не забыли отмонтировать, то запуск произойдёт тихо без каких-либо сообщений. Статус:
systemctl status -l mnt-mount.sh
После чего SystemD считает, что оно молодец и всё сделало правильно:
● mnt-mount.service - Enable EncFS for /mnt/mount
   Loaded: loaded (/etc/systemd/system/mnt-mount.service; enabled)
   Active: inactive (dead) since Пн 2015-11-02 17:19:28 MSK; 24s ago
  Process: 2008 ExecStart=/mnt/mnt-mount.sh (code=exited, status=0/SUCCESS)
 Main PID: 2008 (code=exited, status=0/SUCCESS)

Однако ничего не работает

ls /mnt/mount 
ls: невозможно получить доступ к /mnt/mount: Конечная точка передачи не подсоединена

Jurik_Phys ★★★★★
() автор топика

Решение найдено!!!

Спасибо Арче вики. Требуется в секцию [Service] добавить параметр RemainAfterExit=yes.

Объяснение, как я понял:

Type=oneshot: полезен для скриптов, которые выполняют одно задание и завершаются. Вам может понадобиться также установить параметр RemainAfterExit=yes, чтобы systemd по-прежнему считала процесс активным, даже после его завершения

Похоже, что SystemD убивало процесс encfs после отработки запуска, но шифрование процесс перманентный. Получалось, через механизм fuse каталог оставался примонтирован, а процесс, обрабатывающий события в каталоге прибит. Отсюда и ошибка доступа.

Осталось прописать команду остановки сервиса, разобраться как корректно установить переменную среды и юнит готов к употреблению.

Jurik_Phys ★★★★★
() автор топика
Ответ на: комментарий от yurikoles

Можно, просто было ни к чему... В виртуалке работа в основном от рута, а ssh по умолчанию рута через пароль не даёт. Virt-manager проще сразу после установки, хотя если копать глубже, без ssh не обойтись.

Jurik_Phys ★★★★★
() автор топика
31 мая 2017 г.
Ответ на: комментарий от anonymous00

Давно было, если комментарий гласит, что решение найдено, значит найдено.

Но вся подоплека была с целью заиметь несколько аккаунтов яндекс.диска, объединить их в общий каталог, настроить на нем шифрование и использовать для бекапов. Однако davfs в линуксе однопоточный и доступ к объединенному каталогу происходит очень медленно.

В общем,бекапы делаю на отдельностоящий компьютер, от облака отказался из-за тормозов.

Jurik_Phys ★★★★★
() автор топика
Ответ на: комментарий от Jurik_Phys

Благодаря твоему треду написал свою рабочую реализацию. Может, кому пригодится. Юнит:

[Unit] 
Description=EncFS docs

[Service]
ExecStart=/usr/bin/encfs -f --extpass="/home/anonymous/scripts/read_encfs.sh" /home/anonymous/Nextcloud/.encrypted /home/anonymous/docs
ExecStop=/usr/bin/fusermount -u /home/anonymous/docs
RemainAfterExit=yes


[Install] 
WantedBy=default.target

Скрипт /home/anonymous/scripts/read_encfs.sh

#!/bin/sh
/bin/cat ~/secure/encfs.password

В принципе, можно попробовать без RemainAfterExit=yes, так как encfs запускается в foreground, а не в режиме демона.

anonymous00 ★★
()

Моя окончательная рабочая версия юнита:

[Unit] 
Description=EncFS docs

[Service]
ExecStart=/usr/bin/encfs -f --extpass="/bin/cat ~/secure/encfs.password" %h/Nextcloud/.encrypted %h/docs
ExecStop=/usr/bin/fusermount -u %h/docs


[Install] 
WantedBy=default.target

Пароль лежит plain-text в ~/secure/encfs.password.

anonymous00 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.