前言
最近生产环境中,被安全团队扫描到了 LDAP服务存在未授权访问漏洞。这里记录下如何解决。
问题原因
未对LDAP的访问进行密码验证,导致未授权访问。因为默认的LDAP服务都是开启匿名访问的,
这一般是大部分LDAP服务出现此漏洞的主要原因,导致可以使用ldapbrowser
直接连接,获取目录内容。
例如:
ldapsearch -x -b "dc=hadoop,dc=com" -H ldap://10.4.3.3:389| grep test
这里我们直接就能访问到ldap的资源。
解决方案
- 修改
cn=config.ldif
文件
vim /etc/openldap/slapd.d/cn=config.ldif
#插入如下内容:
olcDisallows: bind_anon
olcRequires: authc
- 修改
olcDatabase={-1}frontend.ldif
文件
vim /etc/openldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif
#插入如下内容:
olcRequires: authc
3. .重启服务
systemctl restart slapd
#查看任务状态
systemctl restart slapd
- 验证是否成功
ldapsearch -x -b "dc=hadoop,dc=com" -H ldap://10.4.3.3:389| grep test
此时会报错,additional info: anonymous bind disallowed
。
SSSD
当我们禁止匿名用户访问LDAP 服务后,SSSD 服务可能会无法正常访问 LDAP 服务并拉取缓存数据到本地。sssd 缓存数据目录在 /var/lib/sssd/db
。
当我们执行 getent passwd
里面无法过过滤到 LDAP 的用户。
解决方案:
- 修改 SSSD 配置文件:检查
/etc/sssd/sssd.conf
文件,确保在[domain/LDAP]
部分中设置了正确的凭据,例如:
[domain/LDAP]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://ldap.example.com
ldap_search_base = dc=example,dc=com
ldap_tls_reqcert = never
ldap_default_bind_dn = cn=admin,dc=example,dc=com
ldap_default_authtok_type=password
ldap_default_authtok = admin_password
在这个示例中,ldap_default_bind_dn 指定了连接 LDAP 服务器的账号,ldap_default_authtok 指定了该账号的密码。请将这些值替换为你实际的 LDAP 管理账号和密码。
- 重启 sssd 服务
systemctl restart sssd
- 查看用户
getent passwd
扩展
那么我们该如何访问禁止匿名用户访问的ldap 呢?
答案是使用:-D
+ -W
参数来进行访问
例如:
ldapsearch -x -D "your_username" -W -b "search_base" "(search_filter)"
- -D :指定绑定的分发名称(你的用户名)
- -W:提示输入密码
- -b :指定搜索基础,“(search_filter)” 指定搜索条件
那么我该怎么正确填写 -D
参数:
举例来说,如果你有一个LDAP用户"John",它的DN可能是类似于 "cn=John,ou=users,dc=example,dc=com"
的形式。你需要将这个DN或者类似的用户标识填入到"-D"参数中。
例如:
ldapsearch -x -D "cn=John,ou=users,dc=example,dc=com" -W -b "search_base" "(search_filter)"