Samba в роли PDC на системных учетках

26.08.2010 - 09:08

На предприятии, где я работал, решил развернуть классический домен контроллер на SAMBA. Клиентов около 50-ти, ОС Windows XP. Приступим..
Реалии:

FreeBSD 7.0-RELEASE
SAMBA Version 3.0.35

Устанавливать будем, как обычно с портов:
[root@router /]# cd /usr/ports/net/samba3
[root@router /usr/ports/net/samba3]# make config && make install clean

В выпадающем окне выбираем:
[X] ADS          With Active Directory support
[X] WINBIND      With WinBIND support
[X] ACL_SUPPORT  With ACL support

Далее настроим конфиг самбы:
[root@router /]#cat /usr/local/etc/smb.conf
[global]
        # Название домена
        workgroup = SH1

        # Имя сервера
        netbios name = PDCSERV

        # Описание
        server string = Primary Domain Controller

        # Скрипт добавления пользователя
        add user script = /usr/local/etc/samba/add_user_script.sh "%u"

        # Скрипт удаления пользователя
        delete user script = /usr/sbin/pw userdel "%u" -r

        # Скрипт переименованя пользователя
        # (следующие две строки - на самом деле одна. невлезает ..)
        rename user script = /usr/local/etc/samba/rename_user_script.sh "%uold" "%unew"

        # Скрипт перезапуска самбы (Вообще, в man smb.conf, предлагается
        # ребутить или класть всю машину. Перебор, по моему... Хотя -
        # у меня это не работает. Такчто - пофиг.)
        shutdown script = /usr/local/etc/samba/shutdown_script.sh

        # Скрипт добавления новой группы
        add group script = /usr/sbin/pw groupadd "%g"

        # Скрипт удаления группы
        delete group script = /usr/sbin/pw groupdel "%g"

        # Скрипт добавления пользователя в группу
        # (следующие две строки - на самом деле одна. невлезает ..)
        add user to group script = /usr/local/etc/samba/add_user_to_group_script.sh "%g" "%u"

        # Скрипт установки первичной группы для пользователя
        set primary group script = /usr/sbin/pw usermod "%u" -g "%g"

        # Скрипт удаления пользователя из группы
        # (следующие две строки - на самом деле одна. невлезает ..)
        delete user from group script = /usr/local/etc/samba/delete_user_from_group_script.sh "%g" "%u"

        # Скрпит для добавления аккаунта компьютера
        add machine script = /usr/local/etc/samba/add_machine_script.sh "%u"

        # Скрипт проверки пароля (чтобы не пихали 12345 и прочее. Должен вернуть 0
        # если пароль нормальный, и что-то другое - если нет. Пароль передаётся
        # на стандартный ввод скрпита)
        check password script = /path/to/password/check/script.sh

        # Скрпит - чё делать при получении сообщений по winpopup (из man`a)
        #message command = /usr/bin/mail -s 'message from %f on %m' admin < %s; rm %s

        # Где лежат скрпиты, выполняемые доменными компами при загрузке
        logon script = logon.bat

        # Разрешить обработку входов в домен
        domain logons = Yes

        # Уровень ОС. Чем выше номер, тем выше вероятность стать главным браузером сети
        os level = 255

        # При запуске устраивает перевыборы с наибольшим шансом для себя
        preferred master = Yes

        # Мой сервер является обозревателем домена
        domain master = Yes

        # Samba сразу берет на себя роль мастер-браузера
        local master = yes

        # Параметр определяет диапазон пользовательских идентификаторов, выделяющихся для сопоставления SIDов UNIX
        # пользователей SIDам NT пользователей. Этот диапазон идентификаторов не должен пересекаться
        # с локальными или NIS пользователями, иначе возможны конфликты.
        idmap uid = 5000-9999
        idmap gid = 5000-9999

        # Кого не пускать
        # в итоге она у меня раскомментирована, но настройку я делал с закомменченой.
        # настоятельно рекомендую расккомментить, после настройки и введения
        # самой машины в домен
        invalid users = root
       
        # Список сетевых интерфейсов, которым разрешен доступ к серверу
        interfaces = 192.168.1.1

        # Список сетей, которым разрешен доступ к нашему серверу
        hosts allow = 192.168.1. 127.

        # Доменная аутентификация
        security = user

        # Включаем поддержку WINS(сервер)
        wins support = yes

        # Указываем виндовый WINS из другого домена - на время, пока он ещё жив
        #wins server = 192.168.1.1
        dns proxy = yes

        #Сервер времини сихронизировать будем с помощью .bat файла
        time server = yes

        # Перемещаемые профили (если не указать эти пункты пустыми -
        # профили у пользователей будут перемещаемые)
        logon path =
        logon home =
        template homedir =

        # логгинг
        log level = 10 passdb:10 auth:10 winbind:10
        log file = /var/log/samba/log.%m

        display charset = koi8-u
        unix charset = koi8-u
        dos charset = cp866


### Начало файловых шар ###

# в этом каталоге будут размещаться стартовые скрипты logon.bat
[netlogon]
        comment = Network Logon Service
        path = /usr/home/samba/netlogon
        guest ok = Yes
        browseable = no
        write list = vlymar
        admin users = vlymar

# перемещаемые профили
[Profiles]
        comment = Roaming Profile Share
        path = /usr/home/samba/profiles
        read only = No
        profile acls = Yes
        browseable = no

# сетевой диск "Z", в котором будут находиться директории пользователей домена с правами "755". Опишу какие параметры, что означают.
#название ресурса
[public]
   #комментарий к ресурсу
   comment = Директории пользователей домена
   #путь к месторасположению ресурсу
   path = /home/samba/public
   # запрещаем пользователям сохранять на сетевом диске файлы с такими расширениями
   veto files = /*.avi/*.mp3/*.mkv/*.wav/*.wma/*.fly/*.mpg/*.mpeg/*.vob/*.3gp/*.exe/*.reg/
   # говорим удалять эти файлы
   delete veto files = yes
   # обеспечивает отображение в сети Windows
   browseable = yes
   # разрешаем запись
   writable = yes
   # если этот параметр задан в yes на общем ресурсе, то для подключения к ресурсу не требуется пароль.
   guest ok = yes
   # ниже перечислены параметры отвечающие за создание каталогов и файлов пользователями с правами "755"
   create mask = 0755
   force create mode = 0755
   security mask = 0755
   directory mask = 0755
   force directory mode = 0755
   directory security mask = 0755

# сетевой диск "O", в котором будут находиться директории с доступом по отделам с правами "070"
[otdel]
   comment = Директории c доступом по отделах
   path = /home/samba/otdel
   veto files = /*.avi/*.mp3/*.mkv/*.wav/*.wma/*.fly/*.mpg/*.mpeg/*.vob/*.3gp/*.exe/*.reg/
   delete veto files = yes
   browseable = yes
   writable = yes
   guest ok = yes
   create mask = 0770
   force create mode = 0770
   security mask = 0770
   directory mask = 0770
   force directory mode = 0770
   directory security mask = 0770

# мои шары
[software]
   comment = Софт
   path = /mnt/ad4/distrib
   browseable = yes
   guest ok = yes
   create mask = 0755
   force create mode = 0755
   write list = @ntadmins
   read list = @ntusers

[pictures]
   comment = Графика
   path = /mnt/ad4/pictures
   browseable = yes
   guest ok = yes
   create mask = 0755
   force create mode = 0755
   write list = @ntadmins
   read list = @ntusers

[music]
   comment = Музыка
   path = /mnt/ad4/music
   browseable = yes
   guest ok = yes
   create mask = 0755
   force create mode = 0755
   write list = @ntadmins
   read list = @ntusers

[films]
   comment = Фильмы
   path = /mnt/ad4/films
   browseable = yes
   guest ok = yes
   create mask = 0755
   force create mode = 0755

# Cписок пользователей имеющих доступ к сервису на чтение/запись. Если соединяющийся пользователь находится в этом списке тогда, он получит доступ на запись независимо от точо установлен параметр read only (только чтение). Список может содержать названия группы, используется синтаксис @group. Заметьте, что если пользователи одновременно находятся в списке только для чтения и в списке на чтение/запись, они получат доступ и на запись.
   write list = @ntadmins, vlymar

# Это список пользователей, которым открыт доступ “только для чтения”. Если такой пользователь присоединится к ресурсу — он не получит доступ на запись, независимо от того выставлено ли на самом ресурсе “только для чтения”.
   read list = @ntusers

# Это – список пользователей, которым будут предоставлять административные привилегии на общем ресурсе. Это означает, что они работают с файлами как суперпользователь (root).
   admin users = vlymar

# Если параметр установлен в yes(только для чтения), то пользователь не сможет создавать или изменять файлы в этой директории.
   read only = yes

[upload]
   comment = Обменник для всех, автоматическое удаление через 7 дней
   path = /mnt/ad4/tmp
   browseable = yes
   writable = yes
   guest ok = yes
   create mask = 0777
   force create mode = 0777
   write list = @ntadmins, @ntusers

Создадим необходимые скрипты, которые используются в конфиге самбы:

[root@router /]#cat /usr/local/etc/samba/add_user_script.sh
#!/bin/sh

# скрипт добавления пользователей
/usr/sbin/pw useradd "$1" -d /usr/home/samba/profiles/"$1" \
                -s /sbin/nologin -L "russian" -m -g ntusers -c "$1"
# отладка
echo "added user '$1' in `date +%Y-%m-%d` `date +%H:%M:%S`" >> /tmp/`basename $0`.log

[root@router /]#cat /usr/local/etc/samba/rename_user_script.sh
#!/bin/sh
#-xv

# Старое имя пользователя
old_username="$1"
# Новое имя пользователя
new_username="$2"

# Достаём строку из /etc/master.passwd - есть ли такой юзер, и какие у него данные.
user_data=`grep "^${old_username}:" /etc/master.passwd` > /dev/null 2>&1

# Достаём имя пользователя
user_from_passwd="`echo ${user_data} | awk -F ':' '{print $1}'`" > /dev/null 2>&1

# Проверяем существование пользователя
if [ ${user_from_passwd} = ${old_username} ] > /dev/null 2>&1
then
#       echo "Есть ссучий юзер!"
        # Пользователь есть. Достаём поля из его строки данных.
        user_uid="`echo ${user_data} | awk -F ':' '{print $3}'`"
        user_gid="`echo ${user_data} | awk -F ':' '{print $4}'`"
        user_login_class="`echo ${user_data} | awk -F ':' '{print $5}'`"
        user_geos="`echo ${user_data} | awk -F ':' '{print $8}'`"
        user_home_dir="`echo ${user_data} | awk -F ':' '{print $9}'`"
        #echo "Данные пользователя"
        #echo "UID = ${user_uid}"
        #echo "GID = ${user_gid}"
        #echo "LoginClass = ${user_login_class}"
        #echo "INFO = ${user_geos}"
        #echo "HOME = ${user_home_dir}"
        # Проверяем, нет ли нового с таким же именем
        new_from_passwd="`echo ${user_data} | \
                                awk -F ':' '{print $1}'`
"
> /dev/null 2>&1
        if [ ${user_from_passwd} = ${new_username} ] > /dev/null 2>&1
        then
                #echo "Уже есть cсучий юзер!!"
                exit 1;
        else
                # Удаляем старого
                pw userdel ${old_username}
                # Заводим нового
                pw useradd "${new_username}" -d "${user_home_dir}" \
                -s /sbin/nologin -L "${user_login_class}" -g "${user_gid}" \
                -u "${user_uid}" -c "${user_geos}"
                # выходим
                #echo "Успешно переименован ${old_username} --> ${new_username}"
        fi
else
        echo "Ноу cсучий юзер!!"
        exit 1;
fi

[root@router /]#cat /usr/local/etc/samba/shutdown_script.sh
#!/bin/sh
# Перезапукаем самбу (в бакгроунде - обязательно!)
/usr/local/etc/rc.d/samba restart &

[root@router /]#cat /usr/local/etc/samba/delete_user_from_group_script.sh
#!/bin/sh

list_current_users="`pw groupshow $1 | awk -F ':' '{print $4}'`"
echo "Текущие пользователи: $list_current_users" >> \
/tmp/delete_user_from_group_script.sh.log

new_list_users="`echo ${list_current_users} | \
                awk -F $2 '{print $1$2 }' | tr -s ',,' ','`
"


echo "Новые пользователи: $new_list_users" >> \
/tmp/delete_user_from_group_script.sh.log
echo "" >> /tmp/delete_user_from_group_script.sh.log


pw groupmod $1 -M $new_list_users

[root@router /]#cat /usr/local/etc/samba/add_machine_script.sh
#!/bin/sh

# скрипт добавления машины
/usr/sbin/pw useradd "$1" -d /usr/home/samba/profiles/all_computers \
        -s /sbin/nologin -L "russian" -m \
        -g computers -c "computer_account"

# отладка
echo "added komp '$1' in `date +%Y-%m-%d` `date +%H:%M:%S`" >> /tmp/`basename $0`.log

[root@router /]#cat /usr/local/etc/samba/add_user_to_group_script.sh
#!/bin/sh

# скрипт добавления пользователя в группу
list_current_users="`pw groupshow $1 | awk -F ':' '{print $4}'`"
echo $list_current_users
pw groupmod $1 -M $list_current_users,$2

делаем их исполняемыми, даем права "755".

Для автоудаления устаревших файлов с шары "Upload" через 7 дней, добавим задание в крон:

[root@router /etc]#cat >> /etc/crontab
0 2 * * * root find /mnt/ad4/tmp -type f -mtime +7 -exec rm -f {} \;

Создаем необходимые директории:

[root@router /]#mkdir -p /home/samba/{netlogon,otdel,public}

Займемся созданием стартовых скриптов, которые будут применяться по политике домена:

[root@router /]#cd /home/samba/netlogon
[root@router /home/samba/netlogon]# ls -l
total 14
-rwxrwxrwx  1 ftp     ftp        49  3 окт 14:33 lock.cmd
-rwxr-xr-x  1 vlymar  ntusers  1142 16 июл 08:37 lock.reg
-rwxrwxrwx  1 vlymar  ntusers   149  3 окт 14:33 logon.bat
-rwxr-xr-x  1 root    wheel     249 18 май  2009 proxy.vbs
-rwxr-xr-x  1 vlymar  it_ot      63  1 окт 14:07 share.bat
-rwxr-xr-x  1 vlymar  ntusers    32  1 окт  2009 time.bat
-rwxr-xr-x  1 ftp     ftp      1142 16 июл 08:37 unlock.reg

Создадим эти файлы:

[root@router /]# touch /home/samba/netlogon/logon.bat
[root@router /]# touch /home/samba/netlogon/proxy.bat
[root@router /]# touch /home/samba/netlogon/time.bat
[root@router /]# touch /home/samba/netlogon/share.bat
[root@router /]# touch /home/samba/netlogon/lock.cmd

Главным стартовым скриптом является logon.bat, который будет выполнять все остальные наши скрипты. Главное правило, все эти файлы нужно создавать в Windows ОС, можно в блокноте, так как они будут выполняться в ней!

[root@router /]# cat /home/samba/netlogon/logon.bat
call \\PDCSERV\netlogon\share.bat
Wscript \\PDCSERV\netlogon\proxy.vbs
call \\PDCSERV\netlogon\time.bat
call \\PDCSERV\netlogon\lock.cmd

Reg-файл с помощью которого мы указываем proxy-сервер в IE:

[root@router /home/samba/netlogon]# cat proxy.vbs
set wshShell = Wscript.CreateObject("WScript.Shell")
prefix = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"
wshShell.regWrite prefix & "
ProxyServer", "proxy.sh1:3128"
wshShell.regWrite prefix & "
ProxyEnable", 1

Подключаем сетевые ресурсы (диск "Z" и "O"):

[root@router /home/samba/netlogon]# cat share.bat
net use Z: \\PDCSERV\public -y
net use O: \\PDCSERV\otdel -y

Синхронизируем время на клиентах с нашим NTP-сервером:

[root@router /home/samba/netlogon]# cat time.bat
net time \\192.168.1.1 /SET /YES

Блокируем USB порты:
[root@router /home/samba/netlogon]# cat lock.cmd
start/wait regedit -s \\PDCSERV\netlogon\lock.reg
start/wait regedit -s \\PDCSERV\netlogon\auto.reg

Сам reg-файл:
[root@router /home/samba/netlogon]# cat lock.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbstor]
"Type"=dword:00000001
"Start"=dword:00000004
"ErrorControl"=dword:00000001
"DisplayName"="Драйвер запоминающих устройств для USB"
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,44,00,\
  52,00,49,00,56,00,45,00,52,00,53,00,5c,00,55,00,53,00,42,00,53,00,54,00,4f,\
  00,52,00,2e,00,53,00,59,00,53,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbstor\Enum]
"Count"=dword:00000000
"NextInstance"=dword:00000000

Отключаем скриптом auto.reg автозапуск флешек и другого..:

[root@router /home/samba/netlogon]# cat auto.reg
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom]
"AutoRun"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000FF

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDriveTypeAutoRun"=dword:000000FF

Назначим им права "755" :

[root@router /]# chmod -R 755 /home/samba/netlogon/

Добавим самбу в rc.conf:

samba_enable="YES"

Проверим для уверенности smb.conf на ошибки программой testparam:

[root@router /etc]# testparm
Load smb config files from /usr/local/etc/smb.conf
Processing section "[netlogon]"
Processing section "[Profiles]"
Processing section "[public]"
Processing section "[otdel]"
Processing section "[software]"
Processing section "[pictures]"
Processing section "[music]"
Processing section "[films]"
Processing section "[upload]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions

как видим все в полном порядке.

Пробуем запускать samba:

[root@router /etc]#/usr/local/etc/rc.d/samba start
Removing stale Samba tdb files: ....... done
Starting nmbd.
Starting smbd.
Starting winbindd.
[root@router /etc]#

Добавим пользователя root в самбу:

[root@router /etc]#smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.
[root@router /etc]#

Создадми карту стандартных виндовых групп на юниксовые:
[root@router /]# cat /usr/local/etc/samba/samba_group.sh
#!/bin/sh
#!/bin/bash
#### Keep this as a shell script for future re-use

pw groupadd ntadmins
pw groupadd ntusers
pw groupadd computers

net groupmap add ntgroup="Domain Admins" unixgroup=ntadmins rid=512 type=d
net groupmap add ntgroup="Domain Users"  unixgroup=ntusers  rid=513 type=d
net groupmap add ntgroup="Domain Guests" unixgroup=nobody rid=514 type=d
net groupmap add ntgroup="Domain Computers" unixgroup=computers type=d

Выполняем его:
[root@router /usr/local/etc/samba]#./samba_group.sh
Successfully added group Domain Admins to the mapping db as a domain group
Successfully added group Domain Users to the mapping db as a domain group
Successfully added group Domain Guests to the mapping db as a domain group
No rid or sid specified, choosing a RID
Got RID 3013
Successfully added group Domain Computers to the mapping db as a domain group
[root@srv /usr/local/etc/samba]#

Добавим себя в группу "Администраторы домена" - ntadmins:
[root@router /]# pw groupmod ntadmins -M vlymar

Смело можно добавлять наш PDC в домен:
[root@router /]#net join PDCSERV -U vlymar
Password:
Joined domain SH1.

Немного поговорим о сетевых дисках "Z" и "O".
Диск "Z", является пользовательским сетевым диском с разграниченными правами на каждого юзера "755".
Например:

[root@router /home/samba/public]# ls -l
total 62
.....
drwxr-xr-x   4 nivanchenko   ntusers    512 30 сен 12:08 Иванченко Николай
.....

Диск "O", является пользовательским сетевым диском с правами по группам, информация доступна в пределах своего отдела.
Создаем группу buh_ot, и добавляем в нее пользователей этой группы:
buh_ot:*:1114:omorу,kljuk,nрenko

[root@router /home/samba/otdel]# ls -l
total 18
....
d---rwx---  2 root  buh_ot        512  1 окт 13:17 Бухгалтерия
....

Для добавления учетной записи пользователя домена я использую скрипт.
Для просмотра списка пользователей и групп домена используйте:

[root@router /]#wbinfo -u
[root@router /]#wbinfo -g

Часть конфигов взята с статьи lissyara - Samba в роли контроллера домена, без использования LDAP.
Для просмотра SID домена необходимо выполнить:
[root@router ~]# net getlocalsid
SID for domain PDCSERV is: S-1-5-21-2769215453-6741887692-3979662434

Прикрепленный файлРазмер
add_machine_script.sh271 байт
add_user_script.sh252 байта
add_user_to_group_script.sh184 байта
delete_user_from_group_script.sh439 байтов
rename_user_script.sh1.87 кб
samba_group.sh433 байта
shutdown_script.sh98 байтов
lock.cmd49 байтов
lock.reg1.12 кб
logon.bat149 байтов
proxy.vbs249 байтов
share.bat63 байта
time.bat32 байта
unlock.reg1.12 кб
auto.reg343 байта
Ваша оценка: Нет Средняя: 3.7 (6 votes)