教大家在nginx中如何接入ldap认证
出于安全考虑,最近公司要求对pinpoint这种不带用户名密码保护的站点进行用户登录认证,接到这个任务的第一个想法是使用nginx的简单用户认证,但是维护用户是个比较麻烦的工作,所以特意研究了下能否接入ldap这种统一认证方式,今天给大家分析下。
1、部署openldap,因为我的都是linux机器所以首选openldap,而没有使用AD域控。
1)部署docker环境
不赘述,可以参考官方文档一键部署
2)启动openldap
# docker run -itd \
--name ldap-service \
--hostname ldap-service \
-p 389:389 -p 689:689 \
-v /data/openldap/database:/var/lib/ldap \
-v /data/openldap/config:/etc/ldap/slapd.d \
--env LDAP_ORGANISATION="wuqingyan.top" \
--env LDAP_DOMAIN="wuqingyan.top" \
--env LDAP_ADMIN_PASSWORD="20220423" \
--env LDAP_TLS=false \
--detach \
osixia/openldap:1.4.0
3)部署ldap管理服务phpldapAdmin
# docker run -itd \
--name phpldapadmin-service \
-p 80:80 \
--hostname phpldapadmin-service \
--link ldap-service:wuqingyan.top \
--env PHPLDAPADMIN_LDAP_HOSTS=wuqingyan.top \
--env PHPLDAPADMIN_HTTPS=false \
--detach \
osixia/phpldapadmin:0.9.0
4)配置ldap,浏览器打开http://IP
登录ldap:
添加ou:
添加用户:
用户名:zhangsan 密码:123456
2、部署一个不带认证的测试站点,这里部署一个tomcat作为示例,实际应用中可能是kibana、pinpoint、skywalking这种系统。
# docker run -itd --name mytomcat \
-p 8080:8080 \
-v /usr/local/tomcat/webapps/ROOT:/usr/local/tomcat/webapps/ROOT \
tomcat:8
# echo "hello world" > /usr/local/tomcat/webapps/ROOT/test.html
浏览器访问测试:http://IP/test.html
3、配置nginx
1)安装nginx
# yum install epel-release -y
# yum install nginx -y
# systemctl start nginx
这里应该会失败,因为前面phpldapadmin已经占用80端口了,可以把phpldapadmin换个端口启动,再启动nginx。
# docker stop phpldapadmin-service && docker rm phpldapadmin-service
# docker run -itd \
--name phpldapadmin-service \
-p 8000:80 \
--hostname phpldapadmin-service \
--link ldap-service:wuqingyan.top \
--env PHPLDAPADMIN_LDAP_HOSTS=wuqingyan.top \
--env PHPLDAPADMIN_HTTPS=false \
--detach \
osixia/phpldapadmin:0.9.0
2)检查nginx是否已安装http_auth_request_module模块
# nginx -V
3)代理tomcat
# vim /etc/nginx/conf.d/tomcat.conf
#nginx -t && nginx -s reload
浏览器访问测试:
可以看到不需要任何认证就能访问到tomcat服务,接下来我们配置ldap认证
4)配置ldap认证
# yum install python-ldap git -y
# git clone https://github.com/nginxinc/nginx-ldap-auth.git
# cd nginx-ldap-auth
# nohup python ./nginx-ldap-auth-daemon.py > /tmp/auth.log 2>&1 &
# nohup python ./backend-sample-app.py > /tmp/login.log 2>&1 &
nginx-ldap-auth-daemon.py 为认证服务
backend-sample-app.py 为登录服务,在里面可以做自定义登录页面
# vim /etc/nginx/conf.d/tomcat.conf
# nginx -t && nginx -s reload
浏览器访问tomact的代理页面htpp://IP/test.html测试,可以看到已经需要输入用户名密码才能访问了,这里的用户名密码就是ldap中的用户,比如之前的zhangsan/123456
验证通过后就可以看到tomcat的服务页面了:
可以在phpldapadmin中新增一个用户测试:
如果大家觉得登录页面丑陋,可以自行修改backend-sample-app.py 中的这段就好: