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

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

В Windows такая папка будет иметь ACL, похожий на:

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

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

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

1 ответ1

0

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

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

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

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

Обходной путь с inotifywait на Linux:

Разрешения для папок

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

Создайте папку для обмена:

mkdir fld

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

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-Script: 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 и поэтому могли быть просмотрены и перечислены.

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .