Совсем уже мозг сломал - не знаю, почему так получается:FreeBSD 5.3, Samba 3.0.14a из портов.
Пытаюсь настроить синхронизацию паролей Самбы и системы. Цель - при изменении пароля в Самбе он должен меняться на такой же и в системе. Вроде всё просто. Пытаюсь использовать unix password sync. Вот smb.conf:
[global]
workgroup = WORKGROUP
netbios name = NEWSRV
security = user
dos charset = CP866
unix charset = KOI8-R
display charset = KOI8-R
encrypt passwords = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*Password* %n\n *Retype*New*Password* %n\nМеняю пароль с помощью smbpasswd user. На Самбе всё прекрасно меняется. В системе нет - логин на консоль и т.п. проходит со старым паролем. Хотя в доках сказано, что если системный пароль не удаётся изменить, то и на Самбе он не сменится. Что не так?
Пытался ставить passwd chat debug = yes и log level = 100, но отладочной информации на эту тему нигде не получил, хотя она должна быть в smbd.log.
В общем так вот... Подскажите, что делать, плз.
>Вроде всё просто. Пытаюсь использовать unix password sync. Вот smb.conf:
>
>[global]
>workgroup = WORKGROUP
>netbios name = NEWSRV
>security = user
>dos charset = CP866
>unix charset = KOI8-R
>display charset = KOI8-R
>encrypt passwords = yes
>unix password sync = yes
>passwd program = /usr/bin/passwd %u
>passwd chat = *New*Password* %n\n *Retype*New*Password* %n\n
>
>Меняю пароль с помощью smbpasswd user. На Самбе всё прекрасно меняется.
насколько я понял в самбе ведеться своя БД юзерей? и она не синкаеться с системной?
>насколько я понял в самбе ведеться своя БД юзерей? и она не
>синкаеться с системной?Совершенно верно. Разные там алгоритмы шифрования паролей, поэтому и приходится держать две базы. А чтобы хоть как-то упростить жизнь админам, есть синхронизация, которая, по идее, включается параметром "unix password sync" и управляется с помощью параметров "passwd program" и "passwd chat". Идея проста как пареная репа, но у меня почему-то этот способ не работает. Вот и пытаюсь найти решение этой проблемы. Пока безуспешно.
>Совсем уже мозг сломал - не знаю, почему так получается:
>
>FreeBSD 5.3, Samba 3.0.14a из портов.
>
>Пытаюсь настроить синхронизацию паролей Самбы и системы. Цель - при изменении пароля
>в Самбе он должен меняться на такой же и в системе.
>Вроде всё просто. Пытаюсь использовать unix password sync. Вот smb.conf:
>
>[global]
>workgroup = WORKGROUP
>netbios name = NEWSRV
>security = user
>dos charset = CP866
>unix charset = KOI8-R
>display charset = KOI8-R
>encrypt passwords = yes
>unix password sync = yes
>passwd program = /usr/bin/passwd %u
>passwd chat = *New*Password* %n\n *Retype*New*Password* %n\n
>
>Меняю пароль с помощью smbpasswd user. На Самбе всё прекрасно меняется. В
>системе нет - логин на консоль и т.п. проходит со старым
>паролем. Хотя в доках сказано, что если системный пароль не удаётся
>изменить, то и на Самбе он не сменится. Что не так?
>
>
>Пытался ставить passwd chat debug = yes и log level = 100,
>но отладочной информации на эту тему нигде не получил, хотя она
>должна быть в smbd.log.
>
>В общем так вот... Подскажите, что делать, плз.
Извиняюсь за предыдущий пост - протормозил.Вот что выяснил: когда запускаешь smbpasswd от root'а обращения к smbd не происходит, вместо этого файл с самбовской базой паролей правится напрямую. Естественно никакая синхронизация паролей при этом не срабатывает.
Значит пошла попытка номер два. Запускаю smbpasswd от user'а:
% smbpasswd
Old SMB password:
New SMB password:
Retype new SMB password:
machine 127.0.0.1 rejected the password change: Error was : RAP86: The specified password is invalid.
Failed to change password for userЗаметьте, "Old SMB password" ввожу правильный. При этом в логах видно следующее:
# cat /var/log/samba/log.smbd | grep chat
[2005/07/14 17:00:17, 3] smbd/chgpasswd.c:chat_with_program(347)
chat_with_program: Cannot Allocate pty for password change: userИ как это понимать? Знающие люди, откликнитесь, пожалуйста.
...а как лечить, пока не знаю...Поковырявшись в исходниках Самбы, обнаружил, что за диалог с внешней программой отвечает функция chat_with_program, что в файле smbd/chgpasswd.c. Она в свою очередь вызывает функцию findpty из того же файла, которая пытается "allocate a pseudo-terminal device", то есть застолбить файл устройства /dev/ptyXX.
Делает она это довольно кособоким образом - перебирает все подобные устройства, и выбирает первое свободное. Ясное дело, что при использовании devfs (FreeBSD 5.3) такой способ не катит - в каталоге /dev устройств на все случаи в жизни нет, а создаются они как-то по требованию. Самба ничего не требует и, соответственно, ничего и не получает.
Итог - Самба и devfs несовместимы. Такой вот удар от классика...
Однако проблему синхронизации паролей нужно как-то решать. Сам я в программировании под unix не то чтобы полный ноль, но очень близко к этому. Поэтому обращаюсь к знатокам - посмотрите, кому не лень, указанные выше места в исходниках, что там можно подкрутить? Заранее благодарен.
Изрядно почесав репу и вспомнив полученные когда-то навыки программирования я взялся-таки за исправление этого глюка. Итак, излагаю ход решения задачи.1. Правка исходников и пересборка Самбы:
cd /usr/ports/net/samba3
make clean extract patch
cd work/samba-3.0.14a/source/smbd # может быть и другая версия
vi chgpasswd.c # или ваш любимый редактор- ищем функцию findpty,
- в ней дорисовываем локальную переменную "int i;",
- весь кусок кода, начинающийся со строки "fstrcpy(line, "/dev/ptyXX");" и заканчивающийся "closedir(dirp);" включительно, берём в комментарии или удаляем,
- вместо него пишем следующее:fstrcpy(line, "/dev/ptypX");
for (i = 0; i < 32; i++)
{
if (i > 9) line[9] = 'a' + i - 10; else line[9] = '0' + i;
DEBUG(3, ("findpty: try to open %s\n", line));
if ((master = sys_open(line, O_RDWR, 0)) >= 0)
{
DEBUG(3, ("findpty: opened %s\n", line));
line[5] = 't';
*slave = line;
return (master);
}
}- сохраняем, выходим.
cd ../../../..
make build deinstall reinstall clean2. Дальше встаёт ещё проблема, связанная с тем, что штатная FreeBSD'шная программа passwd не сообщает об успешном своём завершении, а Samba этого ждёт.
Решение этой проблемы описано здесь:
http://www.freebsd.org/cgi/query-pr.cgi?pr=76494
cd /usr/src/usr.bin/passwd
vi passwd.cправим, добавляя после метки "end:" строку
if (pam_err == PAM_SUCCESS) fprintf(stderr, "Password Changed\n");
make install clean
3. Правка smb.conf:
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = "*New*Password*" "%n\n" "*Retype*New*Password*" "%n\n" "*Password*Changed*"4. Запуск Самбы, проверка:
от рута:
# /usr/local/etc/rc.d/samba start
от пользователя:
% smbpasswd
Old SMB password:
New SMB password:
Retype new SMB password:
Password changed for user <имя>Если всё так, то отлично, если нет, пишите - поглядим вместе.