Я просмотрел множество веб-сайтов и учебных пособий, но не смог найти ответа на свою проблему.
Я установил OpenLDAP 2.4 на машине OpenSUSE 12.3 с наложением политики паролей. Клиент - это машина Linux Mint 17.1 с установленными пакетами libnss-ldap и libpam-ldap. Клиент и сервер настроены на использование TLS с самозаверяющими сертификатами (сервер работает как центр сертификации и подписывает свой собственный сертификат). Все работает нормально, пока я не добавлю атрибут pwdReset: TRUE
пользователю.
Мое намерение - заставить пользователя изменить свой пароль при следующем входе в систему. Однако после установки этого атрибута пользователь больше не может аутентифицироваться: если я попытаюсь «su» (или войти с помощью) пользователя, я получаю сообщение об ошибке «Authentication Failure». Также в системном журнале отображаются следующие сообщения:
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
Эти сообщения говорят мне, что учетные данные пользователя больше не действительны, что разумно, поскольку я сбрасываю его пароль, но пользователя не спрашивают о необходимости изменить его пароль или что-то еще. Кроме того, я хочу предотвратить использование таких утилит openldap, как ldappasswd, поскольку клиенты не являются экспертами. Поэтому я хочу, чтобы они продолжали использовать типичную команду passwd для изменения собственных паролей. По крайней мере, это возможно, если не установлен pwdReset. Кроме того, я могу добиться такого поведения, установив shadowLastChange
значение 0, но я хотел бы делать все с политиками паролей, так как я также пытаюсь принудительно использовать пароли не менее 8 символов. Кстати, эта функция работает отлично.
Это отрывок из моего базового DN, чтобы вы могли проверить, не упускаю ли я чего-то. Обратите внимание, что pwdReset
для пользователя установлено значение ИСТИНА и pwdMustChange
в самой политике для переменной установлено значение ИСТИНА.
# 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 = policy, но по какой-то причине они не отображаются, если я что-то не напишу здесь)
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} ppolicy)
olcPPolicyUseLockout: FALSE
olcPPolicyForwardUpdates: FALSE
Я надеюсь, что кто-то сможет пролить свет на это. Любая помощь чрезвычайно приветствуется!
С уважением
Редактировать:
Я внес некоторые изменения в политику по умолчанию, чтобы понять, что мешает аутентификации пользователя. Я понял, что если pwdMustChange
установлен на ИСТИНА и pwdReset
также установлено значение TRUE (это значение для записи пользователя), то аутентификация пользователя завершается ошибкой su: Authentication failure. Однако если pwdReset
ИСТИНА и pwdMustChange
ЛОЖЬ, то я вхожу в систему столько раз, сколько хочу, с этим пользователем. Я думаю, что наличие двух вариантов для этого бесполезно и противоречит здравому смыслу. Вместо этого одна переменная должна использоваться только для ввода пользователя, как бы вы ни называли ее pwdReset
или pwdMustChange
.
Политики на сервере LDAP не обязательно приравниваются к политикам в ОС. Кажется, вы представляете структуру, в которой вы устанавливаете это свойство overflay и Операционные системы осознает необходимость смены пароля, но, как видите, это работает не так.
Чтобы вызвать запрос в операционной системе, модуль учета (обычно PAM) должен заметить это условие. Наложение политики паролей OpenLDAP не является стандартом POSIX. В отличие от того, что происходит, когда вы настраиваете shadow
свойства пользователя для установки политики, pam_unix
не осознает эти атрибуты, которые вы устанавливаете. Чего нельзя сказать о самом сервере OpenLDAP. Это приводит к блокировке пользователя, поскольку пользователь не может пройти аутентификацию на сервере Linux и не имеет достаточной информации о LDAP (как вы сами заметили) для работы напрямую с сервером LDAP для изменения своего пароля.
Если вы хотите запускать запросы на смену пароля в ОС, этот инструмент не подходит для работы. Я лично рекомендую вам ознакомиться с соответствующими shadow
атрибуты, храните их в LDAP, если ими нужно централизованно управлять, и используйте их для запуска желаемого поведения.
Из pam_unix(8)
страница руководства:
Компонент учетной записи выполняет задачу по установлению статуса учетной записи и пароля пользователя на основе следующих теневых элементов: expire, last_change, max_change, min_change, warn_change. В последнем случае он может предложить пользователю совет по изменению пароля или, посредством возврата PAM_AUTHTOKEN_REQD, отложить предоставление услуги пользователю до тех пор, пока он не установит новый пароль. Перечисленные выше записи задокументированы на странице руководства shadow (5). Если запись пользователя не содержит одну или несколько из этих записей, соответствующая теневая проверка не выполняется.