|
|
Главная »
Документы »
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 самбу. Я видел данный
модуль в некоторых дистрибах, но о актуальности его версии сказать
ничего не могу, поэтому придется покомпилить. - Соберем бекэнд pdbsql
Качаем самбу (http://us1.samba.org/samba/ftp/stable/) в исходниках и заголовки от mysql ибо они нужны для компиляции pdbsql. Естественно надо брать версию 3.0.28. Со страницы http://pdbsql.sourceforge.net/ качаем исходники pdbsql. Создаем где-нибудь каталог, в котором все будем компилить (например /root/ccc) Разворачиваем самба в приготовленный каталог /root/ccc/samba-3.0.28 Разворачиваем исходники pdbsql в нашу папочку /root/ccc/pdbsql-0.3.1-samba Заходим в папку с исходниками самба и делаем там командочки: cd /root/ccc/samba-3.0.28/source
./configure
make proto Данные комманды приготавливают самбу для компиления исходников pdbsql. Собираем 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 Так как самба у нас уже скомпилена мы просто копируем данные модули в каталог в pdb расширениями самбы: cp mysql.so /usr/lib/samba/pdb/mysql.so
cp multi.so /usr/lib/samba/pdb/multi.so
Теперь у нас вся самба скомпилена и будем считать, что мы готовы переходить к настройке системы.
- Настройка системы:
- Создадим таблицу в 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`)
); Данная таблица будет отвечать и за пользователей в системе и за пользователей в самба.
- Настроим nss_mysql отредактировав следующие файлы:
- /etc/libnss-mysql-root.cfg:
[server]
username root
password password
[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
Теперь при наличии хоть какой-то записи в таблице должен менятся вывод команда getent passwd.
- Настроим саму самбу заполнив следующие файлы:
/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
# Далее идут описание ресурсов и остальные настройки
- Создадим файл создания компьютеров в домене 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
|