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