Rafael Micó created NIFI-8228:
---------------------------------
Summary: Microsoft Active Directory LDAP integration bug
Key: NIFI-8228
URL: https://issues.apache.org/jira/browse/NIFI-8228
Project: Apache NiFi
Issue Type: Bug
Components: Security
Affects Versions: 1.12.1
Reporter: Rafael Micó
Fix For: 1.12.1
Hi
When trying to integrate both Authentication and Authorization of NiFi with
Microsoft Active Directory via LDAP, we have seen that NiFi is unable to relate
a valid Authentication done via ldap-provider
(org.apache.nifi.ldap.LdapProvider) with an Authorization (user to group
relationship) done via ldap-user-group-provider
(org.apache.nifi.ldap.tenants.LdapUserGroupProvider).
As we have seen in the NiFi logs (enabling DEBUG mode) and on TCPDUMP dumps,
the issue seems to be related on the ldap-provider authentication. Summarizing:
1.- ldap-provider binds to the LDAP service with the "Manager DN" credentials.
2.- LDAP server (Microsoft Active Directory) responses with a successful bind
3.- ldap-provider searches for the user trying to log in (using sAMAccountName
attribute)
4.- LDAP server (Microsoft Active Directory) responses with the information of
the relevant user. In this information, the attribute "distinghuishedName" is
provided like "CN=John,OU=Users,OU=domain,OU=internal"
5.- ldap-provider binds to the LDAP service with the logged user credentials
but using the distiguishedName "cn=John,ou=Users,ou=domain,ou=internal", with
lowercase LDAP prefixes
6.- LDAP server (Microsoft Active Directory) responses with a successful bind
as the LDAP prefixes are accepted in uppercase or lowercase
7.- ldap-user-group-provider searches for
"CN=John,OU=Users,OU=domain,OU=internal", the authenticated user, against
"CN=John,OU=Users,OU=domain,OU=internal", the user that has been found in the
LDAP authorization. The difference in the LDAP prefixes causes the
"CN=John,OU=Users,OU=domain,OU=internal" not to belong to any authorized group,
thereafter rejecting the user.
Our configuration
NiFi login-identity-providers.xml:
{code:java}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<loginIdentityProviders>
<!--
https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#ldap_login_identity_provider
-->
<provider>
<identifier>ldap-provider</identifier>
<class>org.apache.nifi.ldap.LdapProvider</class>
<property name="Authentication Strategy">SIMPLE</property>
<property name="Manager DN">CN=Nifi,OU=Special
Accounts,DC=domain,DC=internal</property>
<property name="Manager Password">*****************</property>
<property name="Referral Strategy">FOLLOW</property>
<property name="Connect Timeout">10 secs</property>
<property name="Read Timeout">10 secs</property> <property
name="Url">ldap://adserver.domain.internal:389</property>
<property name="User Search
Base">OU=Users,DC=domain,DC=internal</property>
<property name="User Search Filter">sAMAccountName={0}</property>
<property name="Identity Strategy">USE_DN</property>
<property name="Authentication Expiration">12 hours</property>
</provider>
</loginIdentityProviders>
{code}
NiFi authorizers.cml:
{code:java}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<authorizers>
<!--
https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#ldapusergroupprovider
-->
<userGroupProvider>
<identifier>file-user-group-provider</identifier>
<class>org.apache.nifi.authorization.FileUserGroupProvider</class>
<property name="Users File">./conf/users.xml</property>
<property name="Legacy Authorized Users File"></property>
<property name="Initial User Identity Node1">CN=nifi_admin,
OU=nifi</property>
</userGroupProvider> <userGroupProvider>
<identifier>ldap-user-group-provider</identifier>
<class>org.apache.nifi.ldap.tenants.LdapUserGroupProvider</class>
<property name="Authentication Strategy">SIMPLE</property>
<property name="Manager DN">CN=Nifi,OU=Special
Accounts,DC=domain,DC=internal</property>
<property name="Manager Password">*****************</property>
<property name="Referral Strategy">FOLLOW</property>
<property name="Connect Timeout">10 secs</property>
<property name="Read Timeout">10 secs</property> <property
name="Url">ldap://adserver.domain.internal:389</property>
<property name="Page Size"></property>
<property name="Sync Interval">10 mins</property>
<property name="Group Membership - Enforce Case
Sensitivity">false</property> <property name="User Search
Base">OU=Users,DC=domain,DC=internal</property>
<property name="User Object Class">user</property>
<property name="User Search Scope">SUBTREE</property>
<property name="User Search
Filter">(memberOf=CN=GG_NIFI_Allowed_Users,OU=Nifi,OU=Admin
Rights,OU=Groups,DC=domain,DC=internal)</property>
<property name="User Identity Attribute">distinguishedName</property>
<property name="User Group Name Attribute">memberOf</property>
<property name="User Group Name Attribute - Referenced Group
Attribute">distinguishedName</property> <property name="Group Search
Base">OU=NIFI_App_Groups,OU=Nifi,OU=Admin
Rights,OU=Groups,DC=domain,DC=internal</property>
<property name="Group Object Class">group</property>
<property name="Group Search Scope">ONE_LEVEL</property>
<property name="Group Search Filter"></property>
<property name="Group Name Attribute"></property>
<!-- <property name="Group Member Attribute">member</property>
<property name="Group Member Attribute - Referenced User
Attributee">distinguishedName</property>--> </userGroupProvider>
<userGroupProvider>
<identifier>composite-user-group-provider</identifier>
<class>org.apache.nifi.authorization.CompositeUserGroupProvider</class>
<property name="User Group Provider
1">ldap-user-group-provider</property>
<property name="User Group Provider
2">file-user-group-provider</property>
</userGroupProvider> <accessPolicyProvider>
<identifier>file-access-policy-provider</identifier>
<class>org.apache.nifi.authorization.FileAccessPolicyProvider</class>
<property name="User Group
Provider">composite-user-group-provider</property>
<property name="Authorizations
File">./conf/authorizations.xml</property>
<property name="Initial Admin Identity">CN=nifi_admin,
OU=nifi</property>
<property name="Legacy Authorized Users File"></property>
<property name="Node Identity 1"></property>
<property name="Node Group"></property>
</accessPolicyProvider> <authorizer>
<identifier>managed-authorizer</identifier>
<class>org.apache.nifi.authorization.StandardManagedAuthorizer</class>
<property name="Access Policy
Provider">file-access-policy-provider</property>
</authorizer>
</authorizers>
{code}
Extract of NiFi nifi-app.log:
{noformat}
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider
-------------------------------------
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider Loaded the following users
from LDAP:
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider -
identifier[e4e7bd27-cad9-37c1-af53-a5fb7898de66],
identity[CN=Peter,OU=Development,OU=Users,DC=domain,DC=internal]
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider -
identifier[1f8d8309-31d9-3831-a3c0-2a9909500d7f],
identity[CN=Frank,OU=Development,OU=Users,DC=domain,DC=internal]
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider -
identifier[7c635418-5897-32a9-8e5b-5a7d9594b7f9],
identity[CN=John,OU=Users,DC=domain,DC=internal]
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider
--------------------------------------
2021-02-16 06:44:45,813 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider Loaded the following groups
from LDAP:
2021-02-16 06:44:45,814 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider -
identifier[f26c7633-396e-3bdd-83b3-1e395606346d],
name[CN=GG_NIFI_Admins,OU=NIFI_App_Groups,OU=Nifi,OU=Admin
Rights,OU=Groups,DC=domain,DC=internal],
users[7c635418-5897-32a9-8e5b-5a7d9594b7f9]
2021-02-16 06:44:45,814 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider -
identifier[39854ab9-993e-3523-8c52-193e7e1fdb89],
name[CN=GG_NIFI_Users,OU=NIFI_App_Groups,OU=Nifi,OU=Admin
Rights,OU=Groups,DC=domain,DC=internal],
users[1f8d8309-31d9-3831-a3c0-2a9909500d7f,
e4e7bd27-cad9-37c1-af53-a5fb7898de66]
2021-02-16 06:44:45,814 DEBUG [ (ldap-user-group-provider) - background sync
thread] o.a.n.ldap.tenants.LdapUserGroupProvider
--------------------------------------{noformat}
Extract of NiFi nifi-user.log:
{noformat}
2021-02-15 14:07:59,252 INFO [NiFi Web Server-170]
o.a.n.w.s.NiFiAuthenticationFilter Attempting request for (<JWT token>) GET
https://nifi.domain.internal:9443/nifi-api/flow/current-user (source ip:
X.Y.Z.W)
2021-02-15 14:07:59,260 INFO [NiFi Web Server-170]
o.a.n.w.s.NiFiAuthenticationFilter Authentication success for
cn=John,ou=Users,ou=domain,ou=internal
2021-02-15 14:07:59,301 INFO [NiFi Web Server-170]
o.a.n.w.a.c.AccessDeniedExceptionMapper
identity[cn=John,ou=Users,ou=domain,ou=internal], groups[] does not have
permission to access the requested resource. Unknown user with identity
'cn=John,ou=Users,ou=domain,ou=internal'. Returning Forbidden response.
{noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)