centos7 nginx集成ldap认证

概述

    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

《centos7 yum安装的nginx添加模块》tcp

若是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认证。