Кнопки


Яндекс цитирования


Главная » Документы » SAMBA on MySQL

Samba PDC on MySQL user backend


Привет !!! Давно собирался написать данную статью, но руки (увы) дошли только сейчас. Итак, как сделать хранение всех логинов и паролей самбы в базе данных MySQL.

Для начала определимся: я показываею только направление, дальше Вы думаете сами, те как устанавливать и компилить пакеты я думаю Вы знаете. Тут правда есть одно БОЛЬШОЕ замечание, пользователей в базу у меня добавляет система управления доменом и поэтому самба получает уже готовые RID,SID,UID и GID для пользователей и групп. Так что изложение будет слегка не полное, кто готов помочь - милости просим.

1. Устанавливаем самбу и mysql сервер (у меня samba 3.0.28 и mysql 5.0.54) и пакет libnss-mysql. Версия MySQL сервера тут (в принципе) не на что не влияет, а вот версия samba тут влияет на бакенд связи с базой данных, который нормально работает (и компилиться) под samba 3.0.28. Насчет libnss-mysql (http://libnss-mysql.sourceforge.net/) могу сказать одно - он сильно устарел (изменений небыло с 2006 года), но все также работоспособен и нареканий в своей работе не вызывает (у меня все работает на ура). Плюс ко всему, данный пакет идет во многих дистрибутивах в виде отдельных модулей. Пакет pdbsql развивается и (я так думаю) скоро появится версия под 3.0.30 самбу. Я видел данный модуль в некоторых дистрибах, но о актуальности его версии сказать ничего не могу, поэтому придется покомпилить.

  1. Соберем бекэнд pdbsql
  1. Качаем самбу (http://us1.samba.org/samba/ftp/stable/) в исходниках и заголовки от mysql ибо они нужны для компиляции pdbsql. Естественно надо брать версию 3.0.28.

  2. Со страницы http://pdbsql.sourceforge.net/ качаем исходники pdbsql.

  3. Создаем где-нибудь каталог, в котором все будем компилить (например /root/ccc)

  4. Разворачиваем самба в приготовленный каталог /root/ccc/samba-3.0.28

  5. Разворачиваем исходники pdbsql в нашу папочку /root/ccc/pdbsql-0.3.1-samba

  6. Заходим в папку с исходниками самба и делаем там командочки:

    cd /root/ccc/samba-3.0.28/source
    ./configure
    make proto

    Данные комманды приготавливают самбу для компиления исходников pdbsql.

  7. Собираем pdbsql:

    cd /root/ccc/pdbsql-0.3.1-samba/
    ./configure --with-samba-dir=/root/ccc/samba-3.0.28/source
    make

    В каталоге /root/ccc/pdbsql-0.3.1-samba/ должны появится файлы mysql.so и multi.so

  8. Так как самба у нас уже скомпилена мы просто копируем данные модули в каталог в pdb расширениями самбы:

    cp mysql.so /usr/lib/samba/pdb/mysql.so
    cp multi.so /usr/lib/samba/pdb/multi.so
Теперь у нас вся самба скомпилена и будем считать, что мы готовы переходить к настройке системы.
  1. Настройка системы:
  1. Создадим таблицу в mysql:
 CREATE TABLE `net_usr` (
`logon_time` int(9) default NULL,
`logoff_time` int(9) default NULL,
`kickoff_time` int(9) default NULL,
`pass_last_set_time` int(9) default NULL,
`pass_can_change_time` int(9) default '0',
`pass_must_change_time` int(9) default '2147483647',
`username` varchar(255) default NULL,
`domain` varchar(255) default NULL,
`nt_username` varchar(255) default NULL,
`nt_fullname` varchar(255) default NULL,
`home_dir` varchar(255) default NULL,
`dir_drive` varchar(4) default NULL,
`logon_script` varchar(255) default NULL,
`profile_path` varchar(255) default NULL,
`acct_desc` varchar(255) default NULL,
`workstations` varchar(255) default NULL,
`unknown_str` varchar(255) default NULL,
`munged_dial` varchar(255) default NULL,
`uid` int(9) NOT NULL auto_increment,
`gid` int(9) NOT NULL default '1013',
`user_sid` varchar(255) default NULL,
`group_sid` varchar(255) default NULL,
`lm_pw` varchar(255) default NULL,
`nt_pw` varchar(255) default NULL,
`acct_ctrl` int(9) default '528',
`logon_divs` int(9) default '168',
`hours_len` int(9) default '21',
`unknown_6` int(9) default '1260',
`bad_password_count` int(9) default NULL,
`logon_count` int(9) default '0',
 `logon_hours` varchar(42) default NULL,
`password_history` text,
PRIMARY KEY  (`uid`),
UNIQUE KEY `username_2` (`username`),
KEY `username` (`username`)
);

Данная таблица будет отвечать и за пользователей в системе и за пользователей в самба.

  1. Настроим nss_mysql отредактировав следующие файлы:
  • /etc/libnss-mysql-root.cfg:
[server]
  username    root
  password    password
  • /etc/libnss-mysql.cfg:
[queries]
  getpwnam        SELECT username,'x',uid,gid,nt_fullname,'/dev/null','/bin/false' FROM net_usr WHERE username='%s' LIMIT 1
  getpwuid        SELECT username,'x',uid,gid,nt_fullname,'/dev/null','/bin/false' FROM net_usr WHERE uid='%u' LIMIT 1
  getpwent        SELECT username,'x',uid,gid,nt_fullname as gecos,'/dev/null','/bin/false' FROM net_usr
  getgrnam        SELECT name,'x',gid FROM net_grp WHERE name='%s' LIMIT 1
  getgrgid        SELECT name,'x',gid FROM net_grp WHERE gid='%u' LIMIT 1
  getgrent        SELECT name,'x',gid FROM net_grp
  memsbygid       SELECT net_usr.username FROM net_grp2usr,net_usr WHERE net_grp2usr.gid=%u and net_usr.uid=net_grp2usr.uid
  gidsbymem       SELECT net_grp2usr.gid FROM net_grp2usr,net_usr WHERE net_usr.username='%s' and net_grp2usr.uid=net_usr.uid

[server]
   host    127.0.0.1
   database        samba
   username        root
   password        password
   port    3306
  • /etc/nsswitch.conf:

    passwd:      compat mysql
    shadow:      compat
    group:       compat mysql
    # Дальше идет остальной файл....

Теперь при наличии хоть какой-то записи в таблице должен менятся вывод команда getent passwd.

  1. Настроим саму самбу заполнив следующие файлы:
  • /etc/samba/smb.conf:

    [global]
      # Настройка части бекэнд в mysql
      passdb backend = mysql:mysql
      mysql:mysql host = 127.0.0.1
      mysql:mysql user = root
      mysql:mysql password = password
      mysql:mysql database = samba
      mysql:table = net_usr
      mysql:logon hours column = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    
      # Очень важная команда, работающая на добавление пользователей
      add machine script = /etc/samba/addAccount.py %u
    
      # Остальные настройки для PDC сервера
      wins support = yes
      guest account = smbguest
    
      dos charset = 866
      unix charset = UTF-8
      display charset = UTF-8
    
      admin users = @"Domain Admins"
      logon script = domain.bat
      domain logons = Yes
      workgroup = Samba
      netbios name = pdc
      server string = Samba PDC
      security = user
      local master = yes
      domain master = yes
      os level = 255
      preferred master = yes
      # Далее идут описание ресурсов и остальные настройки
  1. Создадим файл создания компьютеров в домене windows, я написал данных файл на языке python, но это абсолютно не имеет значения, так как он выполняет простые действия и может быть переписан на чем угодно:
  #!/usr/bin/python
  # -*- coding: utf-8 -*-

  HOST='127.0.0.1'
  DB='samba'
  USER='root'
  PASSWD='password'
  PDBEDIT = "/usr/bin/pdbedit"
  DOMAIN_SID = "S-1-5-21-3155255837-4138667322-3601602090"

  # Настройки Программы
  import MySQLdb,sys,os

  # Имя нового компа
  accName = sys.argv[1]

  # Подключаемся к базе
  db=MySQLdb.connect(passwd=PASSWD,db=DB,host=HOST,user=USER)
  cursor=db.cursor()
  cursor.execute("set autocommit=1")

  # Заносим данные о компе, если данные есть - просто пропустить
  cursor.execute ("select 1 from net_usr where lower(username)=lower('%s')"%accName)

  if len(cursor.fetchall())==0:
     sql = "insert into net_usr set domain=(select value from settings where name='samba_domain'),uid=(select next_uid from net_nparm),gid=(select gid from net_grp where name='Computers'),user_sid=concat((select value from settings where name='samba_domainSid'),'-',(select next_rid from net_nparm)),group_sid=(select sid from net_grp where name='Computers'),username='%s'"%(accName)
     cursor.execute(sql)
     os.system(PDBEDIT  + ' -a -m -u "%s"'%accName.lower())
  else:
     os.system(PDBEDIT + ' -x -m "%s"'%accName.lower())
     os.system(PDBEDIT + ' -a -m -u "%s"'%accName.lower())
     sql = "update net_usr set domain=(select value from settings where name='samba_domain'),uid=(select next_uid from net_nparm),gid=(select gid from net_grp where name='Computers'),user_sid=concat((select value from settings where name='samba_domainSid'),'-',(select next_rid from net_nparm)),group_sid=(select sid from net_grp where name='Computers') where username='%s'"%(accName)
     cursor.execute(sql)

Не говорю что данный скрипт избавлено от глюков, он есть: новый комп приходится прописывать 2 раза в домен. Опять же (я так думаю) можно переписать скрипт более удобным образом, чтобы он работал боллее надежно. И (плюс ко всему), у меня главный sid домена хранится в отдельной переменной и вычисление rid и sid происходит с помощью дополнительной таблицы.

В принципе вся настройка системы полностью закончена, теперь можно настраивать самбу.

P.S. Данная система у меня работает уже полтора года, никаких сильных нареканий я к ней не имею, нагрузка: где-то 200 пользователей и 150 компов.

Если есть вопросы - пишите: murphy[собака]sys[точка]net[точка]ru