This commit is contained in:
SlavaRejik 2022-04-12 15:39:33 +03:00 committed by GitHub
commit 938872d4fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 58 additions and 11 deletions

View File

@ -138,6 +138,17 @@ The reference implementation uses cookie-based authentication. If you are using
<strong>proxy_set_header Authorization $http_authorization;</strong> <strong>proxy_set_header Authorization $http_authorization;</strong>
</pre> </pre>
If you don't have memberOf in ldap and need check user in group by memberUid, set **X-Ldap-GroupDN**
```
proxy_set_header X-Ldap-GroupDN "cn=mygroup,ou=Group,dc=test,dc=com";
```
This will check if memberUid=username is in the specified group.
## Customization ## Customization
### Caching ### Caching

View File

@ -40,7 +40,7 @@ case "$1" in
fi fi
SSDOPTS="--quiet --oknodo --background --no-close --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --exec $DAEMON" SSDOPTS="--quiet --oknodo --background --no-close --make-pidfile --pidfile $PIDFILE --chuid $USER:$GROUP --exec $DAEMON"
DAEMON_ARGS="$URL $BASE $BIND_DN $BIND_PASS $COOKIE $FILTER $REALM" DAEMON_ARGS="$URL $BASE $BIND_DN $BIND_PASS $COOKIE $FILTER $GROUPDN $REALM"
if start-stop-daemon --start $SSDOPTS -- $DAEMON_ARGS > $LOG 2>&1 if start-stop-daemon --start $SSDOPTS -- $DAEMON_ARGS > $LOG 2>&1
then then

View File

@ -164,6 +164,7 @@ class LDAPAuthHandler(AuthHandler):
'basedn': ('X-Ldap-BaseDN', None), 'basedn': ('X-Ldap-BaseDN', None),
'template': ('X-Ldap-Template', '(cn=%(username)s)'), 'template': ('X-Ldap-Template', '(cn=%(username)s)'),
'binddn': ('X-Ldap-BindDN', ''), 'binddn': ('X-Ldap-BindDN', ''),
'groupdn': ('X-Ldap-GroupDN', ''),
'bindpasswd': ('X-Ldap-BindPass', ''), 'bindpasswd': ('X-Ldap-BindPass', ''),
'cookiename': ('X-CookieName', '') 'cookiename': ('X-CookieName', '')
} }
@ -227,6 +228,31 @@ class LDAPAuthHandler(AuthHandler):
ctx['action'] = 'binding as search user' ctx['action'] = 'binding as search user'
ldap_obj.bind_s(ctx['binddn'], ctx['bindpasswd'], ldap.AUTH_SIMPLE) ldap_obj.bind_s(ctx['binddn'], ctx['bindpasswd'], ldap.AUTH_SIMPLE)
# Search memberUid in groupdn if defined
if ctx['groupdn']:
self.log_message('GroupDN defined to {}'.format(ctx['groupdn']))
ctx['action'] = 'preparing search filter'
searchfilter = "(memberUid=%s)" % ctx['user']
self.log_message(('searching on server "%s" with base dn ' +\
'"%s" with filter "%s"') %
(ctx['url'], ctx['groupdn'], searchfilter))
ctx['action'] = 'running search query in GroupDN'
results = ldap_obj.search_s(ctx['groupdn'], ldap.SCOPE_SUBTREE,
searchfilter, ['objectclass'], 1)
ctx['action'] = 'verifying search query results for GroupDN'
nres = len(results)
if nres < 1:
self.auth_failed(ctx, 'no memberUid found')
return
self.log_message("MemberUid found in GroupDN")
# Search filter
ctx['action'] = 'preparing search filter' ctx['action'] = 'preparing search filter'
searchfilter = ctx['template'] % { 'username': ctx['user'] } searchfilter = ctx['template'] % { 'username': ctx['user'] }
@ -313,6 +339,8 @@ if __name__ == '__main__':
group.add_argument('-f', '--filter', metavar='filter', group.add_argument('-f', '--filter', metavar='filter',
default='(cn=%(username)s)', default='(cn=%(username)s)',
help="LDAP filter (Default: cn=%%(username)s)") help="LDAP filter (Default: cn=%%(username)s)")
group.add_argument('-g', metavar='groupdn', dest="groupdn", default='',
help="LDAP groupDN that must contain the memberUid=username (Default: unset)")
# http options: # http options:
group = parser.add_argument_group(title="HTTP options") group = parser.add_argument_group(title="HTTP options")
group.add_argument('-R', '--realm', metavar='"Restricted Area"', group.add_argument('-R', '--realm', metavar='"Restricted Area"',
@ -330,6 +358,7 @@ if __name__ == '__main__':
'disable_referrals': ('X-Ldap-DisableReferrals', args.disable_referrals), 'disable_referrals': ('X-Ldap-DisableReferrals', args.disable_referrals),
'basedn': ('X-Ldap-BaseDN', args.basedn), 'basedn': ('X-Ldap-BaseDN', args.basedn),
'template': ('X-Ldap-Template', args.filter), 'template': ('X-Ldap-Template', args.filter),
'groupdn': ('X-Ldap-GroupDN', args.groupdn),
'binddn': ('X-Ldap-BindDN', args.binddn), 'binddn': ('X-Ldap-BindDN', args.binddn),
'bindpasswd': ('X-Ldap-BindPass', args.bindpw), 'bindpasswd': ('X-Ldap-BindPass', args.bindpw),
'cookiename': ('X-CookieName', args.cookie) 'cookiename': ('X-CookieName', args.cookie)

View File

@ -72,6 +72,7 @@ http {
# cookiename X-CookieName # cookiename X-CookieName
# realm X-Ldap-Realm # realm X-Ldap-Realm
# template X-Ldap-Template # template X-Ldap-Template
# groupdn X-Ldap-GroupDN
# (Required) Set the URL and port for connecting to the LDAP server, # (Required) Set the URL and port for connecting to the LDAP server,
# by replacing 'example.com'. # by replacing 'example.com'.
@ -120,6 +121,11 @@ http {
# nginx-ldap-auth-daemon.py. # nginx-ldap-auth-daemon.py.
#proxy_set_header X-Ldap-Template "(cn=%(username)s)"; #proxy_set_header X-Ldap-Template "(cn=%(username)s)";
# Optional. If you don't have memberOf in ldap
# and need check user in group by memberUid
# proxy_set_header X-Ldap-GroupDN "cn=mygroup,ou=Group,dc=test,dc=com";
# (Optional) Set the realm name, by uncommenting the following # (Optional) Set the realm name, by uncommenting the following
# directive and replacing 'Restricted' which is the default set # directive and replacing 'Restricted' which is the default set
# in nginx-ldap-auth-daemon.py. # in nginx-ldap-auth-daemon.py.

View File

@ -8,6 +8,7 @@
#BIND_PASS="-w secret" #BIND_PASS="-w secret"
#COOKIE="-c nginxauth" #COOKIE="-c nginxauth"
#FILTER="-f (cn=%(username)s)" #FILTER="-f (cn=%(username)s)"
#GROUPDN="-g cn=mygroup,ou=Group,dc=test,dc=com"
#REALM="-R 'Restricted Area'" #REALM="-R 'Restricted Area'"
# these are used with init scripts only # these are used with init scripts only

View File

@ -8,7 +8,7 @@ User=nginx-ldap-auth
Group=nginx-ldap-auth Group=nginx-ldap-auth
WorkingDirectory=/var/run WorkingDirectory=/var/run
EnvironmentFile=/etc/default/nginx-ldap-auth EnvironmentFile=/etc/default/nginx-ldap-auth
ExecStart=/usr/bin/nginx-ldap-auth-daemon $URL $BASE $BIND_DN $BIND_PASS $COOKIE $FILTER $REALM ExecStart=/usr/bin/nginx-ldap-auth-daemon $URL $BASE $BIND_DN $BIND_PASS $COOKIE $FILTER $GROUPDN $REALM
KillMode=process KillMode=process
KillSignal=SIGINT KillSignal=SIGINT
Restart=on-failure Restart=on-failure