[How-To] Samba-сервер для небольшого офиса на несколько групп пользователей

Автор gardarea51, 15 августа 2014, 20:46:57

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gardarea51

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

Итак, задача - сделать несколько сетевых расшаренных папок: для пользователей, бэкапов и пр. Никакого домена нет, никаких перемещаемых профилей, маппинга групп, ldap и прочих сложных вещей... все скромно, а потому и делать все будем по простому, но с некоторой автоматизацией (частичной, но приятной):
- пользователи указываются в файле и некий скрипт заводит их в самбу, читая этот файл
- личные каталоги создаются для каждого пользователя автоматически

Постараюсь сильно не расписывать, это будет такое мини-хауту, но на основных моментах остановлюсь подробнее. Итак, вот такой получился у меня основной конфигурационный файл:
[global]
            workgroup = NSK
            netbios name = SMB
            server string = Samba server
            wins support = Yes
            name resolve order = wins bcast hosts
            domain logons = No
            preferred master = Yes
            domain master = Yes
            os level = 65
            time server = yes
            disable spoolss = yes
            load printers = no
     
            log level = 5 passdb:5 auth:10 winbind:2
            socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
            interfaces = lo bridge vlan101 vlan102 192.168.2.0/24 192.168.3.0/24
            bind interfaces only = Yes
            hosts allow = 127. 192.168.2. 192.168.3.
     
            #поддержка pam для использования /etc/pam.d/samba
            obey pam restrictions = Yes
            passdb backend = tdbsam
            #username map = /etc/samba/users.map
            unix password sync = yes
            # For Unix password sync to work on a Debian GNU/Linux system
            passwd program = /usr/bin/passwd %u
            passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
            # This boolean controls whether PAM will be used for password changes
            # when requested by an SMB client instead of the program listed in
            # 'passwd program'. The default is 'no'.
            #pam password change = yes
     
            logon path =
            map to guest = Bad User
            guest account = nobody
     
            #Задание скриптов дляработы smbpasswd и пр., важно, чтобы группы smbusers и machines были созданы заранее
            add user script = /usr/sbin/useradd -s /bin/false -M -N -g smbusers "%u"
            delete user script = /usr/sbin/userdel -r "%u"
            add group script = /usr/sbin/groupadd "%g"
            delete group script = /usr/sbin/groupdel "%g"
            add user to group script = /usr/sbin/usermod -a -G "%g" "%u"
            delete user from group script = /usr/sbin/gpasswd -d "%u" "%g"
            set primary group script = /usr/sbin/usermod -g "%g" "%u"
            add machine script = /usr/sbin/useradd -g machines -c "%u machine account" -s /bin/false/ -d /dev/null -M "%u"
            #rename user script = /usr/sbin/usermod -l "%uold" "%unew"
     

    #Пользовательские каталоги, общие шары
    [mycat]
            comment = Мой личный каталог
            path = /mnt/data/shares/mycats/%U
            valid users = %U
            csc policy = disable
            read only = no
            browseable = Yes
            include = /etc/samba/recycle.conf
     
    #Описанные ниже каталоги создаются вручную
    #Для каталогов с доступом нескольких групп необходимо настроить acl
    [office]
            comment = Сетевая папка, уч. часть
            path = /mnt/data/shares/office
            valid users = +office, +admins
            force group = +office
            csc policy = disable
            read only = no
            browseable = Yes
            force create mode = 0770
            force directory mode = 0770
            include = /etc/samba/recycle.conf
            recycle:directory_mode = 0770
     
    [admins]
            comment = Админская папка
            path = /mnt/data/shares/admins
            read only = No
            browseable = No
            valid users = +admins
            csc policy = disable
            force create mode = 0770
            force directory mode = 0770
            include = /etc/samba/recycle.conf
            recycle:directory_mode = 0770
     
    [backups]
            comment = Архивы снимков системы
            path = /mnt/data/shares/backups
            read only = No
            browseable = No
            valid users = +admins
            csc policy = disable
            force create mode = 0770
            force directory mode = 0770


Все сетевые каталоги физически находятся в /mnt/data/shares как это видно из описания ресурсов. В каталоге /mnt/data/shares/mycats - будут находиться личные папки пользователей, названные именем пользователя.

Что вам возможно потребуется поменять.
После задания основных глобальных настроек идет привязка к интерфейсам и диапазоны разрешенных хостов (это кстати можно настроить для каждого ресурса отдельно):
            interfaces = lo bridge vlan101 vlan102 192.168.2.0/24 192.168.3.0/24
            bind interfaces only = Yes
            hosts allow = 127. 192.168.2. 192.168.3.

Далее у меня идет опция
            #поддержка pam для использования /etc/pam.d/samba
            obey pam restrictions = Yes

Файл /etc/pam.d/samba поставляется с пакетом samba и я его немного поменял, вот его содержимое:
@include common-auth
@include common-account
@include common-session-noninteractive
session required pam_exec.so quiet seteuid /etc/samba/scripts/create_mycats.sh

Грубо говоря (если интересно - почитайте про pam), если пользователь успешно авторизуется на самба-сервере, то будет выполнет скрипт /etc/samba/scripts/create_mycats.sh. Это тот самый скрипт, который автоматически создает личные каталоги пользователей. Я положил его в /etc/samba/scripts, вот его содержимое:
#!/bin/bash
user_name=$PAM_USER
user_dir="/mnt/data/shares/mycats/$user_name"

if [ -d $user_dir ]
then
        #echo "Каталог пользователя уже существует, выходим из скрипта"
        exit 0;
else
        #echo "Создание каталога пользователя и назначение прав"
        #mkdir -p $userDir/{Desktop,Documents}
        mkdir $user_dir
        chown -R $user_name $user_dir
        chmod -R 0700 $user_dir
fi

Как видно из скрипта - он запускается и проверяет есть ли для такого пользователя личный каталог в /mnt/data/shares/mycats/, если его нет - создает каталог и назначает соответствующие права. Удобно тем, что не придется создавать каталоги вручную, да и вообще думать о них. Теперь они есть у всех пользователей самбы.

Теперь дальше по основному конфигу.
unix password sync = yes
            # For Unix password sync to work on a Debian GNU/Linux system
            passwd program = /usr/bin/passwd %u
            passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .

Это умолчальная настройка. Вообще добавление пользователя samba происходит как правило командой smbpasswd -a Username. Но есть одно условие - перед добавлением пользователя в самбу - он должен уже быть пользователем unix. То есть только существующих пользователей системы можно добавить в самбу. Так вот эти строки говорят что у пользователя в самбе и unix-системе пароль должен быть синхронизирован, а строка passwd chat позволяет smbpasswd при добавлении пользователя сменить его unix-пароль. Ну в общем-то мне сдается, что это все необязательно, но это умолчальная настройка. Как говорится - "им виднее".

Далее говорится, что если пользователь не авторизовался, то он автоматически будет приравнен к пользователю nobody, про эти параметры можно почитать отдельно, я не буду вдаваться в детали. Далее в конфиге идет описание скриптов [для внешних программ], самыми важными как мне кажется строками в текущей конфигурации являются:
            add user script = /usr/sbin/useradd -s /bin/false -M -N -g smbusers "%u"
            delete user script = /usr/sbin/userdel -r "%u"
            add machine script = /usr/sbin/useradd -g machines -c "%u machine account" -s /bin/false/ -d /dev/null -M "%u"

Когда мы захотим добавить пользователя самбы командой smbpasswd -a - будет вызван этот скрипт, который позволит еще и добавить пользователя в систему, то есть тут не скрипт, а команда, но можно указать и выполнение скрипта. Параметры команды можно уточнить так: useradd -h. =) Убивается 2 зайца, о которых говорилось выше. Скрипт добавления машины (компьютера) - команда, добавляющая учетнуюзапись компьютера в группу machine. Важно понимать, что не только пользователи должны иметь учетные записи, а и компьютеры тоже (или это только если самба в роли DC? поправьте меня, если я не прав, не могу сейчас проверить пустая ли у меня эта группа). И эта строка добавляет учетки компьютеров, не отвлекая нас от дел, в заданную группу.

Ну и в конце идут описания ресурсов (сетевых директорий). Там разрешения на пару групп и прочие параметры, о которых можно и нужно почитать отдельно. В каждый ресурс включается конфигурационный файл /etc/samba/recycle.conf, вот его содержимое:
vfs objects = recycle
recycle:repository = .Корзина
recycle:touch = Yes
recycle:touch_mtime = Yes
recycle:keeptree = Yes
recycle:versions = Yes
recycle:maxsize = 0

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

Теперь об автоматизации добавления пользователей. Список пользователей я задал в файле /etc/samba/userlist, вот его примерное содержимое:

luser             f98fs90fds         admins
kitty             h8f90h8f90         office
...

Файл вида: имя, пароль, группа пользователя. Скрипт, который читает этот файл и вводит пользователей в самбу - /etc/samba/scripts/addusers.sh, вот его содержимое:
#!/bin/bash

cat /etc/samba/userlist | while read userName userPasswd userGroup
do
  echo "---------------------------------------------------------------"
  if [ $(getent group $userGroup) ]
    then
      echo "Группа $userGroup для пользователя $userName уже существует"
    else
      echo "ВНИМАНИЕ! Создается группа $userGroup"
      /usr/sbin/groupadd $userGroup
  fi
  if [ $(getent passwd $userName) ]
    then
      echo "Пользователь $userName уже существует!"
    else
      echo "Пользователь $userName:$userGroup добавляется в Samba"
      echo -e $userPasswd"\n"$userPasswd | smbpasswd -a -s $userName &> /dev/null
      #/usr/sbin/usermod -a -G $userGroup $userName
      /usr/sbin/usermod -g $userGroup $userName
  fi
done
  echo "---------------------------------------------------------------"

Заметьте, что в скрипте используется команда добавления пользователей самба: smbpasswd, которая вызывает в свою очередь "add user script", описанный в конфиге. В итоге, чтобы добавить пользователей в самбу - нам нужно записать их в файл /etc/samba/userlist и выполнить этот скрипт. На качество скриптов вообще не претендую, так как я скорее "админ локалхоста", чем тру дядька с бородой. =)

А теперь допущения и ограничения и подытоживания, специально оставил под концец:

  • группы machines и smbusers должны быть созданы предварительно
  • добавление новых пользователей и групп выполняется скриптом /etc/samba/scripts/addusers.sh, приведенным выше
  • удаление пользователей можно производить командой smbpasswd, но важно проконтролировать удалена ли unix-запись пользователя
  • личные каталоги создаются автоматически скриптом /etc/samba/scripts/create_mycats.sh
  • все расшаренные групповые директории должны юыть предварительно созданы вручную
  • для доступа нескольких групп к ресурсу необходимо использовать acl (setfacl).
  • все скрипты необходимо сделать исполняемыми

Надеюсь, что этот вариант использования самбы кому-то пригодится.
ps: если вам не хочется городить огород со скриптом добавления пользователей по списку из файла - никто не мешает заводить их просто через smbpasswd по одному.