nginx做为反向代理服务器,也做为http服务器,被普遍使用。而不少时候,会有一些无密码的网站,好比公司内部的wiki,静态网站等等,无论处于何种缘由,忽然就想加上认证,但网站网站自己不具有认证功能,那么就能够经过集成ldap认证来实现统一认证。这里就详细记录一下如何实现nginx的ldap认证。html
nginx的ldap认证明现,网上有有两种方法:nginx
1. 经过auth_request模块,启动一个ldap认证服务,访问网页时,先跳转到认证服务上认证,根据返回状态,再继续访问网站git
2. 经过nginx-auth-ldap第三方模块,直接在配置中定义ladp服务,而后在访问时去ldap服务中进行查找认证来实现。github
这两种办法呢,我这里推荐使用第二种,为何呢,由于配置简单,安装第三方模块后,直接简单配置ldap服务便可。而后在相应的server和location中直接使用便可。我这里也是详细讲一下第二种方式集成ldap的步骤。vim
1. nginx新增第三方模块:nginx-auth-ldapcentos
nginx-auth-ldap模块github:https://github.com/kvspb/nginx-auth-ldap服务器
# 下载nginx-auth-ldap $ git clone https://github.com/kvspb/nginx-auth-ldap.git # 下载后,nginx-auth-ldap目录为:/root/nginx-auth-ldap
模块下载后,须要新增模块到nginx中,若是是yum安装的nginx,请参考这边博文,新增nginx-auth-ldap模块:cookie
若是nginx是源码安装的,请参考这篇博文,新增nginx-auth-ldap模块。工具
《centos7.2 源码编译安装nginx,新增编译模块,实现tcp反向代理》
注意事项:nginx添加第三方模块时,--add-module=后面跟的是第三方模块的路径,因此这里咱们下载的模块的路径为:/root/nginx-auth-ldap。因此nginx在./configure设置时,加在最后面的参数为:--add-module=/root/nginx-auth-ldap
2. 配置ldap server
nginx-auth-ldap模块新增后,修改nginx配置,添加ldap server
# 修改nginx主配置 $ vim /etc/nginx/nginx.conf -------------------------------------------------------------------------------- # 注意这里是在http下面添加内容 http { # openldap为ldap server的名称,能够自定义 ldap_server openldap { # 指定url url ldap://172.18.73.129:389/dc=test,dc=com?uid?sub?(objectClass=posixAccount); # 管理dn binddn "cn=admin,dc=test,dc=com"; # 密码 binddn_passwd "admin-password"; group_attribute memberOf; group_attribute_is_dn on; # require valid_user; } } --------------------------------------------------------------------------------
说明:
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"; # 上面咱们设置的ldap server的名称为openldap auth_ldap_servers openldap; location / { root /usr/share/nginx/html; index index.html index.htm; } } # 也能够相似以下,在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生效
重启nginx后,访问网页,会弹出登陆框:
输入ldap帐号后,正常进入网站,查看nginx的访问日志,能够看到本身帐号登陆后的访问日志:
清空cookie,再测试,随便输入错误的密码,会发现被拒接,没法访问,再nginx的访问日志中也能看到401的被拒请求记录,这里就不去一一找了。你们自行去测试就好
ok,到此就完成了nginx的ldap集成,此方法很是方便,只需一次配置,就可能在全部的nginx代理的网站上进行ldap集成使用。且配置简单方便。虽然源码存在一些坑,但不影响使用,很方便但实现来ldap认证。