Сохранение удаленных файлов Samba в корзине

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

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Введение

Наличие корзины на сетевых дисках является огромным преимуществом файлового сервера 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

Обращаю внимание на самый важный нюанс в работе сетевой корзины. У нее должны быть корректно выставлены права доступа. Чтобы все удаленные файлы гарантированно в нее попадали, у каждого пользователя должны быть права доступа к этой корзине. И вот тут возникают варианты:

  1. Для упрощенной настройки доступа к корзине, вы ее делаете в корне сетевой шары, чтобы все пользователи могли туда помещать свои файлы. В таком случае у всех возникает доступ ко всем удаленным файлам.
  2. Вы выносите сетевую корзину за пределы сетевой шары для более удобного использования сетевого пространства, либо по причине безопасности.

Расскажу подробнее о проблемах в каждом случае и расскажу, как пользуюсь корзиной сам. В первом случае возникает такая ситуация. Например, у вас есть сетевой путь /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

Этого достаточно для очистки корзины.

Заключение

Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Я рассмотрел основные моменты по самбе:

В заключение рассказал о сетевой корзине. На этом завершу цикл статей о самбе, так как он мне видится законченным в таком виде. Если вы считаете, что есть еще что-то интересное и полезное на эту тему, делитесь в комментариях.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

35 комментариев

  1. Как только добавляю в файл vfs objects = recycle, сразу попадает доступ у всех к шарам. Если добавляю в global, то ко всем шарам, если в отдельную шару, то только к ней. Что может быть?

  2. Господа, решил сделать корзину у себя и упёрся в следующее.
    пока я делаю recycle:repository = .recycle/%U - всё прекрасно работает

    как только я хочу вынести корзину за пределы шары ,
    например в корень recycle:repository = /.recycle/%U
    или в любую другую папку, например /home/.recycle/%U
    дерево папок успешно создаётся с правами пользователя, который удалил файл, но сам файл не переносится
    в итоге в любом месте, кроме корня шары у меня вместо хранилища удалённых файлов получается забавная заметка о том кто из какой папки удалил "что-то"
    права для верности я выставил 777, но не понимаю как в них может быть проблема, так как папки то успешно создаются.

    • А всё, отбой, разобрался, нашёл на забугорном сайте инфу. Оказалось проблема в том, что я пытался кидать мусор на другой физический диск.
      суть в чём, если кому интересно
      вот это вот барахло "vfs objects = recycle" не умеет работать между разными физическими устройствами, так как файлы в корзину у нас оказывается не переносятся, как например через MV, а переименовываются....
      а умеет другое барахло "vfs objects = crossrename"
      так что делаем вот так

      vfs objects = recycle crossrename

      и всё работает, теперь в качестве хранилища для мусора можно использовать другой физический диск.
      может быть с этим связаны какие то нюансы, но я пока их не понял, вроде всё хорошо.

      если кому надо можно ограничить максимальный размер такого переноса например 500 мегабайт

      crossrename:sizelimit = 500

  3. Максим

    "проблемы с правами доступа в корзине" затрагиваются в статье и в комментариях. Сам столкнулся с проблемой создания структуры каталогов.
    Подсказал знающий человек за такой параметр:
    recycle:directory_mode = 2770 (использую в общем ресурсе для группы пользователей)
    по умолчанию эта маска равна 0700
    заглянул в документацию (https://www.samba.org/samba/docs/current/man-html/vfs_recycle.8.html)
    есть еще
    recycle:subdir_mode = MODE можно использовать для большей гибкости

    • Какую конкретно проблему помогли решить эти права?

      • Максим

        при recycle:keeptree = yes удаление файла в корзину сопровождается воссозданием в корзине структуры каталогов из общего ресурса. По умолчанию в корзине эти каталоги создаются с правами 0700, т.е. к файлу доступ только у того, кто его удалил. Но это полбеды. Другой пользователь из того же каталога общего ресурса файл в корзину уже удалить не сможет, т.к. удаленный файл должен попасть в уже созданные в корзине каталоги, а доступ к ним только у владельца (0700). С указанным параметром, всё становится на места.

  4. При удалении файла он помещается в корзину, естественно, с текущим таймштампом.
    Прислали юзеру важный файл трехмесячной давности, он его неосторожно почикал, а после работы такой чистки завтра в корзине его уже не найти.
    Всем советую и сам чищу корзину более аккуратными скриптами.

    • А какими скриптами вы чистите?

      • Аноним

        Самописными.
        Наверное, есть хорошие, но, в силу невежества и лени ...
        Если интересно, могу вывесить

        • Понятно, что самописными. Я просто не понял, если брать за основу не дату создания файла, то что? Дату изменения, обращения к файлу? Что еще?

          • Время появления файла в этом месте.
            Кроме того, можно запомнить UTS и размер файла, чтобы при обновлении продлить ему оставшийся срок хранения.

          • ctime вместо mtime быть может? замечание вполне резонное...

    • Аноним

      Доброго всем! Очень хотел бы увидеть "более аккуратный" скрипт удаления файлов с корзины. Если есть возможность, покажите пожалуйста. За ранее большое человеческое спасибо!

  5. столкнулся с тем, что при параметрах
    recycle:keeptree = Yes
    recycle:repository = /mnt/share/trash
    и вынесенным каталогом за пределы расшаренной папки получается такая ситуация: создаётся структура каталогов, но владельцем всей этой структуры назначается тот, кто первый удалил файл в этом каталоге. в итоге при удалении файлов другими пользователями из того же каталога, эти файлы не смогут поместиться в корзину из-за недостатка прав на чтение и запись. помогло добавление переменной %U
    recycle:repository = /mnt/share/trash/%U
    тем самым остаётся полная структура каталогов и имя пользователя в названии каталога, который удалил файл. это применимо только если у каждой машины в сети своя учётка на файловом сервере

    • Припоминаю такие проблемы. Если не ошибаюсь, то выходил так. Создавал каталог .trash в расшаренной папке и скрывал доступ к каталогам с точкой. В самбе по-моему отдельный параметр для этого есть. В итоге нет проблем с правами доступа и в то же время в директорию никто не может зайти через расшаренный диск. Только через консоль.

  6. Здравствуйте, подскажите есть ли техническая возможность что-бы при удалении с шары какого-либо файла он помещался в корзину с правами 700. У меня файл помещается в корзину с теми же правами которые он унаследовал при его создании в шаре.

    • Не знаю, возможно ли это. Мне тоже доставлял неудобство этот нюанс, но никаких настроек по этой теме я не видел.

      • Я тоже в замешательстве. не совсем понятен процесс помещения файла в корзину. Если это происходит по принципу команды mv которая работает как я понимаю следующем образом (смотрит на объект который будет переносится и цель куда будет переносится объект, анализирует их, смотрит есть ли права у пользователя на создание в том месте куда он хочет перенести объект анализирует свободное место на диске и затем создает новый файл по маске создания файлов и каталогов (umask) и все содержимое объекта переносит в новый файл, затем его переименовывает и в завершении удаляет сам объект. В таком случае точечного решения нет что-бы решить данную проблему, а есть глобальное решение изменить значение umask что бы маска создания файлов была 700 для каталогов и файлов, но правильно ли это или нет я не знаю.

        • Я просто вынес корзину из самой сетевой папки и дал на нее полные права всем. Если нужен доступ к этой корзине через самбу, то права доступа уже настраивал через свойства шары.

        • Александр

          Либо опечатка, либо синтаксис в новой версии samba изменился.
          Вместо recylce:excludedir -
          recylce:exclude_dir.

  7. Добрый день, проблема была в моей невнимательности. ранее я писал, что testparm никаких ошибок не выдает и это действительно так, но когда я прочел его я увидел что в конфиге samba vfs objects = recycle стоит в начале конфига а vfs objects = full_audit в конце конфига и самба когда отрабатывала конфиг, ресайклер отработала и переходила на логирование и ресайкле автоматом у меня уже не работал, написал vfs objects = resycle, full_auditt и все заработало.

  8. Добрый день, подскажите пожалуйста поднят "файловый сервер" на базе центос 7 в виртуалбокс 5.2.18. Самба версии 4.7.1. расшарил папку, так же по вашей инструкции сделал корзину. тестпарм никаких ошибок не выдает. самба работает корректно. вот конфиг самба

    [global]
    
        workgroup = ----
        realm = -----
        security = ads
        idmap config * : range = 16777216-33554431
        template shell = /bin/bash
        template homedir = /home/%U
        kerberos method = secrets only
        winbind use default domain = true
        winbind offline logon = false
    ...........................
        passdb backend = tdbsam
        passdb backend = tdbsam
    ..............................
        load printers = no
        show add printer wizard = no
        printcap name = /dev/null
        disable spoolss = yes
    ..............................
        domain master = no
        local master = no
        preferred master = no
        os level = 1
    ..............................
        log level = 3
        log file = /var/log/samba/log.%m
    ..............................
        #Корзина
    
        #Список исключения директорий, файлы из которых не будут попадать в корзину
        recylce:excludedir = tmp temp cache
        #Список исключений для файлов. В данном случае указан в виде масок некоторых расширений.
        recycle:exclude = *.tmp *.temp *.o *.obj *.~?? *.log *.trace
        #Параметр отвечает за версионность удаленных файлов, если их имена совпадают..
        #В таком случае к удаленном файлу в начале имени будет добавляться Copy #N of.
        recycle:versions = Yes
        #Параметр отвечает за то, будет ли указана дата изменения файла на время удаления файла,.
        #либо останется оригинальное значение файла.
        recycle:touch = Yes
        #Сохранять или нет дерево каталогов для удаленных файлов.
        recycle:keeptree = no
        #Указываем директорию, где будут храниться удаленные файлы. Она может располагаться где угодно..
        #Если параметр не указан, используется значение по-умолчанию — .recycle в корне сетевого диска.
        recycle:repository = /mnt/recycle/.trash/U%
        vfs objects = recycle
    
        #Логирование
        log level = 1 vfs:1
        #В каком формате будет выводиться информация о подключении:.
        #%u — имя пользователя,.
        #%I — его ip адрес,.
        #%S — название шары.
        full_audit:prefix = %u|%I|%S
        #Какие удачные события будут логироваться. В приведенном примере по смыслу и так понятно, о чем речь. Полный список событий такой:.
        #chdir, chflags, chmod, chmod_acl, chown, close, closedir, connect, disconnect, disk_free, fchmod, fchmod_acl, fchown, fget_nt_acl,.
        #fgetxattr, flistxattr, fremovexattr, fset_nt_acl, fsetxattr, fstat, fsync, ftruncate, get_nt_acl, get_quota, get_shadow_copy_data,.
        #getlock, getwd, getxattr, kernel_flock, link, linux_setlease, listxattr, lock, lseek, lstat, mkdir, mknod, open, opendir, pread,.
        #pwrite, read, readdir, readlink, realpath, removexattr, rename, rewinddir, rmdir, seekdir, sendfile, set_nt_acl, set_quota, setxatt
        #stat, statvfs, symlink, sys_acl_delete_def_file, sys_acl_get_fd, sys_acl_get_file, sys_acl_set_fd, sys_acl_set_file, telldir, unlin
        #utime, write.
        full_audit:success = connect, open, mkdir, rmdir, unlink, write, rename
        #То же самое, что выше, только для ошибок.
        full_audit:failure = connect, open, mkdir, rmdir, unlink, write, rename
        #Категория событий syslog, в которую будут попадать записи.
        full_audit:facility = local5
        #Приоритет записей для syslog. Для самбы будет достаточно приоритета notice, чем ее записи по сути и являются.
        full_audit:priority = notice
        vfs objects = full_audit
    ..............................
        [Департамет]
        path = /mnt/Департамент
        writeable = yes
        browsable = yes
        valid users = "@DO\пользователи домена"
        admin users = "@DO\Администраторы домена"
        create mask = 0600
        directory mask = 0700
    ....
    ....
        [recycle]
        path = /mnt/recycle
        writeable = yes
        browsable = yes
        valid users = "@DO\пользователи домена"
        admin users = "@DO\Администраторы домена"
        create mask = 0777
        directory mask = 0777

    создаю файл в шаре и затем его удаляю. файл в корзину не помещается. в чем может быть проблема ? Или это специфика виртуалбокс?

    • В virtualbox никакой специфики нет. Проверьте права на директорию с корзиной. Возможно у пользователя самбы нет прав на запись в эту директорию. И лог аудита надо смотреть. Если не хватает, это будет отражено в логах.

      • Спасибо за комментарий. К сожалению логи удастся посмотреть только завтра.
        Права на корзину и шару вот такие:
        rwxrwxrwx admin пользователи домена recycle
        rwxr_x___ root root департамент.
        Возник вопрос по виртуалке только по тому, что в реальной машине где точно такой же конфиг самбы был прописан все работало на ура.

    • Наверно уже не актуально, но тут же у вас просто опечатка:

      #Если параметр не указан, используется значение по-умолчанию — .recycle в корне сетевого диска.
      recycle:repository = /mnt/recycle/.trash/U%

      а надо %U

  9. Я бы еще добавил такую строку для
    удаления пустых подкаталогов:

    /bin/find /mnt/shara/.trash/ -type d -empty -delete

    Спасибо за статью!

    • Спасибо, полезное замечание.

    • К этой строчке можно добавить:

      /bin/find /mnt/shara/.trash/ -type d -not -name ".trash" -empty -delete

      Если не добавить эти параметры то вместе с найденными пустыми директории, удалится еще и директория .trash.

      По крайней мере так было у меня.

      Спасибо за статью!

  10. Круто!! Спасибо!!
    Если сможете зделайте статью про samba+ClamAV

  11. Большое спасибо за статью!

  12. Кирилл

    Для работы нужно еще добавить строку:
    vfs objects = recycle

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar