From: Чижиков Владимир <skif at owe.com.ua>
Newsgroups: email
Date: Mon, 18 Oct 2004 14:31:37 +0000 (UTC)
Subject: Авторизация для FreeBSD на основе доменных аккаунтов Win2K
Авторизация на FreeBSD на основе доменных аккаунтов Win2K
или что такое winbindd + pam
В свое время у меня остро стал вопрос перехода моих пользователей с ОС
Windows на любую другую операционную систему, лишь бы она была
бесплатной. Ну все думаю понимают что такое лицензионные игры и с чем их
едят. Но это отступление. Лирическое. И так стал вопрос. Пользователей
вроде бы и не очень много - немногим более полусотни, но ведь учетки
надо как-то вести, давать людям пароли и прочее. Так как я являюсь
приверженцем ОС FreeBSD, то выбор стал естественно очевиден.
Оставалось одно - как все сие центр ализовать. Если бы не наличие
специализированного софта, как-то 1С, Клиент-Банк под Windows и ряда
других прог, то все бы закончилось тихим переездом на FreeBSD с
установкой сопутствующего софта и установкой YP/NIS-домена. Но виндовые
сервера убрать ну никак не получалось, посему было принято соломоново
решение, оставить два терминальных сервера(основной и резервный) под
Win2k Server, а пользователей пересадить на фрю и все остальное для
своей работы они должны брат с терми нала - в финансовом плане экономия
по подсчетам выходила в районе 20-30 тысяч вечно зеленых. В общем все
были за.
Смущал одно. И только меня. КАК ВСЕМ ЭТИМ РУЛИТЬ. Кто сопровождал
несколько доменов одновременно - тот поймет. Да и не заставишь милых
бухгалтерш запоминать сразу два пароля. Да они на 1С запомнить никак не
могут, а тут только для входа в систему.
Потыкавшись по форумам, полистав документацию, пришлось сразу отмести
вариант с LDAP, хотя он сильно подкупал, но в случае моего (вашего)
ухода и прихода очередного студента на место админа все сие упадет самое
позднее через месяц, а мы должны построить что-то надежное и рабочее без
особого присмотра сильными мира сего. И так выбор сделан - Samba, со
всеми ее плюсами и минусами. А так же с поддержкой winbind. Ну все,
предисловие мы закончили, теперь начнем описывать сеть.
И так наши исходные данные:
- имеется 2 терминальных сервера,
- имеется ~50 хостов, которым суждено стать честными рабочими
станциями на FreeBSD,
- сеть с адресным пространством 192.168.10.0/24, 192.168.20.0/24, 192.168.100.0/24,
- терминальные сервера имеют адреса 192.168.10.252 и 192.168.10.254,
на последнем установлен сервер WINS,
- рабочая станция, которую мы будем перелопачивать имеет адрес
192.168.10.1 и именуется она, ну пусть, server,
- имя домена OWE (здесь подставите свое, а мне проще это - привык)
И так исходные данные есть. Так что приступаем. Для этого нам
понадобиться samba третьей версии (можно и второй, но так уж сложилось,
что больше всего я использую именно третью, в ней просто есть много
вкусностей, в данном конкретном случае это была samba-3.0.7,1) и FreeBSD
5.2.1 - вы можете, в принципе, использовать и более ранние/поздние
версии, но все сие я творил именно на этой версии ОС, а когда печатал
статью, то на машине именно с этой версией, а точнее:
root@server #uname -a
FreeBSD server.owe 5.2.1-RELEASE-p10 FreeBSD 5.2.1-RELEASE-p10 #3: Thu Oct 14 09:54:40 EEST 2004
root@server.owe:/usr/src/sys/i386/compile/SKIF i386
root@server #
Теперь следующий наш шаг - установка самбы. Я двумя руками за порты.
ИМХО - тут много полезного, а пакаджи хоть и ставятся быстро, но очень
ограничены и слишком привязаны к тому софту, что стоит у человека
ДЕЛАВШЕГО пакадж. В общем, идем в порты, у меня это():
root@server # cd /usr/ports/net/samba3/
root@server # make
После этого у нас появиться подобный экран:
Options for samba 3.0.7,1
[X] LDAP With LDAP support
[X] ADS With Active Directory support
[X] CUPS With CUPS printing support
[X] WINBIND With WinBIND support
[ ] ACL_SUPPORT With ACL support
[X] SYSLOG With Syslog support
[ ] QUOTAS With Quota support
[X] UTMP With UTMP support
[X] MSDFS With MSDFS support
[ ] SAM_XML With XML smbpasswd backend
[ ] SAM_MYSQL With MYSQL smbpasswd backend
[ ] SAM_PGSQL With PostgreSQL smbpasswd backend
[ ] SAM_OLD_LDAP With Samba2.x LDAP smbpasswd backend
[X] PAM_SMBPASS With SMB PAM module
[X] POPT With installed POPT library
[ OK ] Cancel
В принципе можно все это сделать руками в Makefile, но зачем себе
усложнять жизнь? Да, если вы что-то неправильно отконфигурировали и
хотите вернуться к этому окошку - make config вернет его вам. И так, в
этом окне отмечены Х поля по умолчанию, и те, которые я отмечал. Вы
можете поэкспериментировать на досуге, ну а пока мы продолжим.
И так после make выполняем, если она отработала без проблем, make
install, если нет, то ищем причину и устраняем.
root@server # make install && make clean && rehash
В моем примере видно, что я сделал сразу make install && make clean &&
rehash - то есть в случае удачного выполнения make install - установки
скомпилированных make исходников - будут "зачищены" следы компиляции и
обновлены установки шела. Для самбы это не актуально, но здесь, увы, моя
привычка. Полезная.
Ну вот. Теперь мы все установили. Осталось только настроить все это
добро. А делать мы будем все это руками. Для простоты ничего заумного
делать такого не будем, для объективности и понятливости использовать
SWAT тоже не будем. Все строчки, не тронутые нами остаются по умолчанию,
как есть. Нам нужна пока минимально рабочая система. Все изыски и
извращения потом. И так приступаем.
Заходим /usr/local/etc/, где у нас лежит конфиг по умолчанию samba, и
делаем его копию, с нужным нам расширением:
root@server # cd /usr/local/etc/
root@server # cp smb.conf.default smb.conf
Вот теперь у нас есть конфигурационный файл. Начинаем его редактировать.
[global]
workgroup = OWE
server string = Samba Server
security = DOMAIN
hosts allow = 192.168.10. 192.168.20. 192.168.100. 127.
netbios name = SERVER
load printers = yes
password server = *
И так первая строчка - workgroup = OWE - это имя нашего домена,
вторая server string = Samba Server, строка приветствия сервера, точнее,
что он будет писать при просмотре в сетевом окружении
Тип безопасности security = DOMAIN это третья строка, здесь, в принципе
можно использовать и ADS, но я использовал именно DOMAIN, ADS больше
подойдет для сетей с Win2k3 серверами.
hosts allow = 192.168.10. 192.168.20. 192.168.100. 127. - строка
описывает, каким хостам позволено обращаться к серверу. В исходных
данных мы указали, что адресное пространство сети у нас
192.168.10.0/24 - оно соответствует 192.168.10., все остальное можно убрать,
кроме 127. - это обозначение сети 127.0.0.0/8 Тобишь, сети loopback интерфейса,
того самого, которому принадлежит адрес 127.0.0.1, впрочем, как и все
другие из этой сети.
load printers = yes - подключать или нет принтера, я думаю, стоит, хотя
бы потому , что они есть.
Один из самых интересных в этом списке параметров, параметр password
server = * - именно им мы указываем, какой сервер будет проверять
пароли. У меня их два и в случае выхода одного из строя, второй должен
продолжать авторизировать пользователей, именно по этому стоит *, а не
имя сервера.
Все, теперь мы подошли к заключительному этапу конфигурирования самбы.
encrypt passwords = yes - строка, определяющая, в каком виде будут
гулять по сети пароли
winbind uid = 10000-20000 - выделяем winbind диапазон UID для
пользователей Windows
winbind gid = 10000-20000 - выделяем winbind диапазон GID для все тех же
пользователей
template homedir = /smb/samba/%U - указываем временную домашнюю
папку(если реального пути не будет существовать, то по умолчанию,
человека привяжет к корню и будет много ругани)
template shell = /bin/tcsh - временный шел. На это стоит обратить особое
внимание, многие доки и многие форумы, где я поднимал этот вопрос, мне
говорили, что нужно ставить нечто /bin/nologin, нет, ни в коем случае,
если пользователь должен РАБОТАТЬ на этой машине локально. Я предпочитаю
tcsh, посему указан именно он.
winbind separator = + - ну, а это просто разделитель, которым имя домена
будет отделено от пользователя. Стоит обратить внимание, что домен стоит
ПЕРЕД именем, а не после, как это делается в Windows
winbind enum users = yes, winbind enum groups = yes - эти две строки
просто ведут учет пользователей и групп
-winbind use default domain = yes , а эта строка указывает, что
необходимо использовать по умолчанию приставку домена, к любому
пользователю. Здесь необходимо пояснить. Когда вы захотите
авторизоваться на машине с установленным таким параметром, все что от
вас потребуется, это написать имя пользователя и ввести пароль, а вот
если он не установлен, то сначала потребуется написать имя домена,
разделитель и имя пользователя (например, OWE+skif) и лишь потом пароль.
Вот такие беды от этого параметра.
nt acl support = yes - ну и поддержка acl от Windows
Все. Основные параметры мы настроили. Ну, для развлечения сделаем
простенькую шару.
[C]
comment = Skif test share
path = /smb/C
public = yes
writable = yes
printable = no
create mask = 0775
force create mode = 0664
force directory mode = 0755
В принципе, ничего сложного в ней нет. Мы создали шару, доступную всем
пользователям, как для записи, так и для чтения под именем С.
Вот теперь мы действительно закончили настройку samba.
Но для авторизации этого мало. Для того, что бы авторизироваться в
системе, нужно еще эту самую систему научить опознавать пароли Windows,
этого детища Microsoft. В этом нам поможет winbind, если помните, именно
его мы вкомпиливали на этапе сборки порта. Вот он нам и пригодился.
И так, первым делом нам необходимо создать файл /etc/nsswitch.conf . По
умолчанию его нет в системе, вот мы его создадим и впишем туда следующие
строки:
root@server # touch /etc/nsswitch.conf
root@server # ee /etc/nsswitch.conf
passwd: files winbind
group: files winbind
Этот файл объяснит системе, откуда брать пароли и группы пользователей,
а именно от winbind
Так, и этот этап мы прошли. Следующим шагом будет регистрация рабочей
станции в домене. Делается это при помощи утилиты net
root@server #net ads join OWE -U skif
или
root@server #net join OWE -U skif
Где OWE - имя моего домена, а skif - моя учетная запись с правами
администратора в домене Windows.
У меня при ее выполнении она ругнулась на ADS, но это была вина не
samba, а контроллера домена, но, не смотря на это, включила в домен.
Ради интереса можно зайти на Windows машине и полюбоваться делами рук
своих.
Но это только очередной шаг. И так идем дальше, нам нужно проверить, что
все работает как часы, и в этом нам поможет утилита wbinfo
root@server #wbinfo
Usage: wbinfo [OPTION...]
-u, --domain-users Lists all domain users
-g, --domain-groups Lists all domain groups
-N, --WINS-by-name=NETBIOS-NAME Converts NetBIOS name to IP
-I, --WINS-by-ip=IP Converts IP address to NetBIOS name
-n, --name-to-sid=NAME Converts name to sid
-s, --sid-to-name=SID Converts sid to name
-U, --uid-to-sid=UID Converts uid to sid
-G, --gid-to-sid=GID Converts gid to sid
-S, --sid-to-uid=SID Converts sid to uid
-Y, --sid-to-gid=SID Converts sid to gid
-A, --allocate-rid Get a new RID out of idmap
-c, --create-user=name Create a local user account
-x, --delete-user=name Delete a local user account
-C, --create-group=name Create a local group
-X, --delete-group=name Delete a local group
-o, --add-to-group=user:group Add user to group
-O, --del-from-group=user:group Remove user from group
-t, --check-secret Check shared secret
-m, --trusted-domains List trusted domains
--sequence Show sequence numbers of all domains
-D, --domain-info=STRING Show most of the info we have about the domain
-r, --user-groups=USER Get user groups
--user-sids=SID Get user group sids for user SID
-a, --authenticate=user%password authenticate user
--set-auth-user=user%password Store user and password used by winbindd (root only)
--get-auth-user Retrieve user and password used by winbindd (root only)
-p, --ping Ping winbindd to see if it is alive
--domain=domain Define to the domain to restrict operation
Help options:
-?, --help Show this help message
--usage Display brief usage message
Common samba options:
-V, --version Print version
root@server #
Я привожу здесь список опций не из садомазахизма, а хотя бы потому, что
не многие туда заглядывают, это раз, ну а вторая причина - ряд из них
нам потребуется, поэтому имейте представление о том, какой их формат
Нам нужно установить параметры просмотра информации и просмотреть её же
- верно ли отрабатываются пароли, ну и список групп, например:
Надеюсь понятно почему написано OWE+skif? - я явно задал, с правами
какого именно пользователя будут проводиться следующие операции, ну а
символ % отделил имя от пароля.
Ну вот, все работает просто чудесно, ну для успокоения своей совести,
выполним команду id, сначала над root, что бы посмотреть, что она
выводит, а потом, над любым пользователем домена:
Все, теперь у нас система все прекрассно понимает. Но все же не
авторизирует пользователей. Отбрасывает, а нам этого не нужно. Что ж,
найдем следующий камень преткновения, а именно - модули PAM, точнее не
камень преткновения, а мощнейшее оружие в наших руках ибо при их помощи
можна реализовать практически любую схему авторизации. Что ж, приступим.
Для начала необходимо сделать бекап всей папки /etc/pam.d с модулями
авторизации, и только потом их курочить.
Первый, который мы будем курочить - login - ведь для начала, нам нужно
хотя бы локально за логиниться. Вот и приступим. Только ОСТОРОЖНО, у вас
должна быть открыта как МИНИМУМ одна консоль с правами root, что бы
замести следы неудачных попыток. И так пишем в /etc/pam.d/login
следующее, все предыдущее закомментируем:
Сохраняем. И открываем другую консоль. Логин, пароль. Все идет
нормально. Значит тут все хорошо. Но вот если вы запустите pwd, то
обнаружите себя не в /smb/samba/_ИМЯ_ПОЛЬЗОВАТЕЛЯ_ , а в корне. Что ж,
нам нехватает двух вещей:
root@server #lf / | grep .
.cshrc
.profile
Точнее двух файлов и каталога пользователя. Что ж, создаем каталог,
кидаем туда эти два файла, и О ЧУДО мы вошли в систему, и в своей папке.
И так все работает. Идем дальше.
Нам нужно, что бы ВСЕ так работало - меняем содержимое всех фалов в
папке /etc/pam.d на подобное. Стартуем kdm, и первое, что мы видим - это
список ВСЕХ пользователей домена и локальной машины. Что ж, выбираем
доменного пользователя, входим, настраиваем профиль, работаем. Все.
Теперь еще немного поясняний. Измения в модулях pam не потребуют
перезагрузки машины. Так что бутать ее лишний раз не нужно. Файлы
считываются на лету. В случае, если авторизироваться не удалось, верните
все в исходное состояние на другой консоли.
В принципе предложеный вариант файла позволяет логиниться не только
пользователям домена, но и тому же root, то есть - к примеру, если
пользователь не существует в домене, он будет искаться в локальной базе
пользователей и если все нормально авторизироваться.
Мы сделали все, что нам нужно.
И следуя доброй традиции, идем к начальству и выбиваем себе как минимум
премию, а как максимум, намекая об экономии 20-30 тысяч американских
тугриков, повышение зарплаты.
И теперь уже точно все.
P.S.: Обязательно создайте папку пользователя, ибо в противном случае,
его будет кидать в корень, а там может создавать файлы только root, хотя
иксы и стартуют, но с морем ошибок.
Но я думаю, несложно будет написать простенький скрипт, что бы при
входе, эта папка создавалась.
У меня самого - руки за полгода так и не дошли написать - лень, да и мне
проще создать одну папку и два файла. Пользователи у меня жестко
привязаны к машине. Впрочем, как нибудь из эксперимента допишу.
Замечания: Все эти манипуляции Вы выполняете на свой страх и риск. И
ответственность за не стабильную работу, потерю данных или краха системы
не сете вы и только вы. У меня на всех машинах описанная схема работает
без замечаний.
Чижиков Владимир (Skif)
Написано по мотивам
Моего поста на sysadmins.ru
http://portal.sysadmins.ru/board/viewtopic.php?t=43865&highlight=%C0%E2%F2%EE%F0%E8%E7%E0%F6%E8%FF+FreeBSD+WinNT
Документации:
http://www.opennet.ru/base/net/pam_linux.txt.html
http://www.opennet.ru/base/dev/pam_linux.txt.html
http://www.opennet.ru/base/net/pdc_auth.txt.html
man 5 smb.conf
/usr/share/doc/samba-3.0.0/full_docs/htmldocs/winbind.html
348 Прочтений • [Авторизация для FreeBSD на основе доменных аккаунтов Win2K (auth freebsd win domain samba pam)] [08.05.2012] [Комментариев: 0]