Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> главная —> Архив —> SAMBA + LDAP

Настройка Samba для хранения информации в LDAP

Автор: fr33man.


Обновленная версия лежит здесь.

Решил настроить хранение пользовательских учеток в LDAP. Пришлось посидеть.. Было много моментов на которых запинался. Решил написать
статейку, чтобы самому не забыть и людям помочь.

Перед настройкой связки samba + ldap нужно настроить LDAP сервер и авторизацию через LDAP.
Первым делом необходимо установить samba:

spider# cd /usr/ports/net/samba3
spider# make config

      ---------------------------------------------------------------------¬
     ¦                    Options for samba 3.0.22,1                      ¦
     ¦ -----------------------------------------------------------------¬ ¦
     ¦ ¦ [X] LDAP          With LDAP support                            ¦ ¦
     ¦ ¦ [ ] ADS           With Active Directory support                ¦ ¦
     ¦ ¦ [X] CUPS          With CUPS printing support                   ¦ ¦
     ¦ ¦ [X] WINBIND       With WinBIND support                         ¦ ¦
     ¦ ¦ [ ] ACL_SUPPORT   With ACL support                             ¦ ¦
     ¦ ¦ [ ] AIO_SUPPORT   With experimental AIO support                ¦ ¦
     ¦ ¦ [ ] SYSLOG        With Syslog support                          ¦ ¦
     ¦ ¦ [X] QUOTAS        With Quota support                           ¦ ¦
     ¦ ¦ [X] UTMP          With UTMP support                            ¦ ¦
     ¦ ¦ [ ] MSDFS         With MSDFS support                           ¦ ¦
     ¦ ¦ [ ] SAM_XML       With XML smbpasswd backend                   ¦ ¦
     ¦ ¦ [ ] SAM_MYSQL     With MYSQL smbpasswd backend                 ¦ ¦
     ¦ ¦ [ ] SAM_PGSQL     With PostgreSQL smbpasswd backend            ¦ ¦
     ¦ ¦ [ ] SAM_OLD_LDAP  With Samba2.x LDAP legacy smbpasswd backend  ¦ ¦
     ¦ ¦ [ ] SMBSH         With SMBSH wrapper for UNIX commands         ¦ ¦
     ¦ ¦ [ ] PAM_SMBPASS   With SMB PAM module                          ¦ ¦
     ¦ ¦ [ ] EXP_MODULES   With experimental module(s)                  ¦ ¦
     ¦ ¦ [X] POPT          With system-wide POPT library                ¦ ¦
     +-L-----v(+)---------------------------------------------------------+
     ¦                       [  OK  ]       Cancel                        ¦
     L---------------------------------------------------------------------

spider# make install clean
... skipped ...

spider# 

Теперь переходим к редактированию конфигурационного файла самбы:

smb.conf:

[global]

   # Имя домена
   workgroup = teachers
   
   # nebios имя машины
   netbios name = spider

   # Описание сервера
   server string = Documents

   # Тип безопасности user(необходимо для PDC)
   security = user

   # Хосты, которым разрешено обращаться к нашему серверу
   hosts allow = 192.168.1. 127.

   # Не использовать принтеры
   load printers = no

   # Лог файл самбы
   log file = /var/log/samba/log.%m

   # Максимальный размер лога
   max log size = 500

   # Использовать зашированные пароли
   encrypt passwords = yes
   
   # Администратор домена
   admin users = admin

   # Пароли храним в LDAP
   passdb backend = ldapsam:ldaps://spider.teachers/

    # Корень LDAP сервера
    ldap suffix = dc=l1523,dc=ru
	
    # Пользователи храняться в контейнере ou=users
    ldap user suffix = ou=users
	
    # Группы в контейнере ou=groups
    ldap group suffix = ou=groups
	
    # Контейнер для машин пользователей
    ldap machine suffix = ou=computers
	
    # Объект администратора samb'ы в LDAP
    ldap admin dn = "cn=root,dc=l1523,dc=ru"
	
    # Запрещаем удалять объекты
    ldap delete dn = no

    # Включаем поддержку SSL
    ldap ssl = on


   # Сетевые параметры
   socket options = TCP_NODELAY


   # Делаем из samb'ы PDC
   local master = yes
   os level = 64
   domain master = yes
   preferred master = yes
   domain logons = yes

   # Скрипт, который запустится при входе пользователя
   logon script = proxy.vbs

   # Сетевой путь, который необходимо подключить
   logon path = \\%L\Profiles\%U\%m\%a
   logon home = \\%L\Profiles\%U\%m\%a
	
    # Имя диска, на который подключать
    logon drive = Z:

    # Поддержка wins
    wins support = yes

    # Не используем dns proxy
    dns proxy = no

    # Настройка кодировки
    display charset = koi8-r
    unix charset = koi8-r
    dos charset = cp866

    # Пусть samb'а еще и время отдает
    time server = yes

    # Скрипт, для добавления машин
    add machine script = /usr/local/etc/samba/add_machine.pl %m

# Описание расшаренных директорий
[homes]
   comment = Home Directories
   browseable = no
   writable = yes

 [netlogon]
   comment = Network Logon Service
   path = /usr/local/etc/samba/netlogon/
   guest ok = yes
   writable = no
   share modes = no
   browseable = no

[Profiles]
    create mode = 600
    directory mode = 700
    path = /home
    browseable = no
    guest ok = yes
 
[data]
        comment = Dump of files
        path = /data
        create mode = 660
        directory mode = 770
        public = yes
        writeable = yes
        write list = @People, @wheel
        read list = @People, @wheel
[tst]
        comment = Dump of files
        path = /tst
        create mode = 664
        directory mode = 770
        public = yes
        writeable = no
        write list = fr33man, slv, admin
        read list = @People, @wheel, admin

Теперь необходимо создать всех необходимых пользователей, а так же все папки и скрипты.

Добавляем в LDAP необходимые контейнеры:

spider# cat base.ldif

dn: ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: groups

dn: ou=computers,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: computers

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f base.ldif
Enter LDAP Password:
adding new entry "ou=users,dc=l1523,dc=ru"

adding new entry "ou=groups,dc=l1523,dc=ru"

adding new entry "ou=computers,dc=l1523,dc=ru"

Теперь добавим группу admin и самого админа:

spider# cat admin_group_samba.ldif
dn: cn=Admin Group Samba,ou=groups,dc=l1523,dc=ru
objectClass: top
objectClass: posixGroup
cn: Admin Group Samba
gidNumber: 1000
memberuid: admin

spider# cat admin.ldif
dn: cn=admin,ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: admin
sn: admin
uid: admin
userPassword: {SSHA}*
uidNumber: 1000
gidNumber: 1000
gecos: Samba Admin
homeDirectory: /home/admin
loginShell: /usr/sbin/nologin

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f admin_group_samba.ldif
Enter LDAP Password:
adding new entry "cn=Admin Group Samba,ou=groups,dc=l1523,dc=ru"

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f admin.ldif
Enter LDAP Password:

adding new entry "cn=admin,ou=users,dc=l1523,dc=ru"

Проверяем:
spider# id admin
uid=1000(admin) gid=1000(Admin Group Samba) groups=1000(Admin Group Samba)
spider#

Все ок. Теперь создаем обычного пользователя:
spider# cat users_group_samba.ldif
dn: cn=People,ou=groups,dc=l1523,dc=ru
objectClass: top
objectClass: posixGroup
cn: People

spider# cat mtg.ldif@spider ~]$ echo -n "Миши

dn: cn=mtg,ou=users,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
cn: mtg
sn:: 0JzQuNGI0LjQvdCw
uid: mtg
userPassword: {SSHA}uBAtwLMhY/B3/fz6ct/18wQVnmYtZN6z
uidNumber: 5004
gidNumber: 5001
gecos: User
homeDirectory: /home/mtg
loginShell: /usr/sbin/nologin

spider#

Русские буквы в LDAP хранятся в кодировке base64:

[fr33man@spider ~]$ echo -n "Мишина" | iconv -f koi8-r -t utf-8 | \
? uuencode -m 1 | head -n2 | tail -n 1
0JzQuNGI0LjQvdCw
[fr33man@spider ~]$

Тут закодировано слово "Мишина". Два двоеточия говорят LDAP'у о том, что поле закодировано base64. Теперь добавляем:

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f users_group_samba.ldif
Enter LDAP Password:
adding new entry "cn=People,ou=Groups,dc=l1523,dc=ru"

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f mtg.ldif
Enter LDAP Password:
adding new entry "cn=mtg,ou=users,dc=l1523,dc=ru"

spider# id mtg
uid=5080(mtg) gid=5001(People) groups=5001(People)
spider#

Создаем домашние директории:

spider# mkdir /home/mtg
spider# chown mtg:People /home/mtg/
spider# chmod 0700 /home/mtg/
spider# ls -lad /home/mtg/
drwx------  2 mtg  People  512 Oct  6 11:28 /home/mtg/
spider# mkdir /home/admin
spider# chown admin:Admin\ Group\ Samba /home/admin/
spider# chmod 0700 /home/admin/
spider# ls -lad /home/admin/
drwx------  2 admin  Admin Group Samb  512 Oct  2 19:03 /home/admin/
spider#

Теперь указываем самбе пароль от пользователя, который указан в smb.conf:

spider# smbpasswd -w 123456
Setting stored password for "cn=root,dc=l1523,dc=ru" in secrets.tdb
spider#

И добавляем пользователя admin и mtg:

spider# smbpasswd -a admin
New SMB password:
Retype new SMB password:
Added user admin.
spider# smbpasswd -a mtg
New SMB password:
Retype new SMB password:
Added user mtg.
spider#

Теперь поставим в соответствие nt группы и группы unix:

spider# net groupmap add rid=512 unixgroup="Admin Group Samba" \
? ntgroup="Admin Group Samba"
Successully added group Admin Group Samba to the mapping db
spider# net groupmap add rid=513 unixgroup="People" ntgroup="People"
Successully added group People to the mapping db
spider# net groupmap list
Admin Group Samba (S-1-5-21-3696629298-3620909010-2906680271-512) 
-> Admin Group Samba
People (S-1-5-21-3499699245-1344799222-3934724855-3003) -> People
spider#

Возможные rid:

Domain Admins 512
Domain Users 513
Domain Guests 514
Domain Computers 515
Domain Controllers 516
Cert Publishers 517
Shema Admins 518
Enterprise Admins 519
Group Policy Creator Owners 520

Осталось создать необходимые директории и скрипты:


spider# mkdir -p /usr/local/etc/samba/netlogon/

/usr/local/etc/samba/add_machine.pl:

#!/usr/bin/perl

$pass = "123456";

if ($ARGV[0] eq ''){ die "Usage: $0 machine";};

for($i = 10000; $i < 20000; $i++)
{
        $res = `id $i 2>&1`;
        if($res =~ m/id\:/)
        {
                $uid = $i;
                $i = 20000;
        }
}

open(LDIF,">/tmp/".$ARGV[0].".machine.ldif");
print LDIF "dn: cn=".$ARGV[0].",ou=computers,dc=l1523,dc=ru\n";
print LDIF "objectClass: top\n";
print LDIF "objectClass: person\n";
print LDIF "objectClass: posixAccount\n";
print LDIF "objectClass: shadowAccount\n";
print LDIF "cn: ".$ARGV[0]."\n";
print LDIF "sn: ".$ARGV[0]." Computer\n";
print LDIF "uid: ".$ARGV[0]."\$\n";
print LDIF "userPassword: {SSHA}*\n";
print LDIF "uidNumber: ".$uid."\n";
print LDIF "gidNumber: 5002\n";
print LDIF "gecos: Computer\n";
print LDIF "homeDirectory: /dev/null\n";
print LDIF "loginShell: /usr/sbin/nologin\n";
close(LDIF);

system("/usr/local/bin/ldapadd -x -w $pass -D \"cn=root,dc=l1523,dc=ru\" \ 
-f /tmp/".$ARGV[0].".machine.ldif > /dev/null");

system("/bin/rm -rf /tmp/".$ARGV[0].".machine.ldif");
system("/usr/local/bin/smbpasswd -am ".$ARGV[0]." >/dev/null");

exit(0);

/usr/local/etc/samba/netlogon/proxy.vbs:


set wshShell = Wscript.CreateObject("WScript.Shell")
prefix = "HKEY_CURRENT_USER\Software\Microsoft\Windows\
CurrentVersion\Internet Settings\"
wshShell.regWrite prefix & "ProxyServer", "shield:3128"
wshShell.regWrite prefix & "ProxyEnable", 1

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

Настал Самый ответственный момент — запуск samba:
spider# echo samba_enable=\"YES\" >> /etc/rc.conf
spider# /usr/local/etc/rc.d/samba.sh start

Теперь осталось завести машину в домен, причем после заведения создастся ее аккаунт:
spider# id veterok$
uid=10004(veterok$) gid=5002(computers) groups=5002(computers)
spider#

Все, пользователи нормально входят в домен и все работает.



размещено: 2006-11-08,
последнее обновление: 2007-03-17,
автор: fr33man


Magius, 2006-11-10 в 14:46:59

Насколько я помню после добавления группы admin и самого админа надо еще отредактировать
файл nsswitch.conf добавив в строки
group: и passwd: упоминание о ldap
вот только не помню подробностей...
Однако после этого появляются проблемы
с перезагрузкой мой серв поднимался 3-5 мин
а без этого ваще не работало

fr33man, 2006-11-10 в 15:08:03

Не спорю, перед тем как связывать samb'у и LDAP необходимо настроить как минимум сам LDAP и авторизацию через него:

http://www.lissyara.su/?id=1277

http://www.lissyara.su/?id=1279

CRIO, 2006-12-19 в 15:08:11

не заводилась машина в домен
Samba 3.0.23d не находила запись компьютера.
решилось изменением скрипта
-------------------
open(LDIF,">/tmp/".$ARGV[0].".machine.ldif");
print LDIF "dn: uid=".$ARGV[0]."\$,ou=computers,dc=domain,dc=ru\n";
print LDIF "objectClass: sambaSamAccount\n";
print LDIF "objectClass: top\n";
print LDIF "objectClass: account\n";
print LDIF "objectClass: posixAccount\n";
print LDIF "objectClass: shadowAccount\n";
print LDIF "cn: ".$ARGV[0]."\$\n";
print LDIF "uid: ".$ARGV[0]."\$\n";
print LDIF "uidNumber: ".$uid."\n";
print LDIF "gidNumber: 65534\n";
print LDIF "homeDirectory: /dev/null\n";
print LDIF "loginShell: /usr/sbin/nologin\n";
print LDIF "sambaDomainName: DOMAIN\n";
print LDIF "sambaAcctFlags: [W]\n";
print LDIF "sambaSID: S-1-5-21-и т.д.\n";
print LDIF "sambaPrimaryGroupSID: S-1-5-21-и т.д.\n";
close(LDIF);
-------------------

Denis V Metelenko, 2007-02-02 в 6:45:30

С Вашего позволения, - несколько дополнений:
FreeBSD 6.2 stable
OpenLDAP 2.3.33
Samba 3.0.23d
_____________________________________
cat users_group_samba.ldif
dn: cn=People,ou=groups,dc=l1523,dc=ru
objectClass: top
objectClass: posixGroup
cn: People

не выполнимо без указания gidNumber

_____________________________________
выполнение команды
smbpasswd -a admin
не привело к желаемому результату, пока в slapd.conf не была добавлена строчка
include/opt/ldap/etc/openldap/schema/samba.schema
только после этого удалось добавить пользователя в домен

fr33man, 2007-03-12 в 17:07:05

Извиняйте за неточности... Писалось после того, как делалось... Сегодня исправлю ошибки, дополню и выложу обновленную статью.

аа256, 2008-03-24 в 14:29:08

да пошел ты нахуй с неоригинальностью

f4ber, 2008-03-24 в 14:30:01

Статья является неточной, нет связки через nsswitch поэтому в реальных условиях описанное здесь работать не будет.

Volkir, 2011-11-28 в 18:47:18

согласен с последним постом...

Jungo, 2019-02-06 в 13:49:30

что насчет квот?



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0814 секунд
Из них PHP: 43%; SQL: 57%; Число SQL-запросов: 63 шт.
Исходный размер: 42737; Сжатая: 9476