Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> Samba+ NT ACL

Samba c доменной авторизацией и правкой пермишенов через галочки

Автор: lissyara.


    Это не новая статья. Это - обновление старой. Ну и для себя - чтоб проще было скопировать при настройке где-то =) Конфиг из старой статьи юзался на филиальных серверах, там было по 30-40 человек, никаких излишеств нужно не было. Просто чтоб работало, и чтоб права галками. Через год подняли сервер под самбой в головном офисе - файлопойка под виндой загибалась.
   Ошибка это или нет - не скажу, ввиду того что я отмороженный на эту тему, моё мнение учитывать нельзя =) Может кто из отдела забредёт и отпишет каммент, каково оно, админить сервак с самбой на 700 человек народу =).
   Ну да не суть. Эта статья - собрание описаний всех глюков, плюсов и минусов которые даёт самба, в той конфигурации что используется у нас. Всё, разумеется, на текущий момент.
   Статья писалась с халтурного сервака, который попросили настроить на далёком Сахалине =) Версия FreeBSD:
fs$ uname -a
FreeBSD fs.sakhalin-engineering.local 6.4-RC1 FreeBSD 6.4-RC1 #0:
 Sun Oct  5 11:11:02 UTC 2008     
root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
fs$

   Как можно заметить из вывода `uname' - у домена очень длинное имя, ещё и с дефисом в середине. На этом я тоже словлю глюк чуть позже.
   
   Поехали. Ставим самбу, выбираем такой набор галок:
fs$ cd /usr/ports/net/samba3
fs$ make patch

     +--------------------------------------------------------------------+
     |                   Options for samba 3.0.32_1,1                     |
     | +----------------------------------------------------------------+ |
     | |  [ ] LDAP         With LDAP support                            | |
     | |  [X] ADS          With Active Directory support                | |
     | |  [X] CUPS         With CUPS printing support                   | |
     | |  [X] WINBIND      With WinBIND support                         | |
     | |  [X] ACL_SUPPORT  With ACL support                             | |
     | |  [ ] AIO_SUPPORT  With Asyncronous IO support                  | |
     | |  [ ] FAM_SUPPORT  With File Alteration Monitor                 | |
     | |  [X] SYSLOG       With Syslog support                          | |
     | |  [ ] QUOTAS       With Disk quota support                      | |
     | |  [X] UTMP         With UTMP accounting support                 | |
     | |  [ ] PAM_SMBPASS  With PAM authentication vs passdb backends   | |
     | |  [ ] CLUSTER      With experimental cluster support            | |
     | |  [X] PCH          With precompiled headers optimization        | |
     | |  [ ] MAX_DEBUG    With maximum debugging                       | |
     | |  [ ] SMBTORTURE   With smbtorture                              | |
     | |  [ ] DNSUPDATE    With dynamic DNS update(require ADS)         | |
     | |  [ ] EXP_MODULES  With experimental modules                    | |
     | |  [X] POPT         With system-wide POPT library                | |
     +-+------v(+)------------------------------------------------------+-+
     |                       [  OK  ]       Cancel                        |
     +--------------------------------------------------------------------+


===>  NOTICE: This version of port has changed location of Samba password
===>  NOTICE: (smbpasswd) directory. Files in '/usr/local/private'
===>  NOTICE: have moved to '/usr/local/etc/samba'.
===>  Vulnerability check disabled, database not found
===>  Found saved configuration for samba-3.0.32_1,1
===>  -------------------------------------------
===>  Run 'make config' to (re)configure the port
===>  -------------------------------------------
===>  Extracting for samba-3.0.32_1,1
=> MD5 Checksum OK for samba-3.0.32.tar.gz.
=> SHA256 Checksum OK for samba-3.0.32.tar.gz.
===>  Patching for samba-3.0.32_1,1
===>  Applying FreeBSD patches for samba-3.0.32_1,1
fs$

   Тут надо прерваться на пояснение. В самбе, после версии 3.0.25 есть по крайней мере пара глюков, которые мне известны и толком не пофикшены.

  • https://bugzilla.samba.org/show_bug.cgi?id=5052 - Бага с наследованием прав. Вроде как пофикшена. Почему "вроде" - см. следующую.
  • https://bugzilla.samba.org/show_bug.cgi?id=5873 - Невозможно убрать нследование прав. Толи результат фикса предыдущей, толи самостоятельная - но у меня и у чела обнаружилась сразу после фикса предыдущей. Вроде до этого не было такого, хотя может не замечал просто...
       Обе баги очень неприятные, в крупных реализациях - делают самбу неприменимой для использования. Обе лечаться откатом на версию 3.0.25, но, там свои интересные глюки, пофикшенные в более поздних версиях. После некоторых размышлений о бренности бытия, рекурсивного грепания сорцов, мата в сторону разработчиков (первую багу пофиксили через несколько месяцев, когда у меня уже всё давно было в продакшене), ругани на себя, что плохо читал книжечку по программированию на сях, был найден файл отвечающий за раздачу прав и прочия. Собственно - разработчик, отписывающийся в первом баге говорит, что неправильно подсовывать файл из старой версии самбы в новую, что "виндовс-со-свистом" будет как-то неправильно работать с шарами... Да и пофиг =) Самое главное - всё пашет.
    fs$ find ./ -name posix_acls.c
    ./work/samba-3.0.32/source/smbd/posix_acls.c
    
    fs$ fetch ftp://ftp.lissyara.su/users/lissyara/posix_acls.c
    posix_acls.c                                  100% of  128 kB   20 kBps
    fs$ mv posix_acls.c ./work/samba-3.0.32/source/smbd/posix_acls.c
    fs$
    

       Собственно - виновника торжества я выложил на ftp. Если есть архив 3.0.25 - можете достать из него. Теперь можно продолжить инсталляцию.
    fs$ make install clean
    

       После инсталляции - настраиваем - правим некоторые файлы до такого состояния (всё тупо копировать не надо, на некоторых надо подумать и подставить своё. Если непонятно - смотрите старую статью - там разжёвано).
    При неверной настройке этого файла - не удавалось включить в домен:
    fs$ more /etc/hosts
    ::1                     localhost.sakhalin-engineering.local localhost
    127.0.0.1               localhost.sakhalin-engineering.local localhost
    192.168.205.248         fs.sakhalin-engineering.local fs
    192.168.205.248         fs.sakhalin-engineering.local.
    
    fs$
    

    Прописываем автозапуск самбы:
    fs$ grep samba /etc/rc.conf
    #samba
    samba_enable="YES"
    fs$
    

    Указываем юзать винбинд для проверки юзеров и паролей:
    fs$ more /etc/nsswitch.conf
    group: files winbind
    passwd: files winbind
    group_compat: nis
    passwd_compat: nis
    hosts: files dns
    networks: files
    shells: files
    fs$
    

    Рисуем конфиг самбы:
    fs$ cat /usr/local/etc/smb.conf
    # SAMBA
    
    [global]
    	# рабочая группа
            workgroup = SAKHALIN-ENGINEERING
            # режим безопасности
            security = ADS
            # контроллер домена (обычно, тут мона поместить имя домена - оно 
            # резольвиться во все контроллеры. Но в данном случае тут был тихий
            # ужас - оно разольвилось в два десятка IP адресов из которых контроллер
            # был тока один. Домен не я админю - пусть сами разбираются. Пришлось
            # прописать IP - хотя на работе сам всех ругаю за такое)
            password server = 192.168.205.2
            #password server = SAKHALIN-ENGINEERING.LOCAL
            # Сфера влияния =)))
            realm = SAKHALIN-ENGINEERING.LOCAL
            # имя машины - какой будет видеться в сети
            netbios name = FS
            # дескрипшен к машине. Последнее время не задаю - XP и прочия считают его
            # важней имени и выводят вначале. В итоге фиг чего в сети найдёшь...
            server string =
    #       log level = 10
            log file = /var/log/samba/%m.%U.log
            max log size = 50000
            # диапазоны числовых значений uid и gid
            winbind uid = 10000-20000
            winbind gid = 10000-20000
            # не использовать имя домена при проверке имени и т.п.
            winbind use default domain = yes
            # кодировки - локальные и прочия
            display charset = koi8-r
            unix charset = koi8-r
            dos charset = 866
            # for mail
            template homedir = /usr/home/%D/%U
            # added by lissyara 2007-11-14 in 17:50 MSK
            template shell = /bin/csh
            # added by lissyara 2007-08-08 in 14:53 MSK
            admin users             = "@ENGINEERING\Domain Admins", ENGINEERING\akeda
            # added by lissyara 2008-01-12 in 12:53
            defer sharing violations = false
            winbind enum users = yes
            winbind enum groups = yes
    
    [user_data]
            comment                 = Shares for personal users data
            path                    = /shares/user_data
            admin users             = "@ENGINEERING\Domain Admins"
            read only               = No
            create mask             = 0600
            directory mask          = 0700
            locking                 = no
            # скрипт выплняется при заходе юзера на шару
            root preexec  = /bin/sh -c '/root/scripts/create_user_data_subdir.sh %U'
            force unknown acl user  = yes
            # vfs - read `man -k vfs | grep Samba`
            vfs object              = recycle full_audit
            recycle:repository      = /shares/trash/%S
            recycle:keeptree        = Yes
            recycle:touch           = Yes
            recycle:touch_mtime     = Yes
            recycle:version         = Yes
            recycle:maxsize         = 0
            recycle:exclude         = *.TMP *.tmp
            recycle:directory_mode  = 0770
            recycle:versions        = Yes
            recycle:minsize         = 1
            full_audit:prefix       = share=%S; id=%U; ip=%I -->
            full_audit:success  = unlink rmdir mkdir write rename write aio_write pwrite
            full_audit:failure  = unlink rmdir mkdir write rename write aio_write pwrite
            full_audit:priority     = INFO
    
    [all]
            comment                 =
            path                    = /shares/all
            read list               = "@ENGINEERING\Domain Users"
            write list              = "@ENGINEERING\Domain Users"
            admin users             = "@ENGINEERING\Domain Admins"
            read only               = No
            map acl inherit         = yes
            map archive             = no
            map read only           = no
            create mask             = 0660
            directory mask          = 0770
            force unknown acl user  = yes
            delete readonly         = yes
            # vfs - read `man -k vfs | grep Samba`
            vfs object              = recycle full_audit
            recycle:repository      = /shares/trash/%S
            recycle:keeptree        = Yes
            recycle:touch           = Yes
            recycle:touch_mtime     = Yes
            recycle:version         = Yes
            recycle:maxsize         = 0
            recycle:exclude         = *.TMP *.tmp
            recycle:directory_mode  = 0770
            recycle:versions        = Yes
            recycle:minsize         = 1
            full_audit:prefix       = share=%S; id=%U; ip=%I -->
            full_audit:success = unlink rmdir mkdir write rename write aio_write pwrite
            full_audit:failure = unlink rmdir mkdir write rename write aio_write pwrite
            full_audit:priority     = INFO
    
    [trash]
            comment                 =
            path                    = /shares/trash
            read list               = "@ENGINEERING\Domain Admins"
            write list              = "@ENGINEERING\Domain Admins"
            admin users             = "@ENGINEERING\Domain Admins"
            browseable              = no
    
    fs$
    

       Про конфиг порассуждаю отдельно - т.к. он без камментов. Про главную часть - смотрите всю ту же предыдущую статью - там она прокомментирована. Лучше расскажу про шары. В данном случае, шары всего две - одна для доков (all), вторая для персональных пользовательских директорий (user_data), доступных тока им (ну и администраторам домена). По первой - почему именно такие опции - я дуже и не объясню. Они просто скопированы с того самого сервера который в продакшене. Они должны быть именно такими - иначе начинается чехарда с правами - когда юзер не может править файл владельцем которого он является и т.п. Так что тут - принимайте как есть, или пытайтесь найти свои значения.
       Вторая шара интересней. Там надо было создать по директории каждому юзверю, чтобы туда мог лазить тока он. Решили скриптом, вызываемым при подключении юзера к шаре.
       Ну и общее для обоих шар - VFS. Первый модуль - `recycle' - корзина. При удалении файла, он не удаляется с диска, а передвигается в другую директорию на том же диске (можно и на другом, но экспериментальным путём выяснили, что тогда потеряются расширенные права - иногда они дороже файлов в директории =)). Поддерживается версионность. Т.е. может сохранять кучу файлов с одним и тем же именем удаляемых раз за разом. Второй модуль - `full_audit' - может логгировать вообще все телодвижения юзера, но в данном варианте учитывает лишь деструктивные действия - удаление и запись в файлы. Весьма полезен когда прибегает "нечто" и кричит что у него чего-то там удалили. Причём именно админы - ибо само "оно" не могло удалить. Бывает забавно ткнуть его носом в лог, где указано что удалил именно он, с датой... Тут же включается остаток мозга, и юзер вспоминает как чего-то там сортировал. И соображает что удалил не копию, а и копию и оригинал, тупо запутавашись где что... Думаю, ситуация всем знакомая.
       
       Ну да ладно. Получаем тикет от кербероса (юзается доменный пользователь `exim' - ибо там щас все спят, а других юзеров я не знаю - этого вытащщил из конфига почты, что настраивал год назад в этой же конторе):
    fs$ kinit exim
    exim@SAKHALIN-ENGINEERING.LOCAL's Password:
    kinit: NOTICE: ticket renewable lifetime is 1 week
    fs$
    

    Фтыкаем машинку в домен:
    fs$ net join -Uexim -W SAKHALIN-ENGINEERING
    exim's password:
    The workgroup in /usr/local/etc/smb.conf does not match the short
    domain name obtained from the server.
    Using the name [ENGINEERING] from the server.
    You should set "workgroup = ENGINEERING" in /usr/local/etc/smb.conf.
    Using short domain name -- ENGINEERING
    Joined 'FS' to realm 'SAKHALIN-ENGINEERING.LOCAL'
    fs$
    

    Тут имеем интересную ругань - про этот глюк я упоминал в самом начале - слишком длинное имя домена с дефисом превратилось в какой-то обрубок... Странно, но работает. Как чуть позже станет ясно - не совсем коректно работает. Ну а пока продолжаем, запускаем самбу:
    fs$ /usr/local/etc/rc.d/samba start
    Removing stale Samba tdb files: ........ done
    Starting nmbd.
    Starting smbd.
    Starting winbindd.
    fs$  
    

    Проверяем - работает ли:
    fs$ id exim
    id: exim: no such user
    fs$  
    

    Облом... Подумавши, выполнил другую команду:
    fs$ wbinfo -u | wc -l
         237
    fs$   
    

    Юзеров видит. В полном её выводе видна причина облома - видит как `ENGINEERIN\exim' - несмотря на явное указание в конфиге видеть их без домена... Пробуем:
    fs$ id ENGINEERING\\exim
    uid=10006(ENGINEERING\exim) gid=10003 groups=10003
    fs$   
    

    И правда... Снова подумал, понравилось =)) Сделал так как рекомендовало в ругани, при вводе в домен, т.е. заменил в конфиге
    workgroup = SAKHALIN-ENGINEERING
    

    на
    workgroup = ENGINEERING
    

    снова воткнул в домен - на этот раз прокатило без ругани:
    fs$ net join -Uexim -W SAKHALIN-ENGINEERING
    exim's password:
    Using short domain name -- ENGINEERING
    Joined 'FS' to realm 'SAKHALIN-ENGINEERING.LOCAL'
    fs$   
    

    и рестартовал самбу. Теперь видит как и задумано - без домена:
    fs$ id exim
    uid=10006(exim) gid=10003(domain users) groups=10003(domain users)
    fs$    
    

    Хорошо. Можно продолжать. Готовим шару. Как именно включить ACL - читаем в старой статье.
    fs$ mount | grep shares
    /dev/ad4s1h on /shares (ufs, local, soft-updates, acls)
    fs$ 
    

    Делаем такую структуру директорий:
    fs$ du -a /shares/ | awk '{print $2}'
    /shares/all
    /shares/logs
    /shares/user_data
    /shares/trash/all
    /shares/trash/user_data
    /shares/trash
    /shares/
    fs$  
    

    Задаём права:
    fs$ chown -R :"domain users" /shares/trash
    fs$ chmod 770 /shares/trash
    

    Прописываем задания в планировщик рута `crontab -e':
    fs$ crontab -l
    # delete files oldest 30 days
    0  22 * * * find /shares/trash -type f -mtime +30 -delete
    # delete empty dirs
    30 23 * * * find /shares/trash -type d -mtime +30 -exec rmdir {} \; >/dev/null 2>&1
    # log rotate
    */2 * * * * /root/scripts/log_rotate.sh
    
    fs$   
    

    Рисуем скрипт ротации логов:
    fs$ more /root/scripts/log_rotate.sh
    #!/bin/sh
    
    log_preffix="/shares/logs"
    log="${log_preffix}/smbd_audit.log"
    
    old_log_dir="${log_preffix}/`date +%Y`/`date +%m`"
    
    # rotate
    /bin/mkdir -p ${old_log_dir}
    /bin/cat ${log} >> ${old_log_dir}/`date +%d`_smbd_audit.log
    /bin/echo -n > ${log}
    
    # test - if .bz2 not exists - archive old file
    old_file="${log_preffix}/`date -v-1d +%Y`/\
    `date -v-1d +%m`/`date -v-1d +%d`_smbd_audit.log"
    if test ! -f ${old_file}.bz2
    then
            /usr/bin/bzip2 --best ${old_file}
    fi
    
    fs$
    

    И скрипт создающий юзерские директории:
    fs$ more /root/scripts/create_user_data_subdir.sh
    #!/bin/sh
    
    user_name="`echo $1 | /usr/bin/tr '[:upper:]' '[:lower:]'`"
    
    /bin/mkdir -p "/shares/user_data/${user_name}";
    /bin/chmod 700 "/shares/user_data/${user_name}";
    /usr/sbin/chown "${user_name}" "/shares/user_data/${user_name}";
    
    #echo ${user_name} >> /tmp/logins_to_user_data_`date +%Y-%m-%d`.log
    
    fs$  
    

    Правим конфиг сислога:
    fs$ more /etc/syslog.conf
    .... skipped...
    # news.notice                                   /var/log/news/news.notice
    !smbd_audit
    *.*                                             /shares/logs/smbd_audit.log
    .... skipped...
    

    Всё. На Сахалине сейчас:
    fs$ date
    Wed Nov 12 06:25:04 SAKT 2008
    fs$   
    

    Все спят, проверить некому. Я тоже, пожалуй, пойду спать, всё должно работать. Завтра, у них будет вечер, а у нас утро, сообщат о глюках... Хотя - не должно их быть...

    Несмотря на перечисленные странности самбы, мне кажется, что - плюсы в виде корзины, аудита, шустрой работы и правильной ОС перекрывают недостатки. (Про наличие аудита в винде, shadow copy и прочего - я осведомлён. Тока винду я не админю, на vbs не пишу, и расставлять галки - ненавижу. А без vbs хрен там чего из того аудита выковырнешь...) Кто-то может не согласиться - его право. Каждому своё =)

    UPD 2010-03-04: Проблема с отвалом прав из первого комментария, решается установкой FreeBSD8 или правкой исходников ядра для установки чила групп у пользователя больше, чем у вас максимально бывает в домене (в FreeBSD8 вообще радикально - 1023 по дефолту)
    Мне хватило такого:
    nas# sysctl kern.ngroups
    kern.ngroups: 64
    nas#     
    



    размещено: 2008-11-11,
    последнее обновление: 2010-03-04,
    автор: lissyara


    Andy, 2008-11-12 в 9:47:18

    Samba тоже умеет shadow copy, только это с Logical Volume Manager замешано.
    http://us3.samba.org/samba/docs/man/Samba-HOWTO-Collection/VFS.html#id2644800
    http://wiki.samba.org/index.php/Shadow_Copies_with_Snapshots_Script
    А про администрирование NAS под самбой, я очень хорошо помню как переодически права отваливались на вложенные директории - было весело.

    Cancer, 2008-11-15 в 20:01:00

    Спасибо за статью, нашел тут кучу фенечек для корзины итд

    sch, 2008-11-25 в 17:07:54

    по поводу ругани SAMBA на короткое имя домена - объяснение простое: когда настраивали роль контроллера домена AD, мастер настройки на одном из этапов запросил короткое имя домена - и в качестве такого имени было введено слово ENGINEERING (короткое имя можно указать вообще не похожим на имя DNS зоны). Именно это имя выводится в третьем поле окна авторизации windows.

    Вот здесь ИМХО ненужная директива "read list":
    read list = "@ENGINEERING\Domain Users"
    write list = "@ENGINEERING\Domain Users"

    директива write list с указанием такой же группы перекрывает read list.

    Извините за нудное поведение :)

    man smb.conf:

    write list (S)

    This is a list of users that are given read-write access to a service. If the connecting user is in this list then they will be given write access, no matter what the read only option is set to.
    Note that if a user is in both the read list and the write list then they will be given write access.

    StarЫЙ, 2009-06-23 в 7:58:06

    Мне кажеться, что тут надо бы для новичков добавить кое-что перед тем как добавить запись в сислог необходимо создать файл /shares/logs/smbd_audit.log,
    и еще у меня скрипт ротации логов заработал когда в crontabe написал sh /root/scripts/log_rotate.sh

    feomatr, 2010-12-09 в 19:12:09

    StarЫЙ
    Первый мой опыт работы с syslog.conf.
    Потрачен день и "немного" нервов =)
    Спасибо за ответ!(я про создание файла)

    Yuki, 2011-11-08 в 7:02:35

    Хехехе, где-то я это видела :D
    Щас повторим :D

    Anonymous, 2012-01-02 в 20:54:57

    было в статье в описании создания структуры директорий под trash
    chmod 770 /shares/trash
    надо
    chmod -R 770 /shares/trash

    Cancer, 2013-01-30 в 17:35:42

    Я скрипт немного подпили что бы не создавал он директории с именами ПК в сети типа ur01_
    Вот в этом скрипте я добавил в 1 строчке egrep -v create_user_data_subdir.sh
    user_name="`echo $1 | /usr/bin/tr '[:upper:]' '[:lower:]' | egrep -v *_`"

    Ну вот и все =)
    Все работает нормально!

    Cancer, 2013-01-30 в 17:37:34

    Учитывайте у меня нет пользователей в домене с символами _

    Cancer, 2013-01-31 в 9:11:49

    5 копеек в копилку.
    Запили скрипт который создает домашние директории для пользователей и применяет сразу ACL на них такие как мне нужно.
    Владелец DOMAIN\Administrator
    Полные права DOMAIN\<user>
    Полные права DOMAIN\Администраторы домена
    Вот сам скрипт http://pastebin.com/Jqj6FFuV
    работает все это дело через smbcacls вот страничка руководства по ней http://www.samba.org/samba/docs/man/manpages/smbcacls.1.html
    Использую ее на линуксе, но посмотрел на FreeBSD она тоже есть.
    Еще использую в Linux acl_xattr и у меня нет лишних групп UNIX root итд итп, выставляю только группы которые мне нужны.
    Вот пример конфига опять же для линукса http://pastebin.com/bhtbn7qR
    Думаю информация будет полезной.



  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.0826 секунд
    Из них PHP: 58%; SQL: 42%; Число SQL-запросов: 77 шт.
    Исходный размер: 61211; Сжатая: 14852