Ключевые слова:auth, freebsd, win, domain, samba, pam, (найти похожие документы)
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 gid = 10000-20000
template homedir = /smb/samba/%U
template shell = /bin/tcsh
winbind separator = +
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
nt acl support = yes
Все, теперь мы подошли к заключительному этапу конфигурирования самбы.
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 #
Я привожу здесь список опций не из садомазахизма, а хотя бы потому, что
не многие туда заглядывают, это раз, ну а вторая причина - ряд из них
нам потребуется, поэтому имейте представление о том, какой их формат
Нам нужно установить параметры просмотра информации и просмотреть её же
- верно ли отрабатываются пароли, ну и список групп, например:
root@server #wbinfo --set-auth-user=OWE+skif%password
Надеюсь понятно почему написано OWE+skif? - я явно задал, с правами
какого именно пользователя будут проводиться следующие операции, ну а
символ % отделил имя от пароля.
root@server #wbinfo -t
checking the trust secret via RPC calls succeeded
root@server #wbinfo -g
BUILTIN+System Operators
BUILTIN+Replicators
BUILTIN+Guests
BUILTIN+Power Users
BUILTIN+Print Operators
BUILTIN+Administrators
BUILTIN+Account Operators
BUILTIN+Backup Operators
BUILTIN+Users
Администраторы домена
Пользователи домена
Гости домена
Компьютеры домена
Контроллеры домена
Издатели сертификатов
Администраторы схемы
Администраторы предприятия
Владельцы-создатели групповой политики
DnsUpdateProxy
OWE
BUHGALTERIA
TerminalGroupUsers
LOG
.......
Ну вот, все работает просто чудесно, ну для успокоения своей совести,
выполним команду id, сначала над root, что бы посмотреть, что она
выводит, а потом, над любым пользователем домена:
root@server #id root
uid=0(root) gid=0(wheel) groups=0(wheel), 5(operator)
root@server #id swarog
uid=10001(swarog) gid=10010(Пользователи домена) groups=10010(Пользователи домена), 0(wheel),
10009(Администраторы домена), 10015(Администраторы схемы), 10016(Администраторы предприятия),
10017(Владельцы-создатели групповой политики), 10019(OWE)
root@server #
Все, теперь у нас система все прекрассно понимает. Но все же не
авторизирует пользователей. Отбрасывает, а нам этого не нужно. Что ж,
найдем следующий камень преткновения, а именно - модули PAM, точнее не
камень преткновения, а мощнейшее оружие в наших руках ибо при их помощи
можна реализовать практически любую схему авторизации. Что ж, приступим.
Для начала необходимо сделать бекап всей папки /etc/pam.d с модулями
авторизации, и только потом их курочить.
Первый, который мы будем курочить - login - ведь для начала, нам нужно
хотя бы локально за логиниться. Вот и приступим. Только ОСТОРОЖНО, у вас
должна быть открыта как МИНИМУМ одна консоль с правами root, что бы
замести следы неудачных попыток. И так пишем в /etc/pam.d/login
следующее, все предыдущее закомментируем:
root@server # ee /etc/pam.d/login
# auth
auth required pam_nologin.so no_warm
auth sufficient pam_winbind.so
auth sufficient pam_opie.so no_warm no_fake_prompts
auth requisite pam_opieaccess.so no_warm allow_local
auth required pam_unix.so no_warm try_first_pass
# account
account sufficient pam_winbind.so
account required pam_unix.so
# session
session required pam_permit.so
Сохраняем. И открываем другую консоль. Логин, пароль. Все идет
нормально. Значит тут все хорошо. Но вот если вы запустите 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.dev/base/net/pam_linux.txt.htmlhttp://www.opennet.dev/base/dev/pam_linux.txt.htmlhttp://www.opennet.dev/base/net/pdc_auth.txt.html
man 5 smb.conf
/usr/share/doc/samba-3.0.0/full_docs/htmldocs/winbind.html
Насколько я понял - все равно основные задачи крутятся на windows-серверах. Не проще ли было использовать загрузку фри по сетке через PXE а затем запускать rdesktop? Вся авторизация - на самих серваках, заодно получаем экономию на железе?
Правда, сразу скажу - этот вариант скорее применим для чисто офисных решений, когда используются 1С, ворд/эскель да может быть почтовая программа. Никакой графики и т.д.
> winbind separator = + - ну, а это просто разделитель, которым имя домена
будет отделено от пользователя. Стоит обратить внимание, что домен стоит
ПЕРЕД именем, а не после, как это делается в Windows
странный пассаж. где это в винде домен стоит после имени пользователя??
u menya est vopros --- ya ponimayu chto u tebya vse proshlo gladko.u menya zhe problema takaya : na utilitu "net" bsd rugaetsya i govorit chto ne znaet takoy utiliti. esli ti vdrug znaesh prichinu ili vozmozhnie prichini plz podelis. esli eshe kto nibud eto prochitaet i otvetit budu och rad i schastliv. help me !
А пользуется именно 5-ка и samba 3-ка? Это принципиально, во второй самбе включение в домен происходит немного по другому. Для начала скомпиль с опциями из статьи