Не мог аутентифицировать клиент LDAP с PAM, когда pwdReset = TRUE

Я искал тонны сетей и учебных руководств, но я не мог найти решение своей проблемы.

Я настроил OpenLDAP 2.4 на машине OpenSUSE 12.3 с наложением политики паролей. Клиентом является Linux Mint 17,1 машин с libnss-ldap и libpam-ldap установленными пакетами. Клиент и сервер настроен для использования TLS с самоподписанными сертификатами (работы сервера как CA, и подписывает его собственный сертификат). Все хорошо работает, пока я не добавляю атрибут pwdReset: TRUE пользователю.

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

Mar 4 07:27:11 client-desktop nslcd[3198]: [90cde7] <authc="johndoe"> ldap_result() failed: Insufficient access: Operations are restricted to bind/unbind/abandon/StartTLS/modify password
Mar 4 07:27:11 client-desktop nslcd[3198]: [dcc233] <authc="johndoe"> cn=John Doe,ou=people,cd=domain,dc=com: lookup failed: Invalid credentials

Это обменивается сообщениями, говорят мне, что удостоверения пользователя больше не действительны, который разумен, так как я изменил его пароль, но пользователю не предлагают о потребности изменить его пароль или безотносительно. Addtionally, я хочу предотвратить использование openldap utils как ldappasswd, поскольку клиенты не являются экспертами. Поэтому я хочу, чтобы они продолжили использовать типичную команду passwd для изменения их собственных паролей. По крайней мере, это возможно, когда pwdReset не установлен. Кроме того, я могу получить это поведение путем установки shadowLastChange припишите 0, но я хотел бы сделать все с политиками паролей, так как я также пытаюсь осуществить использование паролей по крайней мере 8 символов. Между прочим, эта функция превосходные работы.

Это - выборка моего основного DN так, чтобы можно было проверить, пропускаю ли я что-то. Отметьте это pwdReset имеет значение true на пользователе и pwdMustChange переменная имеет значение true в самой политике.

# John Doe, people, domain.com
dn: cn=John Doe,ou=people,dc=domain,dc=com
cn: John Doe
sn: Doe
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
uid: johndoe
uidNumber: 1003
gidNumber: 1000
homeDirectory: /home/johndoe
loginShell: /bin/bash
userPassword: e1NTSEF9VWFSMDVsSGNIWFMxcnJ5VzBtaWRkOHFmTDE1ai9RYlQ=
pwdReset: TRUE # This attribute only appears if I explicitly request it 

# policies, domain.com
dn: ou=policies,dc=domain,dc=com
objectClass: top
objectClass: organizationalUnit
ou: policies

(Следующие атрибуты принадлежат cn=default, ou=policies, но по некоторым причинам они не появляются, если я не пишу что-то здесь),

pwdInHistory: 3
pwdLockout: TRUE
pwdMaxFailure: 3
pwdLockoutDuration: 30
pwdMustChange: TRUE
pwdSafeModify: FALSE
pwdAllowUserChange: TRUE
pwdFailureCountInterval: 0
pwdGraceAuthNLimit: 0

И это - конфигурация моего бэкенда и политик паролей:

# {1}hdb, config
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=domain,dc=com
olcAccess: {0}to attrs=userPassword by self write by * auth
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to attrs=userPKCS12 by self read by * none
olcAccess: {3}to * by * read
olcRootDN: cn=admin,dc=domain,dc=com
olcRootPW: {SSHA}############## omited
olcDbCacheSize: 10000
olcDbCheckpoint: 1024 5
olcDbConfig: {0}set_cachesize 0 15000000 1
olcDbConfig: {1}set_lg_regionmax 262144
olcDbConfig: {2}set_lg_bsize 2097152
olcDbConfig: {3}set_flags DB_LOG_AUTOREMOVE
olcDbConfig: {4}set_lk_max_locks 30000
olcDbConfig: {5}set_lk_max_objects 30000
olcDbIDLcacheSize: 30000
olcDbIndex: objectclass eq
[...more indexes...]

# {0}ppolicy, {1}hdb, config
dn: olcOverlay={0}ppolicy,olcDatabase={1}hdb,cn=config
objectClass: top
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: {0}ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=domain,dc=com
olcPPolicyHashCleartext: TRUE

(Следующие два атрибута принадлежат также {0} политика),

olcPPolicyUseLockout: FALSE 
olcPPolicyForwardUpdates: FALSE

Я надеюсь, что кто-то может пролить некоторый свет на это. Любая справка чрезвычайно appreaciated!

С уважением

Править:

Я сделал некоторые модификации к политике по умолчанию для получения сведения о том, что препятствовало аутентификации пользователя. Я понял это если pwdMustChange имеет значение true и pwdReset также установлен на TRUE (этот на пользовательской записи), затем сбои аутентификации пользователя с ошибкой 'su: Ошибка аутентификации'. Однако, если pwdReset TRUE и pwdMustChange ЛОЖЬ, затем я вхожу в систему так много раз, как я хочу с тем пользователем. Я думаю, что наличие двух varibles для этого бесполезно и парадоксально. Вместо этого единственная переменная должна использоваться на записи пользователя только, независимо от того, что Вы хотите назвать ее также pwdReset или pwdMustChange.

0
задан 5 March 2015 в 14:19
1 ответ

Политики на сервере LDAP не обязательно приравниваются к политикам в ОС. Кажется, вы представляете структуру, в которой вы устанавливаете это свойство overflay, и ОС узнает о необходимости смены пароля, но, как вы можете видеть, это работает не так.

Чтобы вызвать запрос в операционной системе модуль учета (обычно PAM) должен заметить это условие. Наложение политики паролей OpenLDAP не является стандартом POSIX. В отличие от того, что происходит, когда вы настраиваете свойства shadow пользователя для установки политики, pam_unix не знает этих атрибутов, которые вы устанавливаете. Чего нельзя сказать о самом сервере OpenLDAP. Это приводит к блокировке пользователя, поскольку пользователь не может пройти аутентификацию на сервере Linux и ему не хватает информации о LDAP (как вы сами заметили) для работы напрямую с сервером LDAP для изменения пароля.

Если вы хотите запустить триггер. запросы смены пароля в ОС, это не подходящий инструмент для работы. Я лично рекомендую вам ознакомиться с соответствующими атрибутами shadow , сохранить их в LDAP, если ими нужно централизованно управлять, и использовать их для запуска желаемого поведения.

pam_unix (8) man-страница:

Компонент учетной записи выполняет задачу по установлению статуса учетной записи и пароля пользователя на основе следующих теневых элементов: expire, last_change, max_change, min_change, warn_change. В последнем случае он может предложить пользователю совет по изменению пароля или, посредством возврата PAM_AUTHTOKEN_REQD, отложить предоставление услуги пользователю до тех пор, пока он не установит новый пароль. Перечисленные выше записи задокументированы на странице руководства shadow (5). Если запись пользователя не содержит одну или несколько из этих записей, соответствующая теневая проверка не выполняется.

0
ответ дан 5 December 2019 в 12:56

Теги

Похожие вопросы