[samba] Fwd: libwbclient от samba и sssd
Alexander Bokovoy
ab на samba.org
Ср Ноя 30 00:04:18 MSK 2016
On ti, 29 marras 2016, Evgeny Sinelnikov wrote:
> 29 ноября 2016 г., 17:03 пользователь Alexander Bokovoy <ab на samba.org> написал:
> > On ti, 29 marras 2016, Evgeny Sinelnikov wrote:
> >> 29 ноября 2016 г., 14:34 пользователь Michael Shigorin
> >> <mike на altlinux.org> написал:
> >> > On Tue, Nov 29, 2016 at 02:05:45PM +0300, Evgeny Sinelnikov wrote:
> >> >> Таким образом имеет смысл разобраться с зависимостями и решить
> >> >> - стоит ли вообще использовать альтернативы, если у нас имеются
> >> >> пакеты, которые зависят от функционала, реализованного только в
> >> >> заданной версии libwbclient?
> >> >
> >> > Для библиотек с различным ABI это заведомая диверсия.
> >>
> >> Вопрос о намерениях - это отдельный вопрос. Обычно всё объясняется
> >> недопониманием технических деталей. Тем более, так сделано в Fedora. А
> >> у нас, как у них.
> >>
> >> Тем не менее... у нас пакет gssntlmssp, вытягивает за собой
> >> libwbclient-sssd даже на сервере, где уже, вроде как, установлен
> >> /usr/lib64/samba-dc/libwbclient.so.0.13 (в пакете samba-DC-libs), но
> >> для него альтернативы не используются. Предполагается, что в samba и
> >> samba-DC эта библиотека собирается практически одинаково.
> >>
> >> При этом "... libwbclient-sssd не реализует аутентификацию по NTLMSSP".
> >> И тогда возникает вопрос: "Есть смысл в альтернативах при таком раскладе?"
> >>
> >> Если есть, то нужно уточнить для чего и поправить зависимости для
> >> пакета gssntlmssp, от которого зависят плагины pidgin-sipe и
> >> telepathy-sipe.
> >> $ apt-cache whatdepends gssntlmssp
> >> gssntlmssp-0.6.0-alt1.qa1
> >> gssntlmssp-devel-0.6.0-alt1.qa1
> >> Требует: gssntlmssp = 0.6.0-alt1.qa1
> >> i586-gssntlmssp.32bit-0.6.0-alt1.qa1
> >> Требует: gssntlmssp = 0.6.0-alt1.qa1
> >> telepathy-sipe-1.20.1-alt1
> >> Требует: gssntlmssp
> >> pidgin-sipe-1.20.1-alt1
> >> Требует: gssntlmssp
> >>
> >> Хотя, в принципе, получается, что для сервера можно тогда ничего не
> >> менять, потому что gssntlmssp нужен только на клиентах, где вполне
> >> может использоваться sssd и libwbclient-sssd. И при этом остаётся
> >> другой вопрос: "Совместим ли gssntlmssp с libwbclient-sssd?"
> > Нет, gssntlmssp не может работать через libwbclient-sssd.
> >
> > gssntlmssp нужен там, где не используется инфраструктура Kerberos,
> > потому что в противном случае выбора модуля gss-ntlmssp не произойдет.
> > Это означает, что либо клиент, либо сервер не включены в домен AD или
> > FreeIPA. В этом случае использовать libwbclient-sssd смысла никакого
> > нет.
> >
> > Основная проблема в том, что пакетные зависимости не дают возможность
> > корректно выразить все эти конфигурации.
>
> Да, спасибо, Александр. Я уже открыл два git репозитория:
> - у нас:
> http://git.altlinux.org/gears/s/sssd.git
> http://git.altlinux.org/gears/g/gssntlmssp.git
> - и в апстриме:
> https://git.fedorahosted.org/git/sssd.git
> https://git.fedorahosted.org/git/gss-ntlmssp.git
>
> Посмотрел код и всё понял. Возможно, это просто. Но мне это не кажется
> очевидным. Поэтому я переформулирую, а вы поправьте, если я ошибся.
>
> Вариант использования (aka "use case") для libwbclient-sssd следующий:
> - мы хотим уйти от старого хлама (вроде NTLM) и оставить чистый Kerberos;
> - мы установили на клиенте аутентификацию и авторизацию через sssd;
> - но, кроме PAM и NSS, у нас есть на клиенте Samba:
> + как клиент, если мы обращаемся за шарами, например;
> + как сервер, если сами что-то шарим;
> - и вот сборках, этой самой Samba, этот хлам (от которого мы хотели
> избавиться) имеется в клиентской стороне в недрах библиотеки
> libwbclient;
> - и мы, волевым решением, пытаемся от неё избавиться...
>
> И тут выясняется, что:
>
> $ ldd /usr/lib64/libsmbclient.so.0 | grep libwbclient
> libwbclient.so.0 => /usr/lib64/libwbclient.so.0 (0x00007f77c4963000)
> $ rpm -qf /usr/lib64/libsmbclient.so.0
> libsmbclient-4.5.1-alt1
> $ apt-cache whatdepends libsmbclient | grep -v libsmbclient
> samba-libs-4.5.1-alt1
> opennx-0.16.e-alt30
> wcmcommander-0.20.0-alt1
> vlc-plugin-smb-2.2.4-alt1
> sssd-ad-1.14.1-alt1.M80P.1
> smbnetfs-0.5.3a-alt2.1
> python3-module-smbc-1.0.15.3-alt1.1
> python-module-smbc-1.0.15.3-alt1.1
> mpv-0.16.0-alt2
> libmpv1-0.16.0-alt2
> mplayer-1.1.1-alt16
> mencoder-1.1.1-alt16
> xine2-plugin-samba-1.2.6-alt2
> xine-plugin-samba-1.1.21-alt7
> kodi-16.1-alt0.M80P.1
> kdebase-kio-3.5.13.2-alt7.3
> kde5-kio-extras-16.08.3-alt0.M80P.1
> kde4base-runtime-core-16.04.1-alt2
> gvfs-backend-smb-1.28.3-alt1
> libgnustep-SMBKit-20140126-alt2.cvs20140126
> gnome-vfs-module-smb-1:2.24.4-alt10
> gnome-control-center-3.20.2-alt0.M80P.1
> fuse-smb-0.8.7-alt4
> libcsync-0.50.6-alt1
>
> И всё это хозяйство куда обращается за списками пользователей и
> группами? Правильно, не явно, к winbind'у. А при использовании sssd у
> нас его может и не быть. Хотя можно себе представить, что запущены
> оба.
>
>
> И какое же решение мы принимаем?
> Правильно, мы делаем параллельную реализацию без всякого "хлама"
> (только NSS от sssd плюс трансляция SID'ов в UID'ы и никакого PAM от
> winbind):
> /* Authenticate a user with cached credentials */
> wbcErr wbcCredentialCache(struct wbcCredentialCacheParams *params,
> struct wbcCredentialCacheInfo **info,
> struct wbcAuthErrorInfo **error)
> {
> if (error != NULL) {
> *error = NULL;
> }
>
> WBC_SSSD_NOT_IMPLEMENTED;
> }
>
> И, по умолчанию, если libwbclient-sssd установлена, у нас работает именно она.
>
> Таким образом, мы получаем не диверсию, а планомерное выпиливание
> нежелательного функционала. Потенциально уязвимого и небезопасного
> наследия, которое тянется со времён NT4. То есть для совместимости с
> доменами до Windows 2000 и... внимание, с доменами на базе Samba3.
Женя, ты смотришь в правильное место, но делаешь совершенно неверные
выводы. Особенно на предмет "планомерного выпиливания".
Пойми простую вещь: winbindd сочетает в себе функционал трех больших
областей. В идеале они все должны быть разделены на три разных демона:
- преобразование identity (SID to name / IDs, name to IDs, IDs to name,
IDs to SID, name to SID) для групп и пользователей
- проксирование аутентификации контроллеру домена по запросу
пользовательского приложения
- обработка топологии доверительных отношений между доменами и лесами
По крайней мере две из трех этих задач требуют в определенных
конфигурациях работу в кластерном режиме.
К этому нужно добавить, что и другие компоненты Samba содержат тот же
код, который присутствует в winbindd, в частности, касательно
аутентификации. Это традиционно smbd и libsmbclient. У первого есть
режим fallback, когда winbindd не запущен или возвращает ошибку. Второй
и не рассчитан на работу с winbindd.
Проблема в том, что winbindd рос исторически и архитектурно представляет
собой отнюдь не стройную систему, которую можно разделить на отдельные
компоненты, взаимодействующие между собой посредством четко определенных
интерфейсов. Над таким разделением мы работаем и пытаемся договориться
(Samba Team, SUSE, Red Hat, Sernet, ...) уже больше пяти лет. Воз и ныне
там, потому что для всех участников такое разделение пусть и важно, но
не так приоритетно, как другие приоритетные задачи. Из последних --
Microsoft выпустила обновление принтерной подсистемы в конце лета с
целью закрыть часть известных ошибок безопасности и всё, не только
принт-сервера на Самбе перестали работать после обновления Windows, но и
некоторые крупные внедрения Windows у некоторых крупных заказчиков
Microsoft перестали работать.
Печатью в Samba занимаются ровно 10% от двух человек. Эти два человека
теперь вынуждены ближайшие несколько месяцев с нуля писать поддержку
новой версии системы печати. Это значит, что задачи, над которыми они
могли бы работать всё это время, простаивают -- многопоточность в SMB
3.1, Samba AD с MIT Kerberos, рефакторинг winbindd и так далее, там
много чего по списку.
Приложения, который используют libsmbclient, могут работать через
Kerberos, поэтому там особой проблемы в корпоративной среде пока нет.
libsmbclient и вовсе не требует wbclient для своих задач, так что
для ситуаций, когда эти же приложения на этой же машине должны
использовать NTLMSSP для доступа к удаленному ресурсу, проблемы нет.
Проблема возникает там, где локальное серверное приложение хочет
проверить аутентификацию пришедшего к нему по сети клиентского
приложения. В этом случае член домена должен делать проксирование
аутентификации контролеру домена с использованием защищенного канала
между членом домена и контроллером домена. Этот канал называется secure
channel и обладает неприятным свойством эксклюзивности -- между членом
домена и контроллером домена в один момент времени может быть установлен
только один secure channel.
Именно реализацией консолидированного доступа к secure channel
занимается winbindd. Как только удастся выделить эту подсистему в
отдельного демона, libwbclient-sssd сразу научится поддерживать
аутентификацию.
Речь не идет о "выпиливании" старых технологий. Их выпиливает Microsoft,
которая очень хочет избавиться от NTLMSSP и всего предыдущего, но не
может. Речь идет о том, есть области применения, где NTLMSSP не
появляется от слова совсем и по факту эксплуатации во многих
организациях эти области занимают 90% в области Idenity Management и
примерно 20% в области storage. Вот такая странная раскладка -- Red Hat
Storage не может перейти на использование SSSD в том числе и из-за этой
ситуации, а в случае Red Hat Identity Management за пять лет, что я
работают над FreeIPA, количество заказчиков, где NTLMSSP нужен кровь из
носа, не настолько велико, чтобы эта задача мешала унификации на основе
SSSD.
Тем не менее, работа запланирована и ведется. К сожалению, реальность
гораздо печальнее, чем планы.
> В принципе, всё что использует gssntlmssp не имеет смысла использовать
> совместно с sssd и тем более странно, что при его установке
> вытягивается именно libwbclient-sssd, а не обычный libwbclient. Вот
> это надо исправить, я думаю, явной зависимостью.
>
> Всё это понятно, если почитать код, но мне не кажется очевидным.
>
> ____________________________
>
> Далее... Какое же решение мы принимаем по поводу альтернативы для
> libwbclient и libwbclient-sssd?
>
> - Мейнтенить sssd и samba - получается, нужно совместно.
> - А на клиентской стороне стараться использовать только libwbclient-sssd и sssd.
>
> И... тогда получается, что у нас всё даже почти правильно.
> Но apt не должен никогда вытягивать libwbclient-sssd, по умолчанию,
> для любых клиентов, кроме sssd. И только, когда sssd установлен,
> должен вытягиваться libwbclient-sssd и заменять собой libwbclient.
>
> И ещё... в связи с этим возникают следующие вопросы:
> - Так ли на надёжен libwbclient-sssd? Где и когда нам может
> потребоваться winbind? Есть такие конфигурации?
Если машина выступает в роли файлового сервера в домене, то должна
использоваться связка smbd+winbindd. Плюс к этому можно запустить SSSD
на системном уровне, но без libwbclient-sssd, потому что winbindd
сделает всю работу. Для интеграции SSSD и Samba есть idmap модуль от
SSSD. Единственное, что он сейчас не представляет, это обработка builtin
identities, которые нужны Samba для проверки привилегий при удаленном
администрировании.
Тут есть еще и отдельная задача синхронизации Samba/winbindd с внешними
средствами ввода в домен. Скажем, просто так ввести Samba в домен
FreeIPA не получится. После же обычного ввода в домен средствами
ipa-client-install (ipa-join, etc) у нас будут ключи Kerberos в
/etc/krb5.keytab, но не будет plain-text пароля машинной учетной записи
в secrets.tdb для Samba. К сожалению, Samba генерирует каждый раз
необходимые ключи из plain-text пароля, а не использует единожды
сгенерированные и доступные из /etc/krb5.keytab.
Эта задача будет решаться в ближашие месяцы. По факту, необходимо
научить Samba хранить уже готовые ключи из /etc/krb5.keytab (ключ в
формате arcfour-hmac и есть NT hash) в secrets.tdb и синхронизировать их
между собой, выбирая тот, у которого kvno больше. Хранение в secrets.tdb
необходимо для того, чтобы кластерная Samba работала. В случае, если мы
всё это реализуем, для члена домена не будет никакой необходимости
использовать plain-text пароль машинной учетной записи.
> - Как быть с использованием libwbclient-sssd (и sssd, вообще) на
> серверном узле, где установлен контроллер домена из пакета samba-DC?
> Ведь тогда, вообще, все клиенты нужно линковать с
> /usr/lib64/libwbclient.so.0, кроме внутренних.
> - И где граница? smbclient - это же тогда внешний клиент, или как?
SSSD можно использовать на контроллере домена, без проблем. Только не
нужно устанавливать libwbclient-sssd.
>
> ____________________________
>
> В итоге, возникают более сложные вопросы:
> - Какие, конкретно, конфигурации "пакетные зависимости не дают
> возможность корректно выразить"? Мне непонятно.
Что непонятно?
У нас есть четыре основных конфигурации,
- NSS(SSSD), Samba сервер, -libwbclient-sssd, +libwbclient (и winbindd)
- NSS(SSSD), FreeIPA клиент, +libwbclient-sssd, -libwbclient
- NSS(SSSD), -libwbclient-sssd, -libwbclient
- NSS(SSSD), -libwbclient-sssd, +libwbclient (и winbindd)
Аналогичные комбинации можно построить и с nss_winbind/pam_winbind, но
они будут уступать по функционалу этим четырем -- SSSD умеет гораздо
больше в плане аутентификации и доставки сессии PAM, чем pam_winbindd. В
первой комбинации достаточно заменить "Samba сервер" на любое серверное
ПО, которому необходимо принимать NTLMSSP, например, веб-сервер с
mod_auth_gssapi и gss-ntlmssp, по факту это смысл не изменит.
Те конфигурации, где до сих пор невозможно использовать GSSAPI, нужно
учить использовать GSSAPI, чтобы привести их к первой или четвертой.
Например, FreeRADIUS не имеет модуля RLM для проверки аутентификации
через GSSAPI. Есть модуль для Kerberos 5, есть модуль для вызова
libwbclient wbcAuthenticateUser()-подобном API, есть модуль для работы
через ntlm-auth.
В Squid тоже стоило бы заменить вызов ntlm-auth на использование GSSAPI.
Это всё простые и очевидные моменты, которые известны разработчикам и от
реализации их нас ограничивает только отсутствие времени. Помощь
приветствуется.
> - Что мы хотим получить альтернативами, если библиотека, в заданный
> момент, всё равно выбрана одна и вполне конкретная? Какие возможности?
>
> Я вижу только одну понятную возможность. Чтобы выпилить весь старый
> хлам, нужно быстро уметь проверить - работает всё без него или нет. И
> только в этом я пока вижу смысл именно альтернатив.
Альтернативы -- это способ обойти ограничения механизма построения
зависимостей на уровне RPM, которые по своей природе негибкие и без
возможности распространения одной ветки выбора на всю цепочку затронутых
пакетов каким-то очевидным способом.
--
/ Alexander Bokovoy
Подробная информация о списке рассылки Samba