通常查询 OpenLDAP 服务器我使用以下查询
ldapsearch -x -H ldap://host -b dc=domain,dc=com uidNumber=4158
但最近我看到了另一种查询方式
ldapsearch -x -H ldap://host -b o=domain.com uidNumber=4158
什么是“o=”格式,我应该如何配置我的 LDAP 服务器来使用它?
谢谢!
通常查询 OpenLDAP 服务器我使用以下查询
ldapsearch -x -H ldap://host -b dc=domain,dc=com uidNumber=4158
但最近我看到了另一种查询方式
ldapsearch -x -H ldap://host -b o=domain.com uidNumber=4158
什么是“o=”格式,我应该如何配置我的 LDAP 服务器来使用它?
谢谢!
我在 Fedora 上并设置了 OpenLDAP 服务器。我不记得一开始就设置过管理员密码,但我必须在提示输入管理员密码的地方执行操作。不输入任何内容是行不通的。我对这个问题进行了广泛的搜索,并尝试了以下方法:
$ ldapmodify -Q -Y EXTERNAL -H ldapi:/// << E0F
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}wDiv2teFapZFmOwSz04/2CMaYvpqfLvi
E0F
modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Insufficient access (50)
$ sudo -i
[sudo] password for User:
[root@localhost ~]# ldapmodify -Q -Y EXTERNAL -H ldapi:/// << E0F
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}wDiv2teFapZFmOwSz04/2CMaYvpqfLvi
E0F
modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Insufficient access (50)
$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcRootDN=cn=admin,dc=com,dc=example dn olcRootDN olcRootPW
SASL/EXTERNAL authentication started
SASL username: gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth
SASL SSF: 0
No such object (32)
$ sudo ldapsearch -H ldapi:/// -Y EXTERNAL -b 'cn=config'
[sudo] password for User:
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=config
> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
$ sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// << E0F
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}wDiv2teFapZFmOwSz04/2CMaYvpqfLvi
E0F
modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Insufficient access (50)
我还将以上内容放入一个文件中并尝试这样做:
$ vim pw_reset.ldif
$ sudo ldapmodify -Y EXTERNAL -D 'cn=config' -H ldapi:/// -f ./pw_reset.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}mdb,cn=config"
ldap_modify: Insufficient access (50)
因此,这里明显的问题是,无论如何,我似乎没有“足够的访问权限”,这就是这里的问题。我需要管理员密码来设置管理员密码。正确的方法是什么?
我已经在 Jboss 实例中配置了 ldap,但是它没有连接到 ldap 服务器并抛出以下错误。
02:50:08,512 DEBUG [org.wildfly.security] (management task-1) Obtaining lock for identity [user1]...
02:50:08,513 DEBUG [org.wildfly.security] (management task-1) Obtained lock for identity [user1].
02:50:08,517 DEBUG [org.wildfly.security] (management task-1) Creating [class javax.naming.directory.InitialDirContext] with environment:
02:50:08,517 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.security.credentials] with value [******]
02:50:08,517 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.security.authentication] with value [simple]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.provider.url] with value [ldap://ldap_server:3268]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [com.sun.jndi.ldap.read.timeout] with value [60000]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [com.sun.jndi.ldap.connect.pool] with value [false]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [com.sun.jndi.ldap.connect.timeout] with value [5000]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.security.principal] with value [CN=svc_account,OU=IT,DC=local,DC=xxx,DC=xxx]
02:50:08,518 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.referral] with value [ignore]
02:50:08,519 DEBUG [org.wildfly.security] (management task-1) Property [java.naming.factory.initial] with value [com.sun.jndi.ldap.LdapCtxFactory]
02:50:08,536 DEBUG [org.wildfly.security] (management task-1) Could not create [class javax.naming.ldap.InitialLdapContext]. Failed to connect to LDAP server.: javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090449, comment: AcceptSecurityContext error, data 52e, v3839]
我目前正在将 slapd 设置为代理,并面临重写 LDAP 属性的挑战。我知道 DN 的重写模块 (rwm) 功能,但我需要将类似的功能应用于 LDAP 属性。
上下文:我们的用户 ID 的结构是由一两个非必要字母组成的前缀,后跟 8-9 个重要数字。我的目标是去掉这些字母并利用剩余的数字通过 nslcd/sssd 分配 POSIX 用户/组 ID。不幸的是,无法对原始 LDAP 服务器进行修改,因为管理员不愿意进行更改。
问题:尽管进行了几天的研究和试验,包括咨询资源和使用 ChatGPT,我只成功地重写了 DN。我希望了解是否可以对 DN 以外的属性使用重写功能,如果可以,如何实现这一点。
尝试:
我尝试过使用数据库映射和 LDAP 以及 rwm 覆盖来操作属性。我的配置仅成功重写了 DN,但未成功重写其他属性。
最后一次尝试的示例:
...
moduleload back_ldap
moduleload back_meta
database meta
...
rebind-as-user true
rewriteEngine on
rewriteContext searchResult
rewriteRule "^(uid=[a-zA-Z]*)([0-9]*)(,.*)$" "$1$2$3,posixUID=$2" ":@"
问题:
任何指导或示例将不胜感激。谢谢你!
我的部门正在改用 sssd 和 ldap 来登录我们所有的 Linux 主机。我已经一切正常,但在我们的开发环境中继续测试之前,我希望解决一个问题。我们指定可以使用 ldap_access_filter 选项登录的 ldap 组,并且按预期工作,但具有 root 访问权限的用户似乎可以切换到 ldap 用户(使用 root 权限),而应阻止使用 ldap_access_filter 选项登录。 ldap_access_filter。我希望能够不允许用户切换或通过 id 命令获取信息给这些不需要访问我所关心的机器的用户。是否可以通过修改我的 ldap_search_base、ldap_user_search_base 或 ldap_group_search_base 或者其他方法来防止这种情况发生。
这是我的 sssd 配置
[sssd]
#debug_level = 9
config_file_version = 2
services = nss, pam
domains = domain.edu
[pam]
#debug_level = 9
offline_credentials_expiration = 30
[domain/domain.edu]
#debug_level = 9
id_provider = ldap
auth_provider = ldap
access_provider = ldap
ldap_schema = rfc2307bis
ldap_uri = ldaps://sub.domain.edu:636
ldap_search_base = ou=people,o=cuid
ldap_default_bind_dn = cn=svcaccount,ou=proxy,o=cuid
ldap_access_order = filter
ldap_access_filter = groupMembership=cn=devtest,ou=groups,ou=people,o=cuid
ldap_default_authtok_type = obfuscated_password
ldap_default_authtok = [redacted]
ldap_tls_cacert = /etc/openldap/certs/devldap.pem
ldap_tls_reqcert = never
enumerate = true
cache_credentials = True
account_cache_expiration = 30
entry_cache_timeout = 14400
subdomain_inherit = ignore_group_members, ldap_purge_cache_timeout
ignore_group_members = True
ldap_purge_cache_timeout = 0
access_provider = ldap
我已经设置了 Samba4 AD DC,并且可以Administrator
通过 .net 代码成功地对我的用户进行身份验证:
var directoryIdentifier = new LdapDirectoryIdentifier("127.0.0.1", 636);
var credentials = new NetworkCredential($"CN=Administrator,CN=Users,DC=ldap,DC=test,DC=dev", "admin1234!");
using(var connection = new LdapConnection(directoryIdentifier, credentials))
{
try
{
connection.SessionOptions.ProtocolVersion = 3;
connection.SessionOptions.SecureSocketLayer = true;
connection.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
connection.AuthType = AuthType.Basic;
connection.Bind(credentials);
}
}
然后通过此连接,我创建一个新用户:
var addRequest = new AddRequest(
"CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev",
new DirectoryAttribute("objectClass", new object[] { "user" }),
new DirectoryAttribute("cn", "testuser"),
new DirectoryAttribute("uid", "testuser"),
new DirectoryAttribute("sAMAccountName", "testuser"),
new DirectoryAttribute("unicodePwd", Encoding.Unicode.GetBytes($@"""pw1234!"""))
);
var addResponse = connection.SendRequest(addRequest);
Console.WriteLine($"[ADD] response: {addResponse.ErrorMessage}");
或从终端执行相同操作:
ldapadd -H LDAPS://127.0.0.1:636 -D "CN=Administrator,CN=Users,DC=ldap,DC=test,DC=dev" -w admin1234!
dn: CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev
objectClass: user
cn: testuser
uid: testuser
unicodePwd:: IgBwAHcAMQAyADMANAAhACIA
sAMAccountName: testUser
我从哪里得到 unicodePwd echo -n "\"pw1234\!\"" | iconv -f UTF-8 -t UTF-16LE | base64
。
但是,当尝试对此用户进行身份验证时:
var testUser_directoryIdentifier = new LdapDirectoryIdentifier("127.0.0.1", 636);
var testUser_credentials = new NetworkCredential($"CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev", "pw1234!");
using(var connection = new LdapConnection(testUser_directoryIdentifier, testUser_credentials))
{
try
{
connection.SessionOptions.ProtocolVersion = 3;
connection.SessionOptions.SecureSocketLayer = true;
connection.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
connection.AuthType = AuthType.Basic;
connection.Bind(testUser_credentials);
}
}
我收到错误:
提供的凭据无效。[错误代码 49]
同样,对于终端命令
ldapwhoami -vvv -H ldaps://127.0.0.1:636 -D "CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev" -x -w pw1234\!
我明白了
ldap_bind:凭据无效(49)附加信息:80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext错误,数据533,v1db1
在 samba AD DC 上执行时ldbsearch -H /var/lib/samba/private/sam.ldb '(cn=testuser)' unicodePwd
,我得到以下结果:
# record 1
dn: CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev
unicodePwd:: 0pQq91kmGPJQOuQ3oiHPgg==
[...]
(附带问题,0pQq91kmGPJQOuQ3oiHPgg==
不等于我传入的内容,IgBwAHcAMQAyADMANAAhACIA
不知道为什么。不过似乎无关。)
但是,当我使用该smbpasswd
工具并设置相同的密码时,它似乎有效:
smbpasswd testuser
我可以通过再次执行ldbsearch -H /var/lib/samba/private/sam.ldb '(cn=testuser)' unicodePwd
并接收回相同的记录来确认这一点。
这次,相同的 bash 脚本起作用了:
ldapwhoami -vvv -H ldaps://127.0.0.1:636 -D "CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev" -x -w pw1234\!
ldap_initialize( ldaps://127.0.0.1:636/??base )
u:DEV-AD\testUser
Result: Success (0)
为什么简单的 LDAP 消息不起作用(完全符合unicodePwd
Active Directory 的规范)?ldapsearch -D -w
smbpasswd 是否也会更新通过或 .net进行身份验证时使用的其他内容LdapConnection
?
我试图在 OpenLDAP 服务器启动开始时执行自定义 .ldif 文件,并使用以下命令成功:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
遗憾的是,我希望能够使用以下命令将自定义属性和对象类添加到架构中:
dn: cn=schema,cn=config
changetype: modify
add: olcObjectClasses
olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass'
DESC 'My Custom Object Class'
AUXILIARY
MAY ( customAttribute1 $ customAttribute2 $ customAttribute3 $
customAttribute4 $ customAttribute5 $ customAttribute6 $
customAttribute7 $ customAttribute8 $ customAttribute9 $
customAttribute10 $ customAttribute11 $ customAttribute12 $
customAttribute13 $ customAttribute14 $ customAttribute15 ) )
遗憾的是,它抛出了访问不足 50 错误。这是 slapcat -n0 的输出
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcRootDN: cn=admin,cn=config
structuralObjectClass: olcDatabaseConfig
entryUUID: 3e49b716-55fd-103e-8582-a14a85261557
creatorsName: cn=config
createTimestamp: 20240202095739Z
olcRootPW:: e1NTSEF9d3J4NGVYaUFvaGRmc2dDOXlqT0V0cEFmSWhZYklxWXo=
entryCSN: 20240202095739.321947Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
dn: olcDatabase={1}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {1}mdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=vlad,dc=lan
olcLastMod: TRUE
olcRootDN: cn=admin,dc=vlad,dc=lan
olcRootPW:: -----
olcDbCheckpoint: 512 30
olcDbMaxSize: 1073741824
structuralObjectClass: olcMdbConfig
entryUUID: 3e49fae6-55fd-103e-8589-a14a85261557
creatorsName: cn=admin,cn=config
createTimestamp: 20240202095739Z
olcDbIndex: uid eq
olcDbIndex: mail eq
olcDbIndex: memberOf eq
olcDbIndex: entryCSN eq
olcDbIndex: entryUUID eq
olcDbIndex: objectClass eq
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth manage by * break
olcAccess: {1}to attrs=userPassword,shadowLastChange by self write by dn="cn
=admin,dc=vlad,dc=lan" write by anonymous auth by * none
olcAccess: {2}to * by self read by dn="cn=admin,dc=vlad,dc=lan" wri
te by dn="cn=user-ro,dc=vlad,dc=lan" read by * none
entryCSN: 20240202095739.438344Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20240202095739Z
如何才能使用 ldapadd 或 ldapmodify 运行上述命令?需要什么用户进行身份验证。
更新:
dn: cn=schema,cn=config changetype: modify add: olcObjectClasses olcObjectClasses: ( 1.2.3.4.5.6.7.8.9.0 NAME 'myCustomObjectClass' DESC 'My Custom Object Class' AUXILIARY MAY ( name ) )
将上面的代码与命令一起使用: ldapmodify -Y EXTERNAL -H ldapi:// -f ldap/ldap-modify.ldif
一切似乎都很好,应该添加。
尝试使用该类:
dn: OU=CustomOU,DC=vlad,DC=lan
ou: CustomOU
objectClass: top
objectClass: organizationalUnit
objectClass: myCustomObjectClass
通过命令,它说:
ldapadd -x -D cn=admin,dc=vlad,dc=lan -w admin -H ldap:// -f ldap/ldap-test.ldif
additional info: objectClass: value #2 invalid per syntax
并且在检查 slapcat -n0 时,似乎没有添加自定义对象。
我正在设置 LDAP(LLDAP,用于同一登录),并且我了解每个目录都需要一个基本 DN。据我所知,基本 DN 的工作原理就像一个包含该目录所有条目的命名空间。看来,更改正在运行的 LDAP 设置的基本 DN 可能并不简单。
那么我应该如何选择Base DN呢?它是完全任意的还是在某个时候会出现某些要求?
它应该是我拥有的域还是保留/私有 DNS 命名空间?它应该有两个直流分量吗?
到目前为止我发现的一个要求是,对于某些应用程序,基本 DN 可能不为空。
我有一个 Postfix/Dovecot 设置并使用 OpenLDAP 作为用户/密码后端。由于虚拟主机,用户必须使用完全合格的电子邮件地址作为用户名登录,因此域部分对于身份验证是必需的,即用户名类似于<local-part>@<fqdn-domain>
.
然而,不断有攻击尝试使用不带域部分的用户名进行身份验证。由于这会导致 LDAP 查询中的 DN 无效,因此我的日志中会出现大量由于 LDAP DN 无效而导致的错误消息。
是否有任何配置选项允许 Dovecot 对提供的用户名强制执行一些初始语法检查,如果失败,Dovecot 通过立即拒绝响应来缩短身份验证过程,而不是查询 LDAP 服务器然后失败?
Dovecot 中的 LDAP 配置是
uris = ldapi://%2frun%2fopenldap%2fslapd.sock
auth_bind = yes
auth_bind_userdn = uid=%n,ou=users,o=%d,dc=my-host,dc=my-domain,dc=my-tld
base = ou=users,o=%d,dc=server,dc=my-host,dc=my-domain,dc=my-tld
正如您所看到的,我的 LDAP 设置使用所谓的“连接点”在 DIT 中为不同的托管域提供不同的子分支。(o=%d
DN 中的 - 部分。)根据Dovecot 配置手册 - 用户变量,%d
如果用户名后面没有域部分,则为空@
。
当攻击者尝试使用不完整的用户名进行身份验证时,这会导致我的日志中出现多余的错误消息,例如
Dec 26 16:25:54 server dovecot[24946]: auth: Error: ldap(root,187.205.80.184): ldap_bind() failed: Invalid DN syntax
这里,来自 187.205.80.184 的攻击者尝试以用户身份进行身份验证root
,Dovecot 尝试查找uid=root,ou=users,o=,dc=my-host,dc=my-domain,dc=my-tld
这显然是无效的,因为 后没有任何内容o=
。
我正在使用 OpenLDAP 2.6。当我通过设置对象的密码时
ldappasswd -x -D <dn of root user> -W -S <dn of object whose pwd shall be set>
然后密码的一些哈希值最终出现在属性中userPassword
。
使用什么哈希函数ldappasswd
?如何配置哈希函数?从它的外观来看,我认为它默认为不再安全的 SHA1。