Last Updated on
前言
很多时候,会有一些无密码的网站,比如公司内部的wiki,静态网站等等,但是为了安全,需要加上认证,但网站网站本身不具备认证功能,常见的可以通过手动设置用户密码文件,静态进行认证,但是这样没发动态增加,也没发让用户自己修改密码等,对于面对公司内部的使用,就会很不方便。那么就可以通过集成ldap认证来实现动态的认证。
下面就详细记录介绍一下nginx如何实现ldap的集成认证。
nginx的ldap认证实现,网上有有两种方法:
- 通过auth_request模块,启动一个ldap认证服务,访问网页时,先跳转到认证服务上认证,根据返回状态,再继续访问网站
- 通过nginx-auth-ldap第三方模块,直接在配置中定义ladp服务,然后在访问时去ldap服务中进行查找认证来实现。
这两种办法呢,我这里推荐使用第二种方案,为什么呢,因为配置简单,安装第三方模块后,直接简单配置ldap服务即可。然后在相应的server和location中直接使用即可。不像第一种还需要启动一个认证的web服务,通过那个服务来进行认证跳转,比较麻烦。
以上,我这里就只详细讲一下第二种方式集成ldap的步骤。
正文
1. nginx新增第三方模块:nginx-auth-ldap
首先,打开nginx-auth-ldap模块的官方github,下载模块。
# 下载nginx-auth-ldap
$ git clone https://github.com/kvspb/nginx-auth-ldap.git
下载后,nginx-auth-ldap的路径为:/root/nginx-auth-ldap
模块下载后,需要添加第三方模块到nginx中,根据nginx的安装方式不同,添加加新模块的方式也不完全相同,详情请参考我的另一篇博文:
《Centos7 nginx 不中断服务添加新模块或第三方模块》
注意事项:nginx添加第三方模块时,--add-module=后面跟的是第三方模块的路径,所以这里我们下载的模块的路径为:/root/nginx-auth-ldap。所以nginx在./configure设置时,加在最后面的参数为:--add-module=/root/nginx-auth-ldap
2. 配置ldap server
nginx新增第三方模块后,下面进行配置ldap server,修改nginx配置添加下面内容:
# 修改nginx主配置
$ vim /etc/nginx/nginx.conf
------------------------------------------------------------------
# 注意,http里面这一段是添加在http{} 里面的。
# 将下面的ldap配置,改为自己的ldap实际配置即可。
http {
# openldap为ldap server的名称,可以自定义
ldap_server openldap {
url ldap://172.18.73.129:389/dc=test,dc=com?uid?sub?(objectClass=posixAccount);
binddn "cn=admin,dc=test,dc=com";
binddn_passwd "admin-password";
group_attribute memberOf;
group_attribute_is_dn on;
}
}
------------------------------------------------------------------
配置说明:
- url:ldap的连接url,指定dc,还有属性,和筛选过滤器。这个要根据你的ldap服务来自定义修改。
- binddn:管理员dn的全名
- binddn_passwd:管理员dn的密码
- group_attribute 和 group_attribute_is_dn,我也没明白具体有什么用,不管怎么设置,不太影响使用,按github上默认设置也行。
- require:这里是个坑,在模块的c语言源代码中,根本没有require这个参数,但github上却有这个默认的设置,删掉就好,不然启动nginx时,会报错parser_error解析错误。虽然就算报这个错误也还是能正常使用。
- satisfy:这个参数在github上有,但是在源码中也是一样,并没有此参数的解析,设置后同上会报parse_error解析错误
另外: 不管怎么设置,启动nginx后,在nginx的error日志中,会一直输出:http_auth_ldap: Could not connect。这个问题在源码中能找到,但可惜本人不会c语言,所以没发修改,但是此报错并不影响使用。
总之:这个工具的坑比较明显,但还好并不影响正常使用,由于此工具的主要文件ngx_http_auth_ldap_module.c文件,上次更新已经是2年前,有坑是正常的,这样希望有懂c语言的朋友,有兴趣可能看看此源码并适当优化更新,以方便更多人使用。
3. 配置到server或location中
在nginx的http中定义好了ldap server后,接下来,在自己需要用到的server或location中,类似如下增加配置接口使用ldap认证。
# 在nginx配置中,类似如下进行设置,在server中设置ldap认证
server {
listen 8000;
server_name localhost;
auth_ldap "LDAP Authentication";
auth_ldap_servers openldap;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
参数说明:
- auth_ldap: 这里是验证提示内容,随便自定义
- auth_ldap_servers:指定上面我们设置的ldap server的名称,我上面定义的为openldap
也可以类似如下,在location中设置ldap认证,这样只有location内的才会走ldap认证。
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://localhost:8888;
}
location /wiki {
root /usr/share/nginx/html;
index index.html index.htm;
# 这里是验证是,验证框显示的内容
auth_ldap "LDAP Authentication";
# 上面我们设置的ldap server的名称为openldap
auth_ldap_servers openldap;
}
}
4. 重载生效
# 重载nginx配置生效
$ systemctl reload nginx
重载nginx生效后,访问网页,会弹出登录框,测试,随便输入错误的密码,会发现被拒接,无法访问,在nginx的访问日志中也能看到401的被拒请求记录,error日志中也能看到错误
然后输入正确的ldap账号密码后,正常进入网站,查看nginx的访问日志,可以看到自己账号登录后的访问日志,具体的就不一一找了,大家自行去看就行了。
结束
ok,到此就完成了nginx的ldap集成,此方法非常方便,只需一次配置,就可能在所有的nginx代理的网站上进行ldap集成使用。且配置简单方便。虽然源码存在一些坑,但不影响使用,很方便的实现了ldap认证。
有任何问题,欢迎留言
require这个参数还是比较重要,不知道你这去掉该参数后能否针对某个组内账号设置权限?
@禾木: 你一说,我上github看一下,发现作者居然更新了,那么我改天有空再测试一下,并更新文章
@禾木: 感谢您的建议
@Amos: 大佬更新了吗?我们正好有这个需求;能指点一二不
1