Description
- Gitea version (or commit ref): 1.12.4
- Git version: 2.20.1
- OpenLDAP version: 2.4.47+dfsg-3+deb10u3
- Operating system: Debian 10
- Downloaded from https://dl.gitea.io/gitea/1.12.4/gitea-1.12.4-linux-amd64
- Runs via gitea service (https://github.com/go-gitea/gitea/raw/master/contrib/systemd/gitea.service)
- Database (use
[x]
):- PostgreSQL
- MySQL
- MSSQL
- SQLite
- Can you reproduce the bug at https://try.gitea.io:
- Yes (provide example URL)
- No -- Not relevant
- Log gist: https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e
Synchronize external user data
: https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-0-log- Login with user who was changed to
admin
: https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-1-log - Login with user that is not
admin
: https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-2-log - Login with user that is
ext
(restricted): https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-3-log
Description
We are encountering 2/3 main issues with LDAP authentication:
is_admin
is set correctly on account creation (fist login to Gitea) but is not updated anymore on subsequent loginsis_restricted
is not updated anymore on subsequent logins (have not tested on account creation yet, sry)- Although
"AllowDeactivateAll": false
is set ( Add option to prevent LDAP from deactivating everything on empty search #9879 ) each user'sis_active
attribute is set tofalse
(cf. https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-0-log-L177-L178 ff.) when usingSynchronize external user data
inadmin/monitor
in the web UI (and also on cron started synchronizations).
This is our configuration of the authentication method:
# SELECT * FROM gitea.login_source WHERE id=2;
id: 2
type: 2
name: ldap.our.domain.com
is_actived: 1
is_sync_enabled: 1
cfg:
Name: ldap.our.domain.com
Host: ldap.lxc0
Port: 389
SecurityProtocol: 0
SkipVerify: false
BindDN: ''
BindPassword: ''
UserBase: OU=users,DC=our,DC=domain,DC=com
UserDN: ''
AttributeUsername: ''
AttributeName: givenName
AttributeSurname: sn
AttributeMail: mail
AttributesInBind: true
AttributeSSHPublicKey: ''
SearchPageSize: 0
Filter: (&(objectClass=posixAccount)(UID=%s)(!(memberOf=CN=disabled,OU=roles,DC=our,DC=domain,DC=com)))
AdminFilter: (memberOf=CN=admin,OU=roles,DC=our,DC=domain,DC=com)
RestrictedFilter: (&(memberOf=CN=ext,OU=roles,DC=our,DC=domain,DC=com)(!(memberOf=CN=gitea,OU=roles,DC=our,DC=domain,DC=com)))
Enabled: true
AllowDeactivateAll: false
created_unix: 1603901943
updated_unix: 1604430791
This is the list of our users (probably important for the log gist):
user00: [admin]
user01: [admin]
user02: []
user03: []
user04: []
user05: [ext]
user06: [disabled]
user07: []
user08: [ext]
user09: []
user10: []
user11: []
user12: [ext]
user13: []
user14: []
user15: []
user16: []
user17: [disabled]
user18: []
user19: []
user20: [disabled]
user21: [disabled]
user22: []
user23: []
user24: []
user25: []
user26: [disabled]
user27: [disabled]
user28: [disabled]
user29: [disabled]
user30: [disabled]
user31: [disabled]
user32: [disabled]
user33: []
user34: []
user35: []
user36: [ext]
user37: [disabled, ext]
user38: [ext]
user39: [ext]
user40: [ext]
user41: []
user42: []
user43: []
user44: []
user45: []
user46: []
The values after the user keys are the roles each user has (eg user00
is admin
and (memberOf=CN=admin,OU=roles,DC=our,DC=domain,DC=com)
evaluates to true).
When the filters are run manually with ldapsearch
they return the correct user entries.
Issue 1)
Should theoretically be fixed already (cf. #10538 (comment) ) but is not working for me: Is my admin filter wrong? If yes, why is the attribute correct on creation?
On subsequent login, LDAP seems to correctly filter for admin
as it is not logging [T] LDAP Admin Search found no matching entries
when the admin
role is set:
admin
role is set ( https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-1-log-L34-L35 )
2020/11/03 23:38:48 ...es/auth/ldap/ldap.go:161:checkAdmin() [T] Checking admin with filter (memberOf=CN=admin,OU=roles,DC=our,DC=domain,DC=com) and base uid=user08,ou=users,DC=our,DC=domain,DC=com
2020/11/03 23:38:48 ...es/auth/ldap/ldap.go:147:bindUser() [T] Binding with userDN: uid=user08,ou=users,DC=our,DC=domain,DC=com
- vs
admin
role is not set ( https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-2-log-L14-L19 )
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:161:checkAdmin() [T] Checking admin with filter (memberOf=CN=admin,OU=roles,DC=our,DC=domain,DC=com) and base uid=user08,ou=users,DC=our,DC=domain,DC=com
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:172:checkAdmin() [T] LDAP Admin Search found no matching entries.
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:186:checkRestricted() [T] Checking restricted with filter (&(memberOf=CN=ext,OU=roles,DC=our,DC=domain,DC=com)(!(memberOf=CN=gitea,OU=roles,DC=our,DC=domain,DC=com))) and base uid=user08,ou=users,DC=our,DC=domain,DC=com
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:197:checkRestricted() [T] LDAP Restricted Search found no matching entries.
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:147:bindUser() [T] Binding with userDN: uid=user08,ou=users,DC=our,DC=domain,DC=com
2020/11/03 23:56:19 ...es/auth/ldap/ldap.go:153:bindUser() [T] Bound successfully with userDN: uid=user08,ou=users,DC=our,DC=domain,DC=com
Yet, the is_admin
flag remains unaltered.
Issue 2)
This was tested (for the log) by adding ext
role to user08
.
Here again, according to the log, LDAP seems to correctly apply the filter (No [T] LDAP Restricted Search found no matching entries
login):
ext
role is set ( https://gist.github.com/lcnittl/60045a167285b50d72f0037f8a37cc2e#file-gitea-trace-3-log-L16-L17 )
2020/11/04 00:10:27 ...es/auth/ldap/ldap.go:186:checkRestricted() [T] Checking restricted with filter (&(memberOf=CN=ext,OU=roles,DC=our,DC=domain,DC=com)(!(memberOf=CN=gitea,OU=roles,DC=our,DC=domain,DC=com))) and base uid=user08,ou=users,DC=our,DC=domain,DC=com
2020/11/04 00:10:27 ...es/auth/ldap/ldap.go:147:bindUser() [T] Binding with userDN: uid=user08,ou=users,DC=our,DC=domain,DC=com
Is is_restricted
supposed to get updated on each login?
Issue 3)
I think this -- deactivation of all users -- should not happen in our case because
- The user search filter should, in our setup, not return an empty list for any user (the the best of my knowledge, all users exist in LDAP).
- Even if it would,
AllowDeactivateAll
is set tofalse
(so it should never deactivate all users?) - Only the
admin
andrestricted
filters are returning empty lists, for obvious reasons
But probably there is a filter problem here as well?
Any input welcome! If there is further info needed, please let me know!