Обходной путь с помощью inotifywait в Linux:

Обходной путь с помощью inotifywait в Linux:

На Samba-Share должна быть папка TO, где всем разрешено создавать файлы, редактировать и удалять их. Но одному пользователю не должно быть разрешено читать файлы, созданные другими.

Основная идея — создать папку, в которой студенты могут отправлять тесты и не читать то, что написали другие одноклассники. Не должно быть никаких ненужных ограничений. Студентам должно быть разрешено создавать каталоги, копировать свои файлы. Они должны быть просто отделены друг от друга и не читать/удалять файлы других.

В Windows такая папка будет иметь ACL примерно следующего вида:

$ icacls TO
.\TO Everybody: (CI)(Rc,S,RD,WD,AD,X)

Учитель/владелец будет иметь разрешение на изменение в указанной папке для сбора всех данных.

Как бы я воспроизвел нечто подобное в Linux с помощью списков контроля доступа (setfacl, getfacl) или, если это вообще возможно, без них, используя только стандартные разрешения Linux?

решение1

Я отвечу на свой собственный вопрос. Если кто-то может улучшить этот ответ или у него есть вопросы, то, конечно, сделайте это. Эта конкретная проблема беспокоит меня уже довольно давно.

То, о чем я спрашивал, по-видимому, невозможно с помощью списков контроля доступа POSIX, согласно: Разрешение Group+rx только в каталогах, использующих ACLпоскольку списки ACL не могут различать файлы и папки при применении унаследованных прав.

При дальнейшем рассмотрении были упомянуты два возможных решения:

  • inotify (который я здесь использовал)
  • bindfs (если кто-то попробует, пожалуйста, напишите)

Обходной путь с помощью inotifywait в Linux:

Права доступа к папкам

Как пользователь root выполните следующие действия:

Создайте папку для общего доступа:

mkdir fld

Сделать группу top-folders группой учителей. Группа должна существовать и быть основной группой учителей.

chown :teach fld

Пусть группа будет унаследована всеми файлами/подпапками. Это означает, что учитель должен иметь возможность читать/писать/удалять

chmod g+s fld 

Не разрешайте перезапись/удаление файлов другими пользователями (например, разрешения /tmp)

chmod +t fld

Теперь списки ACL будут настроены на наследование минимальных прав во всех файлах/подпапках, созданных в этой папке:

setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld

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

getfacl fld

# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---

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

Для всех подпапок, созданных студентами, применяется следующее: студенты будут объединены в папку «другие», поэтому важно следующее:

default:other::---

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

inotify-Скрипт: submission_folder.sh

Этот скрипт должен быть запущен пользователем root, единственным аргументом будет эта папка, которая была создана выше. В качестве примера того, как его запустить:

submission_folder.sh /path/to/fld

Файл является исполняемым и имеет следующее содержимое:

#!/bin/bash +x
dir=$1

if [[ -z $dir ]];
then
    echo "Enter path as argument"
    exit
fi
echo "WATCHING: $dir"

# run forever
while true; do

inotifywait -r -q --format %w%f -e create "$dir" | while read f; do 
    echo "- CREATED: $f"
    if [[ -d "${f}" ]] ; then
        echo "FOLDER: ${f}, adding read,write,execute permission"
        chmod o+rwx "${f}"
        stat "${f}"
    else
        echo "FILE: $f, doing noting"
    fi
done

done

Пока скрипт работает, он будет обновлять все подпапки, чтобы они получили rwx и, следовательно, могли быть просмотрены и перечислены.

Предостережения:

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

  • Если папки создаются с помощью mkdir -p folder/subfolder и обе еще не существуют, то они будут созданы так быстро, что inotify не получит индивидуального уведомления и, следовательно, не изменит папки на rwx. Для этих папок это так, как если бы скрипт не был запущен. Это не проблема сама по себе, так как у студентов будет меньше прав, а не больше, и списывание не должно быть возможным

Личные заметки

Я создалipython-блокнот(bash notebook, а не python) с некоторыми тестами и функциями утилит, если кому-то интересно. Однако он частично на немецком, так как мне было лень снова делать все на английском.

Связанный контент