🙈 By 赵延刚 2024-01-22
一.OpenNjet认证功能介绍
该功能基于njet 的auth_request 指令,来支持第三方认证,该指令指定一个 uri , 在获取用户请求时,开启subrequest 子请求,发送认证信息到该指定uri 进行鉴权认证,认证方式有:
1.本地认证
2.调用proxy_pass 调用第三方的认证接口。
3.直接访问认证服务器进行认证。ldap,radius,redis
如果返回2XX 则可以继续后需的资源访问。其他值则访问中断拒绝。返回值如下:
2XX 允许请求操作。
401 不正确授权
403 禁止访问
其他值,500错误
本文使用第三种方式, 使用lua 脚本,直接连接到ldap 服务器进行验证.
二.LDAP服务器搭建(ubuntu)
1.设置hostname
sudo hostnamectl set-hostname http://ldap.example.com
sudo vim /etc/hosts
192.168.18.50 http://ldap.example.com
2.安装ldap
sudo apt install slapd ldap-utils
按照提示输入管理密码如Aa-111111
3.add nodes
add_nodes.ldif
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups
ldapadd -x -D cn=admin,dc=example,dc=com -W -f add_nodes.ldif
4.加载memberof模块
cat memberof_config.ldif
dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModuleLoad: memberof.la
olcModulePath: /usr/lib/ldap
dn: olcOverlay={0}memberof,olcDatabase={1}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif
5.加载refint模块
refint1.ldif
dn: cn=module{1},cn=config
add: olcmoduleload
olcmoduleload: refint
refint2.ldif
dn: olcOverlay={1}refint,olcDatabase={1}mdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: {1}refint
olcRefintAttribute: memberof member manager owner
sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f /tmp/refint1.ldif
sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /tmp/refint2.ldif
6.增加用户,组
slappasswd -h {SHA} -s Aa-111111
root@garlic:/home/garlic# cat add_user.ldif
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
givenName: John
sn: Doe
uid: john
uidNumber: 5000
gidNumber: 10000
homeDirectory: /home/john
mail: john.doe@example.com
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
userPassword: {SHA}BS15yozmNosbVHvPv3YDXbZ0IuI=
ldapadd -x -D cn=admin,dc=example,dc=com -W -f add_user.ldif
root@garlic:/home/garlic# cat add_group.ldif
dn: cn=mygroup,ou=groups,dc=example,dc=com
objectClass: groupofnames
cn: mygroup
description: All users
member: uid=john,ou=people,dc=example,dc=com
ldapadd -x -D cn=admin,dc=example,dc=com -W -f add_group.ldif
7.验证
root@garlic:/home/garlic# ldapsearch -x -LLL -H ldap:/// -b
uid=john,ou=people,dc=example,dc=com dn memberof
dn: uid=john,ou=people,dc=example,dc=com
memberOf: cn=mygroup,ou=groups,dc=example,dc=com
三.部署njet
1.配置文件 conf/njet.conf
2.Lua 文件:scripts/http_ldap.lua
四.测试
认证成功:
[root@k8s-139 ldap]# curl 'http://192.168.40.139:8080/resource?name=john&pass=Aa-111111'
ok
认证失败:
[root@k8s-139 ldap]# curl 'http://192.168.40.139:8080/resource?name=john&pass=Aa-111112'
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>njet/2.0.1</center>
</body>
</html>