На 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) с некоторыми тестами и функциями утилит, если кому-то интересно. Однако он частично на немецком, так как мне было лень снова делать все на английском.