
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Another LDAP Authentication 是为 Nginx、Nginx Ingress Controller(Kubernetes)、HAProxy(通过 https://github.com/TimWolla/haproxy-auth-request%EF%BC%89%E6%88%96%E4%BB%BB%E4%BD%95%E5%9F%BA%E4%BA%8E%E5%AD%90%E8%AF%B7%E6%B1%82%E7%BB%93%E6%9E%9C%E8%BF%9B%E8%A1%8C%E6%8E%88%E6%9D%83%E7%9A%84Web%E6%9C%8D%E5%8A%A1%E5%99%A8/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E6%8F%90%E4%BE%9B%E7%9A%84 LDAP认证 解决方案。
该项目实现了Nginx官方博客 这篇文章 中描述的 ldap-auth-daemon 服务,可在Docker容器中运行,也可直接运行Python脚本。
 中的 {username} 会被登录表单中的用户名替换。
LDAP_BIND_DN 参数支持用户名变量扩展,例如 {username}@TESTMYLDAP.com 或 UID={username},OU=PEOPLE,DC=TESTMYLDAP,DC=COM 中的 {username} 会被登录表单中的用户名替换。
所有参数值类型均为 string。
| 键 | 默认值 | 取值范围 | 描述 | 示例 |
|---|---|---|---|---|
| LDAP_ENDPOINT | 包含协议和端口的LDAP URL | ldaps://testmyldap.com:636 | ||
| LDAP_MANAGER_DN_USERNAME | 用于绑定和搜索LDAP树的用户名 | CN=john,OU=Administrators,DC=TESTMYLDAP,DC=COM | ||
| LDAP_MANAGER_PASSWORD | 绑定用户的密码 | |||
| LDAP_SEARCH_BASE | LDAP搜索基准 | DC=TESTMYLDAP,DC=COM | ||
| LDAP_SEARCH_FILTER | 搜索过滤器,对于Microsoft Active Directory通常使用sAMAccountName | (sAMAccountName={username}) | ||
| LDAP_BIND_DN | {username} | 取决于LDAP服务器的绑定结构,支持用户名变量扩展 | {username}@TESTMYLDAP.com 或 UID={username},OU=PEOPLE,DC=TESTMYLDAP,DC=COM | |
| LDAP_ALLOWED_USERS (可选) | 允许的用户列表,逗号分隔 | 'diego,john,s-master' | ||
| LDAP_ALLOWED_GROUPS (可选) | 允许的组列表,支持正则表达式,逗号分隔 | 'DevOps production environment', 'Developers .* environment' | ||
| LDAP_ALLOWED_GROUPS_CONDITIONAL | and | and, or | 组匹配条件:匹配列表中所有组(and)或至少一个组(or) | or |
| LDAP_ALLOWED_GROUPS_CASE_SENSITIVE | enabled | enabled, disabled | 组匹配是否区分大小写 | disabled |
| LDAP_ALLOWED_GROUPS_USERS_CONDITIONAL | or | and, or | 用户和组匹配条件:用户和至少一个组都匹配(and)或两者之一匹配(or) | and |
| CACHE_EXPIRATION | 5 | 缓存过期时间(分钟) | 10 | |
| LOG_LEVEL | INFO | INFO, WARNING, ERROR | 日志级别 | DEBUG |
| LOG_FORMAT | TEXT | TEXT, JSON | 日志输出格式 | JSON |
| LDAP_HTTPS_SUPPORT | disabled | enabled, disabled | 是否启用自签名证书的HTTPS支持 | |
| BRUTE_FORCE_PROTECTION | disabled | enabled, disabled | 是否启用基于IP的暴力破解防护 | |
| BRUTE_FORCE_EXPIRATION | 10 | IP封锁时间(秒) | ||
| BRUTE_FORCE_FAILURES | 3 | 触发IP封锁的失败尝试次数 |
通过HTTP头传递的变量优先级高于环境变量。
Ldap-EndpointLdap-Manager-Dn-UsernameLdap-Manager-PasswordLdap-Bind-DNLdap-Search-BaseLdap-Search-FilterLdap-Allowed-UsersLdap-Allowed-GroupsLdap-Allowed-Groups-Case-SensitiveLdap-Allowed-Groups-Conditionalx-username:包含已认证的用户名x-groups:包含用户匹配的组使用 Another LDAP Authentication 的简便方法是通过Docker容器运行,并通过环境变量设置参数。
根据实际环境修改环境变量:
bashdocker run -d \ -e LDAP_ENDPOINT='ldaps://testmyldap.com:636' \ -e LDAP_MANAGER_DN_USERNAME='CN=john-service-user,OU=Administrators,DC=TESTMYLDAP,DC=COM' \ -e LDAP_MANAGER_PASSWORD='MasterpasswordNoHack123' \ -e LDAP_BIND_DN='{username}@TESTMYLDAP.COM' \ -e LDAP_SEARCH_BASE='DC=TESTMYLDAP,DC=COM' \ -e LDAP_SEARCH_FILTER='(sAMAccountName={username})' \ -e LOG_FORMAT='JSON' \ -p 9000:9000 \ --name another_ldap_auth \ dignajar/another-ldap-auth:latest
Another LDAP Authentication 现在运行在 http://localhost:9000。
通过curl测试:
bashcurl -vvv http://localhost:9000 -u diego:mypassword
ALDAP输出示例:
json{"date": "2021-05-21 10:06:52", "level": "INFO", "objectName": "Cache", "ip": "192.168.0.10", "referrer": null, "message": "User not found in the cache.", "username": "diego"} {"date": "2021-05-21 10:06:52", "level": "INFO", "objectName": "Aldap", "ip": "192.168.0.10", "referrer": null, "message": "Authenticating user.", "username": "diego", "finalUsername": "diego"} {"date": "2021-05-21 10:06:53", "level": "INFO", "objectName": "Aldap", "ip": "192.168.0.10", "referrer": null, "message": "Authentication successful.", "username": "diego", "elapsedTime": "0.22335"} {"date": "2021-05-21 10:06:53", "level": "INFO", "objectName": "Cache", "ip": "192.168.0.10", "referrer": null, "message": "Adding user to the cache.", "username": "diego"} 192.168.0.10 - - [21/May/2021 10:06:53] "GET / HTTP/1.1" 200 -
可通过环境变量
LDAP_HTTPS_SUPPORT="enabled"启用Flask的自签名证书支持。
Nginx使用 ngx_http_auth_request_module 模块处理子请求。
以下示例配置与 Another LDAP Authentication 运行在同一台机器的Nginx,后端 /private/ 通过子请求 /another_ldap_auth 进行认证:
nginxlocation /private/ { auth_request /another_ldap_auth; # ... # 此处配置私有站点 } location = /another_ldap_auth { internal; proxy_pass_request_body off; proxy_set_header Content-Length ""; proxy_pass http://localhost:9000; }
现在访问 http://myserver.com/private/ 时,Nginx会提示输入用户名和密码进行认证。
从 /kubernetes 目录获取K8s manifest文件。
K8s manifest文件将 Another LDAP Authentication 部署在 ingress-nginx 命名空间,并在集群内通过 https://another-ldap-auth.ingress-nginx 暴露服务。
请修改manifest中的环境变量和绑定用户的secret。
在Kubernetes中运行 Another LDAP Authentication 后,可修改需要保护的应用的Ingress manifest:
yaml--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo-webserver namespace: demo annotations: nginx.ingress.kubernetes.io/auth-url: https://another-ldap-auth.ingress-nginx # nginx.ingress.kubernetes.io/auth-snippet: | # proxy_set_header Ldap-Allowed-Groups "<某个组>"; # proxy_set_header Ldap-Allowed-Groups-Conditional "or"; spec: rules: - host: demo.local http: paths: - path: / backend: serviceName: demo-webserver servicePort: 80
暴力破解防护通过封锁用户IP实现,有关IP封锁的局限性请阅读以下文章:
$1 或 $test,因为Nginx会进行变量扩展。LDAP_REQUIRED_GROUPS 重命名为 LDAP_ALLOWED_USERSLDAP_REQUIRED_GROUPS_CONDITIONAL 重命名为 LDAP_ALLOWED_GROUPS_CONDITIONALLDAP_REQUIRED_GROUPS_CASE_SENSITIVE 重命名为 LDAP_ALLOWED_GROUPS_CASE_SENSITIVELDAP_SERVER_DOMAIN 已移除,由 LDAP_BIND_DN 替代您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。

来自真实用户的反馈,见证轩辕镜像的优质服务