Last Updated on

前言

很多时候,会有一些无密码的网站,比如公司内部的wiki,静态网站等等,但是为了安全,需要加上认证,但网站网站本身不具备认证功能,常见的可以通过手动设置用户密码文件,静态进行认证,但是这样没发动态增加,也没发让用户自己修改密码等,对于面对公司内部的使用,就会很不方便。那么就可以通过集成ldap认证来实现动态的认证。

下面就详细记录介绍一下nginx如何实现ldap的集成认证。

nginx的ldap认证实现,网上有有两种方法:

  1. 通过auth_request模块,启动一个ldap认证服务,访问网页时,先跳转到认证服务上认证,根据返回状态,再继续访问网站
  2. 通过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认证。

有任何问题,欢迎留言