Сохранение удаленных файлов Samba в корзине
Полезным функционалом файлового сервера на самбе является возможность сохранить удаленные файлы. Завершая цикл статей про файловый сервер, я расскажу про настройку корзины в samba с помощью модуля vfs_recycle. Приведу несколько полезных замечаний на основе своего опыта работы.
Введение
Наличие корзины на сетевых дисках является огромным преимуществом файлового сервера samba в сравнении с windows file server. Для меня удивительно, но до сих пор подобного функционала нет в windows, и скорее всего не будет. Там реализация сетевой корзины сделана на основе других, более сложных технологий. И не таких удобных.
За корзину, я готов самбе простить прочие неудобства, в сравнении с виндой. В некоторых случаях это является решающим преимуществом, которое склоняет чашу весов на выбор именно самбы в качестве сетевого хранилища файлов с совместным доступом.
Настраивается корзина достаточно просто. Есть некоторые моменты в процессе эксплуатации сервера. О них я расскажу отдельно. Данная статья будет написана на примере CentOS 7, но различий с другими системами нет. Все описанное без редактуры переносится на любой другой linux сервер, где используется samba.
В качестве примера настройки samba используется указанная статья. Далее я буду подразумевать,что сервер настроен по ней. Собственно, в моем примере так и будет.
Включаем сетевую корзину в Samba
Как и с логированием доступа к файлам, сетевая корзина в samba может быть настроена как глобально для всех сетевых дисков, так и для каждого в отдельности. Различия в настройке минимальны. Рассмотрим сначала вариант глобальной корзины, одной для всех. Добавляем в /etc/samba/smb.conf в секцию [global] следующие строки.
recylce:excludedir = tmp temp cache recycle:exclude = *.tmp *.temp *.o *.obj ~$* *.~?? *.log *.trace recycle:versions = Yes recycle:touch = Yes recycle:keeptree = Yes recycle:repository = /mnt/shara/.trash vfs objects = recycle
Поясню каждый параметр:
recylce:excludedir | Список исключения директорий, файлы из которых не будут попадать в корзину |
recycle:exclude | Список исключений для файлов. В данном случае указан в виде масок некоторых расширений. |
recycle:versions | Параметр отвечает за версионность удаленных файлов, если их имена совпадают. В таком случае к удаленном файлу в начале имени будет добавляться Copy #N of. |
recycle:touch | Параметр отвечает за то, будет ли указана дата изменения файла на время удаления файла, либо останется оригинальное значение файла. |
recycle:keeptree | Сохранять или нет дерево каталогов для удаленных файлов. |
recycle:repository | Указываем директорию, где будут храниться удаленные файлы. Она может располагаться где угодно. Если параметр не указан, используется значение по-умолчанию — .recycle в корне сетевого диска. |
Если вы хотите настроить корзину для каждого сетевого диска отдельно, то укажите эти же параметры в каждой сетевой шаре, указав уникальный путь для каждой корзины. И дополнительно добавьте к каждой шаре параметр:
vfs objects = recycle
Если у вас и аудит настроен для каждой шары отдельно, то не забудьте указать и этот модуль:
vfs objects = recycle full_audit
Для применения изменений необходимо перезапустить самбу.
# systemctl restart smb
Теперь можно идти и проверять работу сетевой корзины. Далее расскажу о возможных нюансах.
Дополнительные настройки vfs_recycle
Обращаю внимание на самый важный нюанс в работе сетевой корзины. У нее должны быть корректно выставлены права доступа. Чтобы все удаленные файлы гарантированно в нее попадали, у каждого пользователя должны быть права доступа к этой корзине. И вот тут возникают варианты:
- Для упрощенной настройки доступа к корзине, вы ее делаете в корне сетевой шары, чтобы все пользователи могли туда помещать свои файлы. В таком случае у всех возникает доступ ко всем удаленным файлам.
- Вы выносите сетевую корзину за пределы сетевой шары для более удобного использования сетевого пространства, либо по причине безопасности.
Расскажу подробнее о проблемах в каждом случае и расскажу, как пользуюсь корзиной сам. В первом случае возникает такая ситуация. Например, у вас есть сетевой путь /mnt/shara/документы/user1/file.txt. В директории документы много папок, как минимум по одной для каждого пользователя. Допустим, пользователь user1 первым удалил файл file.txt. В таком случае в корзину по адресу /mnt/shara/.trash/документы/user1/file.txt перемещается удаленный файл. Владельцем директории документы в корзине становится user1, так как он первый удалил файл и создал дерево директорий.
Когда другой пользователь удалит что-то в своей директории, у него может не оказаться прав доступа к к папке /mnt/shara/.trash/документы, чтобы положить туда свой удаленный файл. Вы это увидите в логе аудита. Не обязательно будет так, все зависит от конкретных настроек прав доступа. Я просто рассказываю, что так может быть и у меня часто бывает. Со временем может появиться какой-то новый пользователь с ограниченными правами, который тоже по какой-то причине не сможет положить свой удаленный файл в корзину.
Чтобы исправить такую ситуацию, на корзину нужно давать всем права доступа. Но корзина то у нас лежит в корне шары. Если сделать так, то каждый пользователь сможет увидеть удаленные файлы другого пользователя, к которым в обычном режиме у него нет прав доступа. Конечно, можно скрыть корзину следующим образом. Во-первых, у нее имя начинается с точки. В таком случае в свойствах шары можно указать параметр:
hide dot files = yes
Все директории с точкой в начале становятся скрытыми. Но это слабая защита. Пользователь вручную может включить у себя отображение скрытых директорий и увидеть спрятанную корзину. Такой вариант не надежный.
Для того, чтобы не решать эти проблемы с правами доступа в корзине, я ее убираю из шары и храню отдельно. Там я без проблем ставлю всем права доступа, не переживая, что кто-то получит доступ к файлам, ему не принадлежащим. Далее в зависимости от обстоятельств, я либо ничего не делаю, если достаточно доступа к корзине через консоль сервера. Если же этого не достаточно, то делаю отдельную шару, в которой в качестве сетевой папки указываю нашу корзину. И уже на уровне шары настраиваю права доступа к ней. В самом простом случае по ip ограничиваю доступ для системного администратора.
Возможно, существует более красивый и удобный способ разрешения данной проблемы. Я не занимался его поиском или настройкой. Обычно делаю так, как описал. Корзину для пользователей не афиширую, чтобы аккуратнее работали и не надеялись на то, что файл можно быстро и без проблем восстановить. Иначе могут задергать постоянными запросами на восстановление. Эту задачу обычно делегирую на системных администраторов на местах.
Автоматическая очистка корзины
Чуть не забыл об очистке корзины. Тут я ничего не придумываю, а просто использую команду find с ключами, которая удаляет все файлы, старше определенного срока. Обычно чищу все, что старше 30 дней примерно такой командой:
/usr/bin/find /mnt/shara/.trash/ -type f -mtime +30 -exec rm -rf {} \;
Создаю скрипт с этой командой и добавляю в cron на ежедневное исполнение.
#Clean trash 7 21 * * * root /root/bin/trash-clean.sh
Этого достаточно для очистки корзины.
Заключение
Я рассмотрел основные моменты по самбе:
- Простая настройка с доступом по ip или системными пользователями.
- Настройка samba с интеграцией с AD и windows acl.
- Логирование доступа к файлам.
В заключение рассказал о сетевой корзине. На этом завершу цикл статей о самбе, так как он мне видится законченным в таком виде.