OpenLDAP 2.4 上的 smbk5pwd 覆盖

OpenLDAP 2.4 上的 smbk5pwd 覆盖

我有一个 OpenLDAP 服务器,我想配置smbk5pwd覆盖以使 OpenLDAP在 发生更改时自动更新sambaNTPassword和属性。版本:sambaLMPassworduserPassword

slapd           2.4.23-7.3
slapd-smbk5pwd  2.4.23-7.3

模块

dn: cn=module{1},cn=config
objectClass: olcModuleList
cn: module{1}
olcModuleLoad: smbk5pwd
olcModulePath: /usr/lib/ldap

模块已加载且没有错误。如果我尝试添加覆盖,则会发生以下情况:

#!RESULT ERROR
#!CONNECTION ldap://192.168.10.145:389
#!DATE 2014-03-07T09:55:49.078
#!ERROR [LDAP: error code 80 - <olcSmbK5PwdEnable> handler exited with 1]
dn: olcOverlay=smbk5pwd,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcSmbK5PwdConfig
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: smbk5pwd
olcSmbK5PwdEnable: samba

LDAP 日志

smbk5pwd: unable to find "krb5KDCEntry" objectClass.
olcSmbK5PwdEnable: value #0: <olcSmbK5PwdEnable> handler exited with 1!

我已经包含了以下模式:

cn={0}core.ldif
cn={1}cosine.ldif
cn={2}nis.ldif
cn={3}inetorgperson.ldif
cn={4}mozillaorgperson.ldif
cn={5}evolutionperson.ldif
cn={6}qmailuser.ldif
cn={7}samba.ldif

我遗漏了什么?我是否必须加载另一个模块或架构?

编辑-krb5-kdc.schema之前发现并包含samba.schema

对于那些同样难以找到它的人来说,它在这里:

# $Id: krb5-kdc.schema,v 1.1 2004-03-22 17:25:05 quanah Exp $
# Definitions for a Kerberos V KDC schema

# OID Base is iso(1) org(3) dod(6) internet(1) private(4) enterprise(1) padl(5322) kdcSchema(10)
#
# Syntaxes are under 1.3.6.1.4.1.5322.10.0
# Attributes types are under 1.3.6.1.4.1.5322.10.1
# Object classes are under 1.3.6.1.4.1.5322.10.2

# Syntax definitions

#krb5KDCFlagsSyntax SYNTAX ::= {
#   WITH SYNTAX            INTEGER
#--        initial(0),             -- require as-req
#--        forwardable(1),         -- may issue forwardable
#--        proxiable(2),           -- may issue proxiable
#--        renewable(3),           -- may issue renewable
#--        postdate(4),            -- may issue postdatable
#--        server(5),              -- may be server
#--        client(6),              -- may be client
#--        invalid(7),             -- entry is invalid
#--        require-preauth(8),     -- must use preauth
#--        change-pw(9),           -- change password service
#--        require-hwauth(10),     -- must use hwauth
#--        ok-as-delegate(11),     -- as in TicketFlags
#--        user-to-user(12),       -- may use user-to-user auth
#--        immutable(13)           -- may not be deleted         
#   ID                     { 1.3.6.1.4.1.5322.10.0.1 }
#}

#krb5PrincipalNameSyntax SYNTAX ::= {
#   WITH SYNTAX            OCTET STRING
#-- String representations of distinguished names as per RFC1510
#   ID                     { 1.3.6.1.4.1.5322.10.0.2 }
#}

# Attribute type definitions

attributetype ( 1.3.6.1.4.1.5322.10.1.1
    NAME 'krb5PrincipalName'
    DESC 'The unparsed Kerberos principal name'
    EQUALITY caseExactIA5Match
    SINGLE-VALUE
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

attributetype ( 1.3.6.1.4.1.5322.10.1.2
    NAME 'krb5KeyVersionNumber'
    EQUALITY integerMatch
    SINGLE-VALUE
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.5322.10.1.3
    NAME 'krb5MaxLife'
    EQUALITY integerMatch
    SINGLE-VALUE
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.5322.10.1.4
    NAME 'krb5MaxRenew'
    EQUALITY integerMatch
    SINGLE-VALUE
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.5322.10.1.5
    NAME 'krb5KDCFlags'
    EQUALITY integerMatch
    SINGLE-VALUE
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.5322.10.1.6
    NAME 'krb5EncryptionType'
    EQUALITY integerMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )

attributetype ( 1.3.6.1.4.1.5322.10.1.7
    NAME 'krb5ValidStart'
    EQUALITY generalizedTimeMatch
    ORDERING generalizedTimeOrderingMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
    SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.5322.10.1.8
    NAME 'krb5ValidEnd'
    EQUALITY generalizedTimeMatch
    ORDERING generalizedTimeOrderingMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
    SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.5322.10.1.9
    NAME 'krb5PasswordEnd'
    EQUALITY generalizedTimeMatch
    ORDERING generalizedTimeOrderingMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
    SINGLE-VALUE )

# this is temporary; keys will eventually
# be child entries or compound attributes.
attributetype ( 1.3.6.1.4.1.5322.10.1.10
    NAME 'krb5Key'
    DESC 'Encoded ASN1 Key as an octet string'
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 )

attributetype ( 1.3.6.1.4.1.5322.10.1.11
    NAME 'krb5PrincipalRealm'
    DESC 'Distinguished name of krb5Realm entry'
    SUP distinguishedName )

attributetype ( 1.3.6.1.4.1.5322.10.1.12
    NAME 'krb5RealmName'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} )

# Object class definitions

objectclass ( 1.3.6.1.4.1.5322.10.2.1
    NAME 'krb5Principal'
    SUP top
    AUXILIARY
    MUST ( krb5PrincipalName )
    MAY ( cn $ krb5PrincipalRealm ) )

objectclass ( 1.3.6.1.4.1.5322.10.2.2
    NAME 'krb5KDCEntry'
    SUP krb5Principal
    AUXILIARY
    MUST ( krb5KeyVersionNumber )
    MAY ( krb5ValidStart $ krb5ValidEnd $ krb5PasswordEnd $
          krb5MaxLife $ krb5MaxRenew $ krb5KDCFlags $
          krb5EncryptionType $ krb5Key ) )

objectclass ( 1.3.6.1.4.1.5322.10.2.3
    NAME 'krb5Realm'
    SUP top
    AUXILIARY
    MUST ( krb5RealmName ) )

slaptest运行成功,我能够添加覆盖,但如果我更改userPassword,其他属性则不会受到影响。userPassword属性包含 SHA1 哈希。

答案1

必须使用RFC 3062密码修改扩展操作。请参阅README在源发行版中(据我所知,没有手册页)。您可以使用 OpenLDAP 的命令行执行此操作(它与仅以各种方式散列密码值ldappasswd不同)。slappasswd

userPassword随着时间的推移,它已经发展出了一些特殊的语义,这些语义都不是有意为之的(并且不严格遵守规范)。它通常只具有“仅比较”(仅进行身份验证)访问权限或没有读取访问权限,并且具有依赖于客户端或服务器的转换(例如,客户端或服务器端的内容哈希处理)。Password Modify 定义明确,只接受纯文本密码,并且可以使用管理员定义的哈希方法。此扩展为密码提供了一个抽象层(并且还允许将密码存储与目录完全分离)。它还需要密码复杂性强制执行,如果允许客户端将预哈希值直接写入,则无法做到这一点userPassword

例如(perl):http://search.cpan.org/~gbarr/perl-ldap/lib/Net/LDAP/Extension/SetPassword.pm

您可以通过查询根 DSE(dn“”)来确认支持,例如

$ ldapsearch -H ldaps://myldap/ [ -D user -w password ] \
 -s base -b "" "(objectclass=*)" supportedExtension 
[...]
dn:
supportedExtension: 1.3.6.1.4.1.1466.20037    # STARTTLS
supportedExtension: 1.3.6.1.4.1.4203.1.11.1   # password modify
supportedExtension: 1.3.6.1.4.1.4203.1.11.3   # who am i
supportedExtension: 1.3.6.1.1.8               # cancel request

答案2

由于现有的答案似乎 a) 缺乏细节或 b) 提倡不再需要的无意义的架构添加,我写了一篇文章,以简单的术语解释了如何启用 smbk5pwd这里

原始问题描述配置实际上缺少的是模块配置,而不是 krb5-kdc 架构。同步 Samba 密码不需要 Kerberos 架构。

简洁版本:

创建 smbk5pwd-overlay.ldif

dn: olcOverlay={0}smbk5pwd,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSmbK5PwdConfig
olcOverlay: {0}smbk5pwd
olcSmbK5PwdEnable: samba
olcSmbK5PwdMustChange: 0

并申请

sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f smbk5pwd-overlay.ldif

olcSmbK5PwdMustChange是密码的有效期(以秒为单位),例如5184000两个月,或31968000每年更改一次,并有五天的宽限期。0表示永不过期。

相关内容