Pull to refresh

Создаем структуру личных документов пользователей на предприятии в Samba

Reading time 4 min
Views 6.6K

Небольшая прелюдия


Приветствую хабрасообщество.

В жизни любой средней и крупной компании рано или поздно наступает момент, когда без сетевого хранилища данных жить уже просто не прилично. Необходимо создать определенную структуру папок для внутриотдельного, межотдельного и прочих взаимодействий, но об этом в следующий раз. А сейчас мне бы хотелось показать вам быстрый способ создания «личных папок» для пользователей фирмы/предприятия/учреждения/etc (нужное подчеркнуть).

Вступление


Итак к сути происходящего. Исходим мы из того, что у нас имеется домен с авторизацией в любой LDAP-совместимой службе каталогов (далее СК). И желание с возможностью создать файловый сервер на основе Linux+Samba (можно на той же машине что и СК). Зачем каждому выделять личную папку? В основном для хранения данных на сервере так, что бы ни кто не имел к ним доступ. Почему каждому своя папка, а не 1 каталог с разграничением прав? Да действительно существует и такой способ, для меня как админа, они примерно равны по геморойностисложности реализации, но для юзеров однозначно выбранный подход удобнее.

Рассказывать о настройке непосредственно samba с авторизацией в ADСК я здесь не буду, об этом и так куча статей в рунете и не только, остановимся лишь на паре значимых для нас параметров. В основном речь пойдет о shell скрипте, который и упростит все наши задачи до невозможности.

В путь


Для начала необходимо создать сами папки. Нет вручную мы это делать не будем… Все что нам потребуется это создать текстовые файлики со следующей логикой: называем файл 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. Вся эта канительполезность создана для всё той же цели — лешить пользователя возможности изменять права. Хотя, действительно, в случае «личных документов» это не критично и мб даже лишнее, но при организации общих сетевых ресурсов без этого нельзя.

Заключение


Данная статья рассчитана на средний уровень знаний и не призвана сделать из новичка гуру.
В скрипте не предусмотрено многоуровневая иерархия отделов (будет дописана по индивидуальным заявкам). Я постарался максимально напичкать скрипт «защитой от дурака», и делал это даже в момент писания этой статьи, но я не могу предусмотреть всё. Скрипт внутри содержит несколько параметров которые следует исправить под себя, их не трудно найти ;-). Так же их можно передать и в виде аргументов скрипту, с одним не большим ограничением — я не знаю как заставитьнаучить getopts принимать аргументы с пробелами, поэтому если ваши пути или имена групп содержат пробелы, пожалуйста указывайте их внутри скрипта.
Полный текст скрипта и smb.conf прилагается: скрипт, smb.conf.

P.S. smb.conf достаточно хорошо откоменчен. Сам скрипт получился достаточно громоздким из-за всевозможных проверок и «а если». Так же он не претендует на законченное универсальное решение ибо писался под узкую задачу и потом был немного унифицирован.
Tags:
Hubs:
+38
Comments 56
Comments Comments 56

Articles