Небольшая прелюдия
Приветствую хабрасообщество.
В жизни любой средней и крупной компании рано или поздно наступает момент, когда без сетевого хранилища данных жить уже просто не прилично. Необходимо создать определенную структуру папок для внутриотдельного, межотдельного и прочих взаимодействий, но об этом в следующий раз. А сейчас мне бы хотелось показать вам быстрый способ создания «личных папок» для пользователей фирмы/предприятия/учреждения/etc (нужное подчеркнуть).
Вступление
Итак к сути происходящего. Исходим мы из того, что у нас имеется домен с авторизацией в любой LDAP-совместимой службе каталогов (далее СК). И желание с возможностью создать файловый сервер на основе Linux+Samba (можно на той же машине что и СК). Зачем каждому выделять личную папку? В основном для хранения данных на сервере так, что бы ни кто не имел к ним доступ. Почему каждому своя папка, а не 1 каталог с разграничением прав? Да действительно существует и такой способ, для меня как админа, они примерно равны по
Рассказывать о настройке непосредственно samba с авторизацией в
В путь
Для начала необходимо создать сами папки. Нет вручную мы это делать не будем… Все что нам потребуется это создать текстовые файлики со следующей логикой: называем файл otdelK.txt и помещаем в него несколько строк, IvanovI PetrovV. Как будет разбирать это дело скрипт? Очень просто — название файла будет принято за наименование отдела/подразделение, а строки как имена сотрудников из СК. Составление .txt файлов вручную или как либо автоматически оставлю на ваше усмотрение.
Сама логика создания папок:
CreateFolders() { mkdir "$PP" for filename in `ls -l $catname/*.txt | awk '{print $NF}'`; do group=`basename "$filename" .txt` mkdir "$PP/$group" for user in `cat "$filename"`; do mkdir "$PP/$group/$user" CreateShare "$group" "$user" PermissionsAssignment "$group" "$user" done done }
Вот собственно не хитрый способ создания структуры каталогов (разумеется в полном варианте там куча всевозможных проверок). Просматривается каталог $catname на наличие в нём txt файлов и далее они разбираются. Переменная $PP содержит путь до папки где все и будет создаваться.
После создания каждой личной папки вы можете заметить вызов еще 2х функций с «говорящими именами». Рассмотрим их содержание:
CreateShare() { username="$2" ou="$1" grep -wi '\['$username'\]' "$SC" > /dev/null if [ "$?" -ne 0 ]; then echo -e "[$username] path = \"$PP/$ou/$username\" valid users = \"@$DN\\$AG\",\"$DN\\$username\" admin users = \"@$DN\\$AG\" browseable = No comment = \"Private Documents %U\" public = No writeable = Yes read only = No create mask = 0700 directory mask = 0700 inherit permissions = Yes inherit acls = Yes inherit owner = Yes vfs objects = recycle recycle:repository = .Trash recycle:versions = Yes recycle:keeptree = Yes recycle:exclude = *.TMP *.tmp ~* " >> "$SC" echo "Folder for user $username is shared" | tee -a "$log" else echo "INFO: Sharing for user $username already exist" | tee -a "$log" warn=true fi }
Данная функция вызывает с двумя аргументами: отдел и имя пользователя. Проверяет не существует ли уже для него шара и если нет то создает её. Значения каждого параметра вы можете посмотреть как в официальных man страницах так и на русском. Скажу лишь, что все правила направлены на то, что бы у пользователя был полный доступ к папке, но он не мог менять в ней какие-либо разрешения. Так же вы можете заметить, что пользователю выделяется корзина, т.е. всё что он удалит из своей сетевой папки будет помещено в его сетевую корзину (доступ к корзинам у меня в сети есть только у меня). Все эти папки подключаются пользователям у меня через vbs скрипт при входе в систему.
Тут вот и надо бы вспомнить парочку строк из smb.conf
store dos attributes = Yes map acl inherit = Yes acl group control = No dos filemode = No # POSIX 'rwx' отображается в виндовый rwx, а не full control acl map full control = No <--- вот весьма важный параметр, который нам и помог.
Далее необходимо назначить права в самой системе для созданного каталога.
PermissionsAssignment() { path="$PP/$1/$2/" chown "$AU":"$AG" -R "$path" chmod 0770 -R "$path" chmod g+s -R "$path" setfacl -bR "$path" setfacl -R -m m::rwx "$path" setfacl -nR -m u:"$2":rwx "$path" }
Тут сразу становится понятно, что необходим пакет xfsprogs в состав которого входят утилиты setfacl и getfacl для управления расширенными атрибутами в Linux. Вся эта
Заключение
Данная статья рассчитана на средний уровень знаний и не призвана сделать из новичка гуру.
В скрипте не предусмотрено многоуровневая иерархия отделов (будет дописана по индивидуальным заявкам). Я постарался максимально напичкать скрипт «защитой от дурака», и делал это даже в момент писания этой статьи, но я не могу предусмотреть всё. Скрипт внутри содержит несколько параметров которые следует исправить под себя, их не трудно найти ;-). Так же их можно передать и в виде аргументов скрипту, с одним не большим ограничением — я не знаю как
Полный текст скрипта и smb.conf прилагается: скрипт, smb.conf.
P.S. smb.conf достаточно хорошо откоменчен. Сам скрипт получился достаточно громоздким из-за всевозможных проверок и «а если». Так же он не претендует на законченное универсальное решение ибо писался под узкую задачу и потом был немного унифицирован.