Решено: Проблемы с авторизацией в AD через LDAP (Решено.)

openSUSE, SUSE Linux Enterprise

Модератор: Модераторы разделов

CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

ping domain
не проходит, но проходят:
ping server.domain
ping server

Команда "net ads info" выдаёт следующее:
LDAP server: ххх.ххх.х.ххх
LDAP server name: server.domain
Realm: DOMAIN
Bind Path: dc=DOMAIN
LDAP port: 389
Server time: Sat, 03 Oct 2009 13:24:57 MSD
KDC server: ххх.ххх.х.ххх
Server time offset: -10

Далее:
~ # service winbind start
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon dead
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

1. Отключил SuseFirevall
2. Прописал в /etc/hosts строку:
"192.168.1.1 server.domain domain domain" - естественно, для моего домена
3. ZeroConf всегда выключаю изначально...
4. В /etc/nsswitch.conf строку "hosts: files mdns4_minimal [NOTFOUND=return] dns wins" сократил до "hosts: files dns"

Результат - см. предыдущее сообщение...

Отредактировал smb.conf согласно Вашим рекомендациям.

Результат - см. предыдущее сообщение...
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

Некоторая дополнительная информация.

/etc/pam.d/common-auth :
auth required pam_env.so
auth sufficient pam_unix2.so
auth sufficient pam_krb5.so use_first_pass
auth required pam_deny.so

messages:
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service profiles - making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service users - making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service groups - making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6479)
winbindd[17594]: WARNING: [printers] service MUST be printable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service printers - making it unavailable!
winbindd[17594]: [2009/10/03 14:55:38, 0] param/loadparm.c:service_ok(6492)
winbindd[17594]: WARNING: No path in service print$ - making it unavailable!
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd_cache.c:initialize_winbindd_cache(2379)
winbindd[17625]: initialize_winbindd_cache: clearing cache and re-creating with version number 1
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd_util.c:init_domain_list(740)
winbindd[17625]: Could not fetch our SID - did we join?
winbindd[17625]: [2009/10/03 14:55:38, 0] winbindd/winbindd.c:main(1285)
winbindd[17625]: unable to initialize domain list
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

P.S. Если новых мыслей не будет: а без знания пароля админ-а сервера кроме winbind ничего нельзя ещё использовать?
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
03.10.2009 12:36
Спасибо, сейчас попробую сделать проверку.
Только я не совсем понял, почему LDAP, если настроен Kerberos (по крайней мере, по нему получается билет пользователя, а вот с LDAP там что-то у меня "не доруливается")?

И у меня несколько вопросов по smb.conf:

1) idmap gid = 10000-20000
idmap uid = 10000-20000
А почему нельзя начинать, например, с 1000 (если кроме root'a локальных не будет)?

2) auth methods = winbind
Почему эта строка не нужна?
Вернее, как определяется, что при регистрации пользователей в графическом окне DM должна проходить проверка имени и пароля на вин.сервере?

3) Если нужно, чтобы после первой авторизации создавалась домашняя папка /home/имя_пользователя (профиль пользователя), которая бы в дальнейшем уже использовалась пользователем по умолчанию, а в папки Documents и Y:, находящихся в домашней директории, каждый раз монтировались папки сервера, соответственно, users\имя_пользователя (которая на вин.машинах монтируется как диск Z:) и \y (в которых нет или, по крайней мере, не видно из-под пользователя никаких .msprofile и .9xprofile), то что нужно добавить в smbfstab и прописать вместо:
template homedir = /home/%D/%U
logon path = \\%L\profiles\.msprofile
logon home = \\%L\%U\.9xprofile
logon drive = P:
и для этого нужен сервис smbfs и не нужен - smb?

Уточните, пожалуйста.


По порядку:
Керберос в данном случае не участвует в авторизации пользователя, а играет вспомогательную роль - в основном повышает комфорт работы с шарами (иначе при каждой, в т.ч. повторной, попытке доступа на сервер будете вводить логин/пароль снова) А вот для работы авторизации нужен winbind с доступом к LDAP AD

1. Почему idmap gid = 10000-20000 ? - чтоб не пересекаться с локальными пользователями. Можно-ли и другой диапазон - да, а зачем?
2. auth methods = winbind - метод авторизации при доступе к шарам на вашей машине, нужен для smbd. Но наша задача не контент по сети раздавать... вообще вот полезный сайт
3. Данные настройки определяют местонахождение домашней папки пользователя, а также профиля и проч служебных шар (для клиентов!) в случае если ваш комп с самбой является контроллером домена....
В вашем случае полезно только "template homedir = /home/%D/%U" , только наличие его необходимо, но недостаточно.
Для создания домашней папки при первом входе юзера нужен pam_mkhomedir.so прописанный в PAM
И диск сетевой у вас сам не подключится, здесь нужен настроенный pam_mount.so

А вообще читайте полезный сайт
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
03.10.2009 13:33
ping domain
не проходит, но проходят:
ping server.domain
ping server

Команда "net ads info" выдаёт следующее:
LDAP server: ххх.ххх.х.ххх
LDAP server name: server.domain
Realm: DOMAIN
Bind Path: dc=DOMAIN
LDAP port: 389
Server time: Sat, 03 Oct 2009 13:24:57 MSD
KDC server: ххх.ххх.х.ххх
Server time offset: -10

Далее:
~ # service winbind start
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon dead


Сервер AD доступен, winbind запускается... но мрет....
Судя по всему

Код: Выделить всё

Could not fetch our SID - did we join?
- из-за отсутствия записи о компе в домене (net ads join .... мы-ж не делали...)
Попробуйте обмануть - назначить имя компу с линукс такое-же какое было у винды (запись о компе в домене с этим именем уже есть!) и прописать его в настройках сети или попробовать включить "Изменение имени узла через DHCP" ... может прокатит. В противном случае - без знания пароля админа (или доступа к его телу) - ничего не выйдет... к сожалению...

Да, и

Код: Выделить всё

auth sufficient pam_krb5.so use_first_pass
в pam быть не должно. Авторизация керберос должна быть правильно настроена, но ВЫКЛЮЧЕНА!!! (эти настройки нужны керберос-клиенту - но не для авторизации!), а вот

Код: Выделить всё

..... pam_winbind.so    use_first_pass
должно, но при условии - что winbind работает....
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
04.10.2009 22:47
Попробуйте обмануть - назначить имя компу с линукс такое-же какое было у винды (запись о компе в домене с этим именем уже есть!) и прописать его в настройках сети или попробовать включить "Изменение имени узла через DHCP" ... может прокатит. В противном случае - без знания пароля админа (или доступа к его телу) - ничего не выйдет... к сожалению...


Имя я, естественно, дал такое же. "Изменение имени узла через DHCP" включено было, но в messages выдавался соответствующий warning об отсутствии раздачи...
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

Если с winbind не получается, то можно найти какое-либо другое ПО под Линукс (желательно открытое), обеспечивающее после установки (без пароля администратора сервера) при вводе в регистрационном окне графического DM имени и пароля пользователя в случае отсутствия такого зарегистрированного локального пользователя сверку введённых имени и пароля с находящимся на win сервере списком и в случае их наличия и соответсвия создание такого же (имя и пароль) локального пользователя с настройками по умолчанию для вновь создаваемых и его загрузку? Причём доступ к списку получать, например, при помощи Кербероса.
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

Получается "анонимно" LDAP AD даже не прочитать - если нет учетки (с правами чтения) на пользователя или хотя-бы машину.
Попробуйте созать отдельную тему с учетом всего вышеизложенного....
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
08.10.2009 19:48
Получается "анонимно" LDAP AD даже не прочитать - если нет в учетки (с правами чтения) на пользователя или хотя-бы машину.
Попробуйте созать отдельную тему с учетом всего вышеизложенного....


Нет, как раз использовать для этого введённого пользователя. По Керберосу же можно получать "билет" простому пользователю, т.е. его прав оказывается достаточно, чтобы прочесть список пользователей AD.
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
03.10.2009 00:55
#умолчательные настройки samba (печать, права и п.р.) - не обязательно для авторизации, но не мешает - можно оставить
usershare allow guests = No
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw
map to guest = Bad User
include = /etc/samba/dhcp.conf
logon path = \\%L\profiles\.msprofile
logon home = \\%L\%U\.9xprofile
logon drive = P:


А эти параметры, касающиеся печати, как-либо влияют на настройку печати с Линукс-машины (т.е. текущей) на удалённый принтер, расшарашенный на Виндоус-машине?
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

Отредактировал следующим образом:

common-account-pc -
#account requisite pam_unix2.so
#account required pam_krb5.so use_first_pass ignore_unknown_principals
account sufficient pam_winbind.so
account required pam_unix.so nullok_secure

common-auth-pc -
#auth required pam_env.so
#auth sufficient pam_unix2.so
auth sufficient pam_winbind.so use_first_pass
#auth required pam_deny.so
auth required pam_unix.so nullok_secure

common-password-pc -
#password requisite pam_pwcheck.so nullok cracklib
#password [default=ignore success=1] pam_succeed_if.so uid > 999 quiet
#password sufficient pam_unix2.so use_authtok nullok
#password sufficient pam_krb5.so
#password required pam_deny.so
password required pam_unix.so nullok
password sufficient pam_wibind.so

common-session-pc -
#session required pam_limits.so
#session required pam_unix2.so
#session optional pam_krb5.so
#session optional pam_umask.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022

nsswitch.conf -
passwd: files winbind
shadow: files winbind
group: files winbind

hosts: files dns
networks: files dns

services: files
protocols: files
rpc: files
ethers: files
netmasks: files
netgroup: files
publickey: files

bootparams: files
automount: files winbind
aliases: files
shadow: compat

smb.conf -
[global]
# log file = /var/log/samba/log.%m
# max log size = 2048
workgroup = DOMAIN
password server = server.domain
encrypt passwords = yes
# auth methods = winbind
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = yes
template homedir = /home/%U
template shell = /bin/bash
winbind refresh tickets = yes
case sensitive = no
# interfaces = eth0
include = /etc/samba/dhcp.conf
idmap gid = 1000-20000
idmap uid = 1000-20000
realm = DOMAIN
security = SERVER
# dos charset = 866
# unix charset = UTF-8
usershare allow guests = No
# netbios name = %h
# logon path = \\%L\profiles\.msprofile
# logon home = \\%L\%U\.9xprofile
# logon drive = P:
# map to guest = Bad User
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw


С консоли получил:

~ # service winbind restart
Shutting down Samba WINBIND daemon done
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon running
~ # wbinfo -p
Ping to winbindd succeeded
~ # wbinfo -t
checking the trust secret via RPC calls failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
Could not check secret
~ # wbinfo -u
~ # wbinfo -g
~ #


Авторизация, естественно, не проходит...

А после перезагрузки комп-а в boot.log:

...
failedSetting up service (localfs) network . . . . . . . . . .failed
...
Starting Samba WINBIND daemon done
...
unknown or invalid address [server1]

...

unknown or invalid address [server1]

Setting up (remotefs) network interfaces:
Setting up service (remotefs) network . . . . . . . . . .done

unknown or invalid address [server1]

...
unknown or invalid address [server1]

Master Resource Control: runlevel 5 has been reached
Failed services in runlevel 5: ibm-prtm network
<notice>killproc: kill(2114,3)
unknown or invalid address [server1]

...

Что тут ещё можно сделать?
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
09.10.2009 17:04
UTiM писал(а):
03.10.2009 00:55
#умолчательные настройки samba (печать, права и п.р.) - не обязательно для авторизации, но не мешает - можно оставить
................................
printing = cups
printcap name = cups
printcap cache time = 750
cups options = raw
.....................................

А эти параметры, касающиеся печати, как-либо влияют на настройку печати с Линукс-машины (т.е. текущей) на удалённый принтер, расшарашенный на Виндоус-машине?

Скорее всего это касается cups - сервера - системы печати под линух.... Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) возможно требует наличия самба-клиента, но к smb.conf скорее всего никакого отношения не имеют.... Вот например ссылочка
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
09.10.2009 18:53
Что тут ещё можно сделать?


Так wbinfo -u список пользователей выдает?
А wbinfo -a пользователь_домена%пароль авторизует?

на счет

Код: Выделить всё

 wbinfo -t
checking the trust secret via RPC calls failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
Could not check secret
- "погуглите" сами - то-ли найти сервер не может, то-ли доступа к нему нет...

Добавлять что либо в pam при неработоспособном winbind - чревато, но в итоге должно быть примерно так:

Код: Выделить всё

common-account-pc -
account    requisite    pam_unix2.so
account    sufficient    pam_localuser.so
account    required    pam_winbind.so    use_first_pass

common-auth-pc -
auth    required    pam_env.so
auth    sufficient    pam_unix2.so
auth    required    pam_winbind.so    use_first_pass

common-password-pc -
password    sufficient    pam_winbind.so
password    requisite    pam_pwcheck.so    nullok cracklib
password    required    pam_unix2.so    nullok use_authtok

common-session-pc -
session    required    pam_mkhomedir.so
session    required    pam_limits.so
session    required    pam_unix2.so
session    required    pam_winbind.so
session    optional    pam_umask.so

Это рабочая конфигурация от OpenSUSE 10.2, в более свежих может слегка отличаться (просто сейчас нет под рукой...)
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
09.10.2009 23:10
.... Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) ...


Вы, наверное, имели ввиду: "Обратная задача (с лин. машины на расшарашенный принтер на вин. машине)". Или я не совсем понял, что Вы имели здесь ввиду?
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
09.10.2009 23:54
Так wbinfo -u список пользователей выдает?
А wbinfo -a пользователь_домена%пароль авторизует?


Я же привёл вывод консоли:
"
~ # wbinfo -u
~ # wbinfo -g
~ #
"
Я не совсем понял, что Вы имели ввиду. Может, он выдавать должен куда-то в другое место?
И, естественно, не авторизует, а выдаёт:
"challenge/response password authentication failed
error code was NT_STATUS_INVALID_HANDLE (0xc0000008)
error messsage was: Invalid handle"
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
09.10.2009 23:54
Добавлять что либо в pam при неработоспособном winbind - чревато, но в итоге должно быть примерно так:

Код: Выделить всё

common-account-pc -
account    requisite    pam_unix2.so
account    sufficient    pam_localuser.so
account    required    pam_winbind.so    use_first_pass

common-auth-pc -
auth    required    pam_env.so
auth    sufficient    pam_unix2.so
auth    required    pam_winbind.so    use_first_pass

common-password-pc -
password    sufficient    pam_winbind.so
password    requisite    pam_pwcheck.so    nullok cracklib
password    required    pam_unix2.so    nullok use_authtok

common-session-pc -
session    required    pam_mkhomedir.so
session    required    pam_limits.so
session    required    pam_unix2.so
session    required    pam_winbind.so
session    optional    pam_umask.so

Это рабочая конфигурация от OpenSUSE 10.2, в более свежих может слегка отличаться (просто сейчас нет под рукой...)


Переправил всё как здесь.
Результат тот же:
"
~ # service winbind restart
Shutting down Samba WINBIND daemon done
Starting Samba WINBIND daemon done
~ # service winbind status
Checking for Samba WINBIND daemon running
~ # wbinfo -u
"
А при security=ADS вместо SERVER выдаёт вместо "running" - "dead", а в конце (т.е. после wbinfo -u) добавляет: "Error looking up domain users"
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
16.10.2009 11:15
UTiM писал(а):
09.10.2009 23:10
.... Дело в том, что принтеры на линуксовой машине, подлюченные к cups можно расшарить для виндовых машин с помощью самбы. Эти настройки это и помогают сделать. Обратная задача (с виндовой машины на cups) ...


Вы, наверное, имели ввиду: "Обратная задача (с лин. машины на расшарашенный принтер на вин. машине)". Или я не совсем понял, что Вы имели здесь ввиду?

Все правильно. Только вы имеете в виду: "печатать с лин. на сетевой принтер под вин.", а я "подключить к лин. машине сетевой принтер под вин." ( для печати, естественно). Это то-же самое.
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
16.10.2009 12:51
А при security=ADS вместо SERVER выдаёт вместо "running" - "dead", а в конце (т.е. после wbinfo -u) добавляет: "Error looking up domain users"


Должно быть "security=ADS" - тогда самба работает как член виндового домена (во всяком случае с точки зрения авторизации пользователей на своих шарах), обязательно-ли это для простой авторизации пользователей - скорее всего да (на http://smb-conf.ru/security-g.html не очень понятно) - но то что у вас не работает иначе - показатель!

"wbinfo -u" при нормально функционирующем winbind выдает список доменных пользователей.
Без работающего winbinda дальнейшие игры с настройками pam - бесмысленны. А без ввода компа в домен (или хотя-бы ручной правки учетки в AD) - что может сделать только админ - попытки бесполезны.

Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому - что имеется в виду некий "стандартный" керберос (так-же как "стандартный" LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду.... Копайте в сети - может обрящите....
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
16.10.2009 23:35
[Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому - что имеется в виду некий "стандартный" керберос (так-же как "стандартный" LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду.... Копайте в сети - может обрящите....


А Вы не сможете мне объяснить теоретически суть проблемы?
Ведь мы имеем:
1) Керберос, который выдаёт "билет", и монтирование mount.cifs (правда, несмотря на полученный "билет", - только с опцией user, что, насколько я понимаю, свидетельствует об аутентификации только по ntlm) без всяких админ-ских серверных паролей.
2) Регистратор Линукса (если я не ошибаюсь, то он называется PAM), который позволяет создавать и загружаться пользователям на основе списка на AD сервере.
Для последнего требуется считать список пользователей с сервера, что везде предлагается делать почему-то при помощи samba (winbind), который без регистрации комп-а в домене не работает. Если весь механизм локального создания и загрузки пользователя заключён НЕ в winbind'е, то почему все используют только его (насколько я понимаю, обеспечивающего в данной задаче только считывание списка пользоватей на сервере), а, например, не приведённые в п.1 сервисы? Невозможно настроить pam для регистрации с помощью AD списка, так как в нём где-то забито использование для этого winbind'а? Или в чём конкретно заключается проблема? Кто знает?
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
16.10.2009 23:35
CAEman писал(а):
16.10.2009 12:51
А при security=ADS вместо SERVER выдаёт вместо "running" - "dead", а в конце (т.е. после wbinfo -u) добавляет: "Error looking up domain users"


Должно быть "security=ADS" - тогда самба работает как член виндового домена (во всяком случае с точки зрения авторизации пользователей на своих шарах), обязательно-ли это для простой авторизации пользователей - скорее всего да (на http://smb-conf.ru/security-g.html не очень понятно) - но то что у вас не работает иначе - показатель!

"wbinfo -u" при нормально функционирующем winbind выдает список доменных пользователей.
Без работающего winbinda дальнейшие игры с настройками pam - бесмысленны. А без ввода компа в домен (или хотя-бы ручной правки учетки в AD) - что может сделать только админ - попытки бесполезны.

Можете для интереса покрутить авторизацию keberos, хотя я еще ни разу не слышал о ее применении для авторизации в виндовом домене, возможно потому - что имеется в виду некий "стандартный" керберос (так-же как "стандартный" LDAP при LDAP авторизации), а не то, что Микрософт имеет в виду.... Копайте в сети - может обрящите....


Решил сделать LDAP авторизацию с kerberos аутентификацией.
LDAP работает, например, в следующем виде:

Код: Выделить всё

~ # ldapsearch -v -x -D CN=user,CN=Users,DC=domain -W -LLL "(cn=*)

с выводом всех пользователей (вернее с, естественно, "Size limit exceeded (4)" в конце).
Т.е. простой пользователь с помощью ldap имеет доступ к спискам пользователей AD. Можно это будет как-нибудь использовать для авторизации на сервере с применением введённых имени и пароля и без предварительного создания локального пользователя?

Попробовал "$ ssh user@localhost" . В результате вновь и вновь выдаётся строка с требованием ввода пароля (пока не прервёшь), а в /var/log/messages записывается следующая информация:

Код: Выделить всё

sshd[7005]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7005]: Invalid user user from 127.0.0.1
sshd[7010]: pam_krb5[7010]: default/local realm 'DOMAIN'
sshd[7010]: pam_krb5[7010]: configured realm 'DOMAIN'
sshd[7010]: pam_krb5[7010]: flag: debug
sshd[7010]: pam_krb5[7010]: flags: forwardable not proxiable
sshd[7010]: pam_krb5[7010]: flag: no ignore_afs
sshd[7010]: pam_krb5[7010]: flag: no null_afs
sshd[7010]: pam_krb5[7010]: flag: user_check
sshd[7010]: pam_krb5[7010]: flag: no krb4_convert
sshd[7010]: pam_krb5[7010]: flag: krb4_convert_524
sshd[7010]: pam_krb5[7010]: flag: krb4_use_as_req
sshd[7010]: pam_krb5[7010]: will try previously set password first
sshd[7010]: pam_krb5[7010]: will let libkrb5 ask questions
sshd[7010]: pam_krb5[7010]: flag: use_shmem
sshd[7010]: pam_krb5[7010]: flag: external
sshd[7010]: pam_krb5[7010]: flag: warn
sshd[7010]: pam_krb5[7010]: ticket lifetime: 43200s (0d,12h,0m,0s)
sshd[7010]: pam_krb5[7010]: renewable lifetime: 86400s (1d,0h,0m,0s)
sshd[7010]: pam_krb5[7010]: minimum uid: 1
sshd[7010]: pam_krb5[7010]: banner: Kerberos 5
sshd[7010]: pam_krb5[7010]: ccache dir: /tmp
sshd[7010]: pam_krb5[7010]: ccname template: FILE:%d/krb5cc_%U_XXXXXX
sshd[7010]: pam_krb5[7010]: keytab: FILE:/etc/krb5.keytab
sshd[7010]: pam_krb5[7010]: token strategy: v4,524,2b,rxk5
sshd[7010]: pam_krb5[7010]: pam_authenticate called for 'user', realm 'DOMAIN'
sshd[7010]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7010]: pam_krb5[7010]: error resolving user name 'user' to uid/gid pair
sshd[7010]: pam_krb5[7010]: error getting information about 'user'
sshd[7010]: nss_ldap: could not search LDAP server - Server is unavailable

А после ввода пароля добавляется:

Код: Выделить всё

sshd[7142]: error: PAM: Authentication failure for illegal user user from localhost
sshd[7142]: Failed keyboard-interactive/pam for invalid user user from 127.0.0.1 port 45307 ssh2
sshd[7148]: pam_krb5[7148]: default/local realm 'DOMAIN'
sshd[7148]: pam_krb5[7148]: configured realm 'DOMAIN'
sshd[7148]: pam_krb5[7148]: flag: debug
sshd[7148]: pam_krb5[7148]: flags: forwardable not proxiable
sshd[7148]: pam_krb5[7148]: flag: no ignore_afs
sshd[7148]: pam_krb5[7148]: flag: no null_afs
sshd[7148]: pam_krb5[7148]: flag: user_check
sshd[7148]: pam_krb5[7148]: flag: no krb4_convert
sshd[7148]: pam_krb5[7148]: flag: krb4_convert_524
sshd[7148]: pam_krb5[7148]: flag: krb4_use_as_req
sshd[7148]: pam_krb5[7148]: will try previously set password first
sshd[7148]: pam_krb5[7148]: will let libkrb5 ask questions
sshd[7148]: pam_krb5[7148]: flag: use_shmem
sshd[7148]: pam_krb5[7148]: flag: external
sshd[7148]: pam_krb5[7148]: flag: warn
sshd[7148]: pam_krb5[7148]: ticket lifetime: 43200s (0d,12h,0m,0s)
sshd[7148]: pam_krb5[7148]: renewable lifetime: 86400s (1d,0h,0m,0s)
sshd[7148]: pam_krb5[7148]: minimum uid: 1
sshd[7148]: pam_krb5[7148]: banner: Kerberos 5
sshd[7148]: pam_krb5[7148]: ccache dir: /tmp
sshd[7148]: pam_krb5[7148]: ccname template: FILE:%d/krb5cc_%U_XXXXXX
sshd[7148]: pam_krb5[7148]: keytab: FILE:/etc/krb5.keytab
sshd[7148]: pam_krb5[7148]: token strategy: v4,524,2b,rxk5
sshd[7148]: pam_krb5[7148]: pam_authenticate called for 'user', realm 'DOMAIN'
sshd[7148]: nss_ldap: could not search LDAP server - Server is unavailable
sshd[7148]: pam_krb5[7148]: error resolving user name 'user' to uid/gid pair
sshd[7148]: pam_krb5[7148]: error getting information about 'user'
sshd[7148]: nss_ldap: could not search LDAP server - Server is unavailable

Почему ldapsearch обнаруживает сервер, a nss_ldap - нет? Может, А) в какой-нибудь конфигурации следует как-то прописать правильный синтаксис запроса (CN=user,CN=Users,DN=domain), или Б) для него обязателен ввод машины в домен?
Если бы сервер был обнаружен, то локальный пользователь, одноимённый серверному, должен был бы создаться?
В случае Б скрипт помочь не сможет?
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
26.02.2010 13:51
LDAP работает, например, в следующем виде:

Код: Выделить всё

~ # ldapsearch -v -x -D CN=user,CN=Users,DC=domain -W -LLL "(cn=*)

с выводом всех пользователей (вернее с, естественно, "Size limit exceeded (4)" в конце).
Т.е. простой пользователь с помощью ldap имеет доступ к спискам пользователей AD. Можно это будет как-нибудь использовать для авторизации на сервере с применением введённых имени и пароля и без предварительного создания локального пользователя?


До домена через ldapsearch вы достучитесь (сам юзаю), но не авторизуетесь! Выше уже было сказано почему. LDAP от микросовта (без напильника - а напильник только у админа) не содержит нужных для pam-ldap авторизации полей. Вообще, если вы не админ, то просто заведите себе локальную учетку со своим логином и паролем (как в домене), в настройки доступа "Центр управления"-"Сеть и интернет"-"Обзор локальной сети" вбейте (с доменным суфиксом) логин - пароль и ходите по доменным шарам долго и щастливо.... Или уже купите админу пиво, что-б он вам в "net ads join...." один раз пароль ввел..... :drunk:
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
26.02.2010 18:18
До домена через ldapsearch вы достучитесь (сам юзаю), но не авторизуетесь! Выше уже было сказано почему. LDAP от микросовта (без напильника - а напильник только у админа) не содержит нужных для pam-ldap авторизации полей. Вообще, если вы не админ, то просто заведите себе локальную учетку со своим логином и паролем (как в домене), в настройки доступа "Центр управления"-"Сеть и интернет"-"Обзор локальной сети" вбейте (с доменным суфиксом) логин - пароль и ходите по доменным шарам долго и щастливо.... Или уже купите админу пиво, что-б он вам в "net ads join...." один раз пароль ввел..... :drunk:


Я и так могу шарить по домену "долго и щастливо....". Но комп-ов - с десяток, а пользователей - тысячи, а админ. - о-о-очень далеко...
Неужели нельзя сделать скрипт, использующий введённые имя и пароль с помощью ldapsearch для доступа к спискам пользователей на сервере, а аутентификацию уже проводить с помощью kerberos (или даже обойтись без неё - получил доступ к спискам пользователей на сервере, - значит, авторизовался)?
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
26.02.2010 21:35
Неужели нельзя сделать скрипт, использующий введённые имя и пароль с помощью ldapsearch для доступа к спискам пользователей на сервере, а аутентификацию уже проводить с помощью kerberos (или даже обойтись без неё - получил доступ к спискам пользователей на сервере, - значит, авторизовался)?

Получить список пользователей ldap - не значит авторизоваться... а вот получить билет kerberos - уже почти.. А вообще - теоретически данная схема может быть работоспособна. Правда возможно для этого надо минимум собственный pam- модуль написать... (авторизация с помощью pam_krb5 я так понял - непрокатила?) На этом мои знания, к сожалению, заканчиваются.... Если вам больше никто не поможет - значит просто вы - первый будете!

P.S.
А, да - совет - создайте все-таки отдельную тему, типа "авторизация в виндовом домене без знания пароля админа" - больше вероятность, что знающие люди увидят и ответят, так как с данным топиком ваш вопрос мало коррелирует...
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
26.02.2010 23:26
... (авторизация с помощью pam_krb5 я так понял - непрокатила?) ...


А разве pam_krb5 производит полную авторизацию, а не только аутентификацию?
А как kerberos для этого следует настроить?

Насчёт темы. Одну я уже пытался здесь открыть (http://unixforum.org/index.php?showtopic=103937).
Там мне посоветовали список логинов из домена выдернуть ldapsearch-ем и после этого завести их всех в /etc/passwd. Как я понял, в ручном режиме.
Но дело в том, что список непостоянный. Можно же это как-нибудь автоматизировать (например, с помощью /etc/init.d/boot.local), но чтобы пароль был закодирован (раз уж это нельзя сделать с помощью скрипта при авторизации, а нужно писать модуль...)?
Ну, а новую тему в каком разделе Вы мне посоветуете открыть?
Спасибо сказали:
UTiM
Сообщения: 180
ОС: OpenSuse

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение UTiM »

CAEman писал(а):
05.03.2010 18:03
А разве pam_krb5 производит полную авторизацию, а не только аутентификацию?
А как kerberos для этого следует настроить?

Ну если это полноценный "auth" pam-модуль - и результатом его выполнения может быть "required" или "sufficient" , то может. Для этого рекомендую почитать про технологию pam, например вот здесь коротенько. Затем обратиться к "первоисточнику" - к докам от авторов pam_krb5 - там, по идее, будет написано что он может и как настроить krb5.conf. (будет-ли все это работать - только тесты покажут...) Я знаю только про настройку для нужд самбы...

CAEman писал(а):
05.03.2010 18:03
Насчёт темы. Одну я уже пытался здесь открыть (http://unixforum.org/index.php?showtopic=103937).
Там мне посоветовали список логинов из домена выдернуть ldapsearch-ем и после этого завести их всех в /etc/passwd. Как я понял, в ручном режиме.
Но дело в том, что список непостоянный. Можно же это как-нибудь автоматизировать (например, с помощью /etc/init.d/boot.local), но чтобы пароль был закодирован (раз уж это нельзя сделать с помощью скрипта при авторизации, а нужно писать модуль...)?

Список логинов выдернуть и запихнуть в /etc/passwd скриптом можно, но что делать с паролями? Или оставлять пустыми (пусть юзер сам сменит при первом входе) или попытаться стянуть хеши (паролей там нет-только хеши) с сервера -не факт, что сервер даст слить, а если даст - то что с ними делать? Просто писать в /etc/shadow? - не уверен в совпадении форматов, даже если и там и там MD5. Попробуйте завести пользователя с одинаковым паролем и там и там и сравнит хеши в AD и /etc/shadow - если одинаковые и их можно слить ldapsearch-ем - вам повезло...

CAEman писал(а):
05.03.2010 18:03
Ну, а новую тему в каком разделе Вы мне посоветуете открыть?

Попробуйте в "Администрирование"
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

UTiM писал(а):
05.03.2010 19:32
Ну если это полноценный "auth" pam-модуль - и результатом его выполнения может быть "required" или "sufficient" , то может. Для этого рекомендую почитать про технологию pam, например вот здесь коротенько. Затем обратиться к "первоисточнику" - к докам от авторов pam_krb5 - там, по идее, будет написано что он может и как настроить krb5.conf. (будет-ли все это работать - только тесты покажут...) Я знаю только про настройку для нужд самбы...

Спасибо за ссылку. Правда, мне её уже где-то давали, и это статья висит у меня в браузере.
Ничего там про pam_krb5 я не нашёл. Кстати, если я всё-таки решусь прибегнуть к крайнему случаю - написанию модуля (если скрипт однозначно не "прокатит", хотя некоторые утверждают, что должен "прокатить", правда, при этом не предоставляют никакой конкретики по его написанию и задействованию), то не могли бы Вы мне подробно расписать значение второй части содержщейся в этой статье фразы: "...а теперь мы просто сделаем новый модуль, соберем его как библиотеку..."? А то я там что-то этого описания не нашёл...
"Поманил" немного про pam_krb5:

Код: Выделить всё

NAME
       pam_krb5 - Kerberos 5 authentication


SYNOPSIS
       auth required /lib64/security/pam_krb5.so
       session optional /lib64/security/pam_krb5.so
       account sufficient /lib64/security/pam_krb5.so
       password sufficient /lib64/security/pam_krb5.so


DESCRIPTION
       The  pam_krb5.so module is designed to allow smooth integration of Kerberos 5 password-checking for applications which use PAM.  It creates session-specific credential
       cache files, and can obtain Kerberos IV credentials using a krb524 service.  If the system is an AFS client, it will also attempt to obtain tokens for the local  cell,
       the cell which contains the user's home directory, and any explicitly-configured cells.

       When  a  user  logs in, the module's authentication function performs a simple password check and, if possible, obtains Kerberos 5 and Kerberos IV credentials, caching
       them for later use.  When the application requests initialization of credentials (or opens a session), the usual ticket files are created.  When the application subse-
       quently requests deletion of credentials or closing of the session, the module deletes the ticket files.  When the application requests account management, if the mod-
       ule did not participate in authenticating the user, it will signal libpam to ignore the module.  If the module did participate in  authenticating  the  user,  it  will
       check  for  an expired user password and verify the user's authorization using the .k5login file of the user being authenticated, which is expected to be accessible to
       the module.






NAME
       pam_krb5 - Kerberos 5 authentication


DESCRIPTION
       pam_krb5.so  reads  its configuration information from the appdefaults section of krb5.conf(5).  You should read the krb5.conf(5) man page before continuing here.  The
       module expects its configuration information to be in the pam subsection of the appdefaults section.






NAME
       krb5.conf - Kerberos configuration file

DESCRIPTION
       krb5.conf  contains  configuration information needed by the Kerberos V5 library.  This includes information describing the default Kerberos realm, and the location of
       the Kerberos key distribution centers for known realms.

       The krb5.conf file uses an INI-style format.  Sections are delimited by square braces; within each section, there are relations where tags can be assigned to have spe-
       cific  values.   Tags can also contain a subsection, which contains further relations or subsections.  A tag can be assigned to multiple values.  Here is an example of
       the INI-style format used by krb5.conf:


                 [section1]
                      tag1 = value_a
                      tag1 = value_b
                      tag2 = value_c

                 [section 2]
                      tag3 = {
                           subtag1 = subtag_value_a
                           subtag1 = subtag_value_b
                           subtag2 = subtag_value_c
                      }
                      tag4 = {
                           subtag1 = subtag_value_d
                           subtag2 = subtag_value_e
                      }



       The following sections are currently used in the krb5.conf file:

       [libdefaults]
              Contains various default values used by the Kerberos V5 library.


       [login]
              Contains default values used by the Kerberos V5 login program, login.krb5(8).


       [appdefaults]
              Contains default values that can be used by Kerberos V5 applications.


       [realms]
              Contains subsections keyed by Kerberos realm names which describe where to find the Kerberos servers for a particular realm, and other  realm-specific  informa-
              tion.


       [domain_realm]
              Contains  relations  which map subdomains and domain names to Kerberos realm names.  This is used by programs to determine what realm a host should be in, given
              its fully qualified domain name.


       [logging]
              Contains relations which determine how Kerberos entities are to perform their logging.


       [capaths]
              Contains the authentication paths used with non-hierarchical cross-realm. Entries in the section are used by the client to  determine  the  intermediate  realms
              which may be used in cross-realm authentication. It is also used by the end-service when checking the transited field for trusted intermediate realms.


       [dbdefaults]
              Contains default values for database specific parameters.


       [dbmodules]
              Contains database specific parameters used by the database library.

       Each of these sections will be covered in more details in the following sections.







NAME
       login.krb5 - kerberos enhanced login program

SYNOPSIS
       login.krb5 [-p] [-fFe username] [-r | -k | -K | -h hostname]

DESCRIPTION
       login.krb5  is  a modification of the BSD login program which is used for two functions.  It is the sub-process used by krlogind and telnetd to initiate a user session
       and it is a replacement for the command-line login program which, when invoked with a password, acquires Kerberos tickets for the user.

       login.krb5 will prompt for a username, or take one on the command line, as login.krb5 username and will then prompt for a password.  This  password  will  be  used  to
       acquire  Kerberos Version 5 tickets and Kerberos Version 4 tickets (if possible.) It will also attempt to run aklog to get AFS tokens for the user. The version 5 tick-
       ets will be tested against a local krb5.keytab if it is available, in order to verify the tickets, before letting the user in. However, if  the  password  matches  the
       entry in /etc/passwd the user will be unconditionally allowed (permitting use of the machine in case of network failure.)

Насколько мне позволяют судить мои скромные познания в английском и ещё более скромные - в администрировани, хоть там и присутствует "auth", но речь идёт только о аутентификации (правда, я не совсем понял, что за "the user's authorization using the .k5login"). Если я ошибаюсь, то не могли бы Вы мне объяснить смысл здесь написанного?

Список логинов выдернуть и запихнуть в /etc/passwd скриптом можно, но что делать с паролями? Или оставлять пустыми (пусть юзер сам сменит при первом входе) или попытаться стянуть хеши (паролей там нет-только хеши) с сервера -не факт, что сервер даст слить, а если даст - то что с ними делать? Просто писать в /etc/shadow? - не уверен в совпадении форматов, даже если и там и там MD5. Попробуйте завести пользователя с одинаковым паролем и там и там и сравнит хеши в AD и /etc/shadow - если одинаковые и их можно слить ldapsearch-ем - вам повезло...

А что, разве нельзя иметь беспарольных пользователей при доступной только руту локальной авторизации (ведь, в этом случае при повторной авторизации будут использоваться локально хранящиеся профили, а не перезаписываться профилем по умолчанию)? Если можно, то как сделать такой скрипт, использующий имя и пароль либо авторизирующегося (предпочтительнее), либо хранящегося пользователя, но с закодированным паролем?

Попробуйте в "Администрирование"

Ещё раз? А не пошлют ли? А то на некоторых форумах модераторы посылают, если даже находят открытую мной аналогичную тему на других форумах, а тут Вы предлагаете - на том же форуме, в том же разделе (а ещё с таким ником модератора)...
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

См. следующее сообщение
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

Решился наконец написать РАМ модуль.

Код: Выделить всё

     #define _XOPEN_SOURCE

 // Включаем необходимые (хотя и не исключаю, что здесь есть и лишние) заголовочные файлы.

#include <security/pam_modules.h>
#include <security/pam_appl.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdarg.h>
#include <time.h>
#include <ldap.h>
#include <stdlib.h>
#include <stdio.h>
     #include <stddef.h>
     #include <unistd.h>
     #include <sys/wait.h>




//Это определит тип нашего модуля
#define PAM_SM_AUTH
#define MAX_V 30

// Реализуем наш алгоритм авторизации.

PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags, int argc, const char **argv)
{
        unsigned int ctrl;
        int retval, result;
        const char *name;
        /* получим имя пользователя */

        // Получаем имя пользователя
        // Вся мудрость PAM в том, что приглашение "login: " появится если имя еще не известно,
        // иначе мы сразу получим ответ, сгенерированный предыдущими модулями.

        result = pam_get_user(pamh, &name, "login: ");

    if (!strcmp(name, "root")) {
        return PAM_SUCCESS;
    //Делаем игнорирование для root'a
    }

    else
        {/*получим пароль используя диалог*/

           struct pam_response *resp;
// Сами мы не знаем как будет осущестляться диалог, это забота программы (в нашем случае этим займется login).
        {
                struct pam_conv *conv;
                struct pam_message msg[] = {{
                    PAM_PROMPT_ECHO_OFF,
                    "Password: "
                }};
                const struct pam_message *mess = msg;
                retval = pam_get_item( pamh, PAM_CONV, (const void **) &conv );

                if (!conv->conv)
                    return PAM_SUCCESS;

                conv->conv(1, &mess, &resp, conv->appdata_ptr);
        }
    char * dn = "CN=%s,CN=Users,DC=domain";
    char * dnx = malloc(strlen(dn)+strlen(name)+2);
    int res = 0;

    sprintf(dnx, dn, name);
// Авторизируемся на LDAP сервере по имени LDAPserver путём проверки возможности соединения с ним с введёнными именем и паролем
    res = ldap_simple_bind_s(
                ldap_init("LDAPserver.domain", 389),
                dnx,
                resp->resp);

    free(dnx);

    if (!res)  {
// В случае удачной авторизации
if (!result)
// При отсутствии такого локального пользователя
{
// СОЗДАЁМ ПОЛЬЗОВАТЕЛЯ
     // Execute the command using this shell program.
     #define SHELL "/bin/sh"

     int
     my_system (const char *command)
     {
       int status;
       pid_t pid;

       pid = fork ();
       if (pid == 0)
         {
           // This is the child process.  Execute the shell command.
           execl (SHELL, SHELL, "-c", command, NULL);
           _exit (EXIT_FAILURE);
         }
       else if (pid < 0)
         // The fork failed.  Report failure.
         status = -1;
       else
         // This is the parent process.  Wait for the child to complete.
         if (waitpid (pid, &status, 0) != pid)
           status = -1;
       return status;
     }

    char stroke[333];
    sprintf(stroke,"%s %s %s","/usr/sbin/useradd -p",crypt(resp->resp,"aa"),name);
    my_system(stroke);
// Передаём результат удачной авторизации после создания пользователя
    return PAM_SUCCESS;
}

else
// Передаём результат удачной авторизации
    return PAM_SUCCESS;
        }
        else
            return PAM_AUTH_ERR;
// Нашим результатом будет да или нет. Как прервать программу разберется основной модуль PAM.
    }
}



/*
 * The only thing _pam_set_credentials_unix() does is initialization of
 * UNIX group IDs.
 *
 * Well, everybody but me on linux-pam is convinced that it should not
 * initialize group IDs, so I am not doing it but don't say that I haven't
 * warned you. -- AOY
 */

PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags, int argc, const char **argv)
{
        unsigned int ctrl;
        int retval;

        retval = PAM_SUCCESS;
        return retval;
}

// Это определение необходимо для статической линковки модулей PAM в приложениях.
#ifdef PAM_STATIC
struct pam_module _pam_unix_auth_modstruct = {
    "pam_LDAPserver",
    pam_sm_authenticate,
    pam_sm_setcred,
    NULL,
    NULL,
    NULL,
    NULL,
};
#endif

Скомпилировал командой:
gcc ./pam_LDAPserver.c -lcrypt -lldap -fPIC --shared -o pam_LDAPserver.so
Скопировал pam_LDAPserver.so в /lib64/security
Вставил в common-auth перед "auth required pam_unix2.so nullok" строку:
auth required pam_LDAPserver.so

ВСЁ РАБОТАЕТ (не забываем о "session required pam_mkhomedir.so umask=0022 skel=/etc/skel")!

Справился я таки с pam_mount нескольких серверных ресурсов. Правда, только с помощью fstab...
Имеем login следующего содержания:
"
#%PAM-1.0
auth requisite pam_nologin.so
auth [user_unknown=ignore success=ok ignore=ignore auth_err=die default=bad] pam_securetty.so
auth required pam_mount.so
auth include common-auth
password include common-password
account include common-account
session include common-session
session required pam_mkhomedir.so umask=0022 skel=/etc/skel
session optional pam_mount.so
session required pam_loginuid.so
session required pam_lastlog.so nowtmp
session optional pam_mail.so standard
session optional pam_ck_connector.so
"
Добавляем в начало fstab монтируемые ресурсы:
//server/share /home/%(USER)/share cifs noauto,nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID) 0 0
//server/users/%(USER) /home/%(USER)/Documents cifs noauto,nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID) 0 0

Добавляем в pam_mount.conf.xml:
<volume path="//server/share" uid="1000-55555" />
<volume path="//server/users/%(USER)" uid="1000-55555" />
Изменяем начало (до %(VOLUME) ) значения lclmount на:
mount -t cifs

и монтирование (с размонтированием) начинает работать!


P.S. Поскольку эта тема, судя по всему, не вызывает больше ни у кого интереса, постольку следить за ней я перестаю.
Так что, если она у кого вдруг вызывет интерес, и у него появятся какие-либо вопросы, - советую попробовать создать новую тему.
Спасибо сказали:
CAEman
Сообщения: 178
ОС: OpenSUSE (GNU/Linux)

Re: Решено: Проблемы с авторизацией в AD через LDAP

Сообщение CAEman »

Для уточнения финальный вариант.
1. Создаём файл pam_ldap.c следующего содержания (редактируя соответствующие адреса):

Код: Выделить всё

     #define _XOPEN_SOURCE

 // Включаем необходимые заголовочные файлы.

#include <security/pam_modules.h>
#include <security/pam_appl.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdarg.h>
#include <time.h>
#include <ldap.h>
#include <stdlib.h>
#include <stdio.h>
     #include <stddef.h>
     #include <unistd.h>
     #include <sys/wait.h>




//Это определит тип нашего модуля
#define PAM_SM_AUTH
#define MAX_V 30

// Реализуем наш алгоритм аутентификации.

PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags
                                   ,int argc, const char **argv)
{
unsigned int ctrl;
int retval, result;
const char *name;
/* получим имя пользователя */

// Получаем имя пользователя
// Вся мудрость PAM в том, что приглашение "login: " появится если имя еще не известно,
// иначе мы сразу получим ответ, сгенерированный предыдущими модулями.
result = pam_get_user(pamh, &name, "login: ");

if (!strcmp(name, "root"))
    {
    return PAM_SUCCESS;
//Делаем игнорирование для root'a
    }

else
    {

/*получим пароль используя диалог*/
     struct pam_response *resp;
    {
    struct pam_conv *conv;
    struct pam_message msg[] = {{
            PAM_PROMPT_ECHO_OFF,
            "Password: "
            }};
    const struct pam_message *mess = msg;

    retval = pam_get_item( pamh, PAM_CONV, (const void **) &conv ) ;
    if (!conv->conv)
        return PAM_SUCCESS;
    conv->conv(1, &mess, &resp, conv->appdata_ptr);
// Сами мы не знаем как будет осуществляться диалог, это забота программы (в нашем случае этим займется login).

// Поскольку винда позволяла имена пользователей, начинающиеся с цифры, то таким пользователям, например, придётся добавить к своему имени вначале _, т.е.:
    char * ln = "%s";
    char *nname = malloc(strlen(ln)+strlen(name)+2);
    sprintf(nname, ln, name);
    if (!strncmp(name, "_", 1))
        {
        if (!strncmp(name, "_0", 2))
            {nname=strstr(name, "0");}
        else
            {
            if (!strncmp(name, "_1", 2))
                {nname=strstr(name, "1");}
            else
                {
                if (!strncmp(name, "_2", 2))
                    {nname=strstr(name, "2");}
                else
                    {
                    if (!strncmp(name, "_3", 2))
                        {nname=strstr(name, "3");}
                    else
                        {
                        if (!strncmp(name, "_4", 2))
                            {nname=strstr(name, "4");}
                        else
                            {
                            if (!strncmp(name, "_5", 2))
                                {nname=strstr(name, "5");}
                            else
                                {
                                if (!strncmp(name, "_6", 2))
                                    {nname=strstr(name, "6");}
                                else
                                    {
                                    if (!strncmp(name, "_7", 2))
                                        {nname=strstr(name, "7");}
                                    else
                                        {
                                        if (!strncmp(name, "_8", 2))
                                            {nname=strstr(name, "8");}
                                        else
                                            {
                                            if (!strncmp(name, "_9", 2))
                                                {nname=strstr(name, "9");}
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    char * dn = "CN=%s,CN=Users,DC=domain"; // ЗДЕСЬ ВВОДИМ СВОЙ АДРЕС
    char * dnx = malloc(strlen(dn)+strlen(nname)+2);
    int res = 0;
    sprintf(dnx, dn, nname);
// Авторизируемся на LDAP сервере, проверяя возможность соединения с ним с введёнными именем и паролем
    res = ldap_simple_bind_s(
            ldap_init("LDAPserver.domain", 389), // ЗДЕСЬ ВВОДИМ СВОЙ АДРЕС
            dnx,
            resp->resp);
    free(dnx);

    if (!res)
        {
// В случае удачной авторизации

        #define SHELL "/bin/sh"

        int
        my_system (const char *command)
        {
        int status;
        pid_t pid;

        pid = fork ();
        if (pid == 0)
            {
            // This is the child process.  Execute the shell command.
            execl (SHELL, SHELL, "-c", command, NULL);
            _exit (EXIT_FAILURE);
            }
        else
            if (pid < 0)
            // The fork failed.  Report failure.
                status = -1;
            else
            // This is the parent process.  Wait for the child to complete.
                if (waitpid (pid, &status, 0) != pid)
                    status = -1;
        return status;
        }

        if (!result)
// При отсутствии такого локального пользователя
            {
// СОЗДАЁМ ПОЛЬЗОВАТЕЛЯ
    // Execute the command using this shell program.
            char stroke[135];
            sprintf(stroke,"%s %s %s","/usr/sbin/useradd -p",crypt(resp->resp,"aa"),name);
            my_system(stroke);
            }


        if (!strncmp(name, "_", 1))
            {

            struct passwd pwd;
            struct passwd *r;
            char *buf;
            size_t bufsize;
            int s;

            bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
            if (bufsize == -1)          /* Value was indeterminate */
                bufsize = 16384;        /* Should be more than enough */
            buf = malloc(bufsize);
            if (buf == NULL)
                exit(EXIT_FAILURE);

            s = getpwnam_r(name, &pwd, buf, bufsize, &r);

// Передаём результат удачной авторизации
        return PAM_SUCCESS;
        }

        else
            return PAM_AUTH_ERR;
    }
// Нашим результатом будет да или нет. Как прервать программу разберется основной модуль PAM.
    }
}



/*
 * The only thing _pam_set_credentials_unix() does is initialization of
 * UNIX group IDs.
 *
 * Well, everybody but me on linux-pam is convinced that it should not
 * initialize group IDs, so I am not doing it but don't say that I haven't
 * warned you. -- AOY
 */

PAM_EXTERN int pam_sm_setcred(pam_handle_t * pamh, int flags
                              ,int argc, const char **argv)
{
        unsigned int ctrl;
        int retval;

        retval = PAM_SUCCESS;
//Чтобы никто не заметил, что мы ничего не делаем ответим, что все в порядке
        return retval;
}

// Это определение необходимо для статической линковки модулей PAM в приложениях.
#ifdef PAM_STATIC
struct pam_module _pam_unix_auth_modstruct = {
    "pam_ldap",
    pam_sm_authenticate,
    pam_sm_setcred,
    NULL,
    NULL,
    NULL,
    NULL,
};
#endif

2. Компилируем созданный файл, введя в текущей директории файла команду:

Код: Выделить всё

gcc ./pam_ldap.c -lcrypt -lldap -fPIC --shared -o pam_ldap.so

3. Копируем полученный в результате компиляции файл в папку /lib64/security (в случае 64 разрядной системы).
4. В случае необходимости монтирования каких-либо серверных ресурсов, вводим соответствующие строки в /etc/fstab и /etc/security/pam_mount.conf.xml, например, соответственно:

Код: Выделить всё

//server.domain/share_dir             /home/%(USER)/Y:     cifs       noauto 0 0
//server.domain/%(USER)    /home/%(USER)/Z:     cifs       noauto 0 0
и

Код: Выделить всё

<!-- Volume definitions -->  <volume path="//server.domain/share_dir" uid="1000-55555" />
  <volume path="//server.domain/%(USER)" uid="1000-55555" />
<!-- pam_mount parameters: Mount programs --> <lclmount>mount -t cifs %(VOLUME) %(MNTPT) -o nosuid,nodev,user=%(USER),uid=%(USERUID),gid=%(USERGID)</lclmount>
  <umount>umount %(MNTPT)</umount>

5. Проверяем, чтобы pam подключал указанные или аналогичные модули:
/etc/pam.d/common-auth-pc -

Код: Выделить всё

auth     required    pam_mount.so
auth    required    pam_ldap.so

/etc/pam.d/common-session-pc -

Код: Выделить всё

session    required    pam_limits.so
session    optional    pam_umask.so
session  required    pam_mkhomedir.so silent umask=0022 skel=/etc/skel
session  optional     pam_mount.so

Правда, в openSUSE 12.3 есть некоторые проблемы.
Спасибо сказали:
Ответить