Bug 4388 - Samba+LDAP - проблемы с созданием машинных аккаунтов
: Samba+LDAP - проблемы с созданием машинных аккаунтов
Status: CLOSED NOTABUG
: Sisyphus
(All bugs in Sisyphus/samba)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2004-06-17 13:34 by
Modified: 2006-02-17 18:50 (History)


Attachments
pdbedit output (4.09 KB, application/octet-stream)
2004-06-17 16:17, Vladimir Lettiev
no flags Details


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2004-06-17 13:34:53
Имеется сервер c samba-3.0.3-alt1.1, в качестве бэкенда для хранения базы
пользователей используется ldap. Системные пользователи также хранятся в ldap
(настроен nss_ldap, pam_ldap). При создании машинных аккаунтов наблюдается
такая
ошибка:

[root@fs samba]# pdbedit -d 1 -a -m testcomputer
ldapsam_modify_entry: Failed to add user dn=
uid=testcomputer$,ou=Computers,dc=syktsu,dc=ru with: Object class violation
        object class 'sambaSamAccount' requires attribute 'sambaSID'
ldapsam_add_sam_account: failed to modify/add user with uid = testcomputer$ (dn
= uid=testcomputer$,ou=Computers,dc=syktsu,dc=ru)
Unable to add machine! (does it already exist?)

Если предварительно создать в LDAP нормальный posixAccount, то попытка добавить
аттрибуты sambaSamAccount с помошью pdbedit также не дают никаких результатов.

Если создать системного пользователя командой: 'useradd -g machines
testcomputer$', то последующая команда 'pdbedit -a -m testcomputer' вполне
нормально срабатывает.

Т.о. требуется обязательное наличие локального системного пользователя в
/etc/passwd для машинных аккаунтов, что не совсем то, что хотелось...

Я попытался разобраться в проблеме. Действительно на bugzilla.samba.org висят
пара багов по подобной проблеме:
https://bugzilla.samba.org/show_bug.cgi?id=623
https://bugzilla.samba.org/show_bug.cgi?id=1052
Но они до сих пор в состоянии NEW и неизвестно возьмуться ли разрабботчики
решать эту проблему...

Просмотрев код pdbedit.c я наткнулся на любопытный момент:
pdbedit.c:508
        if ((pwd = getpwnam_alloc(machineaccount))) {
                if (!NT_STATUS_IS_OK(pdb_init_sam_pw( &sam_pwent, pwd))) {
                        fprintf(stderr, "Could not init sam from pw\n");
                        passwd_free(&pwd);
                        return -1;
                }
                passwd_free(&pwd);
        } else {
                if (!NT_STATUS_IS_OK(pdb_init_sam (&sam_pwent))) {
                        fprintf(stderr, "Could not init sam from pw\n");
                        return -1;
                }
        }

Т.е. в зависимости от того, что вернула getpwnam_alloc() по разному
инициализируются машинные аккаунты. Причём сюдя по отладочным сообщениям как
раз
на этой вилке и происходит проблема: если пользователь есть в /etc/passwd, то
вариант `then`, если нет, то `else`.
Если покопать код дальше, то видно, что getpwnam_alloc() просто дёргает
системный вызов getpwnam(), который, судя по ману, просто роется в /etc/passwd
в
поиске учётной записи и не производит проверки в ldap.
Это всего лишь предположение, прошу сильно не пинать, если не прав.
------- Comment #1 From 2004-06-17 14:12:20 -------
getpwnam() ищет по базам, указанным в /etc/nsswitch.conf в том порядке, в
котором они там прописаны. Так что если записи в LDAP не находятся, то причиной
может быть отсутствие записи "ldap" в /etc/nsswitch.conf.

С другой стороны, другие записи, видимо, доступны по getent passwd, значит,
настроено в /etc/nsswitch.conf верно. Тогда может быть проблема в двух местах:

1. Схема в LDAP не соответствует реальности Samba 3.0.3-alt1.1. Это может быть,
если соответствующее хранилище создавалось до 3.0.2.
2. Ошибка в nss_ldap при работе с символом $.

Судя по приведенному сообщению от pdbedit, очень похоже на (1).
------- Comment #2 From 2004-06-17 16:17:35 -------
Created an attachment (id=433) [details]
pdbedit output

Я смотрел новую схему, у меня действительно была старая, но, к сожалению,
добавление машинных аккаунтов не работало ещё на сборке alt46, поэтому
установка новой схемы и рестарт ldap и samba ничего не изменило. Отличия в
схеме слишком незначительные (на мой взгляд).
Настройку samba+ldap я делал ещё в прошлом году и по итогам написал статью
http://unix.nordcomp.ru/articles.html?id=17 , изложенная там конфигурация
практически ничем отличается от того, что у меня сейчас (за исключением
обновлённой версии samba).

Приведу вывод pdbedit на уровне отладки 11, для двух случаев: добавление
аккаунта с пользователем в /etc/passwd и без него:

1.
# useradd -g machines -d /dev/null testcomp$
# pdbedit -d 11 -a -m testcomp
вывод в атачменте pdbedit.1.txt

2.
# pdbedit -x testcomp$
# userdel testcomp$
# pdbedit -d 11 -a -m testcomp
вывод в атачменте pdbedit.2.txt

Хочу обратить внимание на то, что после записи

pdb backend guest has a valid init

идёт расхождение в действиях pdbedit, если пользователь есть в /etc/passwd, то
идёт создание sid'а (18-ый элемент) для него, а если нет, то -- нет... И это
как раз различие в функциях pdb_init_sam_pw() и pdb_init_sam()

element 18 -> now SET
pdb_set_user_sid_from_rid:
	setting user sid S-1-5-21-2614677957-1106234284-1388258010-3372 from
rid 3372


А как можно проверить второй вариант (Ошибка в nss_ldap при работе с символом
$.)?
------- Comment #3 From 2004-07-06 19:21:57 -------
Знак $ является специальным символом в shell, соответственно, для того чтобы
его
передать приложению, его надо экранировать с использованием символа \. Таким
образом, это не ошибка Самбы, а ошибка входных параметров в useradd (нужно было
написать либо testcomp\$, либо 'testcomp$'