** Summary changed: - adcli fails, can't contact LDAP server + GSS-SPNEGO implementation in cyrus-sasl2 is incompatible with Active Directory, causing recent adcli regression
** Description changed: - Package: adcli - Version: 0.8.2-1ubuntu1 - Release: Ubuntu 18.04 LTS + [Impact] - When trying to join the domain with this new version of adcli, it gets - to the point of 'Using GSS-SPNEGO for SASL bind' and then it will not do - anything for 10 minutes. It will then fail, complaining it can't reach - the LDAP server. + A recent release of adcli 0.8.2-1ubuntu1 to bionic-updates caused a + regression for some users when attempting to join a Active Directory + realm. adcli introduced a default behaviour change, moving from GSS-API + to GSS-SPNEGO as the default channel encryption algorithm. - Logs: - Dec 03 01:39:50 example001.domain.com realmd[6419]: * Authenticated as user: domain-join-acco...@domain.com - Dec 03 01:39:50 example001.domain.com adcli[6459]: GSSAPI client step 1 - Dec 03 01:39:50 example001.domain.com realmd[6419]: * Authenticated as user: domain-join-acco...@domain.com - Dec 03 01:39:50 example001.domain.com adcli[6459]: GSSAPI client step 1 - Dec 03 01:39:50 example001.domain.com realmd[6419]: * Using GSS-SPNEGO for SASL bind - Dec 03 01:39:50 example001.domain.com realmd[6419]: * Using GSS-SPNEGO for SASL bind - Dec 03 01:39:50 example001.domain.com adcli[6459]: GSSAPI client step 1 - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Couldn't lookup domain short name: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Couldn't lookup domain short name: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using fully qualified name: example001.domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using fully qualified name: example001.domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using domain name: domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using domain name: domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using computer account name: EXAMPLE001 - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using computer account name: EXAMPLE001 - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using domain realm: domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using domain realm: domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Calculated computer account name from fqdn: EXAMPLE001 - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Calculated computer account name from fqdn: EXAMPLE001 - Dec 03 01:55:27 example001.domain.com realmd[6419]: * With user principal: host/example001.domain....@domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * With user principal: host/example001.domain....@domain.com - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Generated 120 character computer password - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Generated 120 character computer password - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using keytab: FILE:/etc/krb5.keytab - Dec 03 01:55:27 example001.domain.com realmd[6419]: * Using keytab: FILE:/etc/krb5.keytab - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Couldn't lookup computer account: EXAMPLE001$: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Couldn't lookup computer account: EXAMPLE001$: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: adcli: joining domain domain.com failed: Couldn't lookup computer account: EXAMPLE001$: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: adcli: joining domain domain.com failed: Couldn't lookup computer account: EXAMPLE001$: Can't contact LDAP server - Dec 03 01:55:27 example001.domain.com realmd[6419]: process exited: 6459 - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Failed to join the domain - Dec 03 01:55:27 example001.domain.com realmd[6419]: ! Failed to join the domain + adcli uses the GSS-SPNEGO implementation from libsasl2-modules-gssapi- + mit, a part of cyrus-sasl2. The implementation seems to have some + compatibility issues with particular configurations of Active Directory + on recent Windows Server systems. - On the network level, adcli gets to the point of send an ldap query to - the domain controller and the domain controller returns an ack tcp - packet, but then there is no more traffic between the domain controller - and the server except for ntp packets until it fails. + Particularly, adcli sends a ldap query to the domain controller, which + responds with a tcp ack, but never returns a ldap response. The + connection just hangs at this point and no more traffic is sent. - The domain controller traffic also shows that it is receiving the ldap - query packet from the server but it never sends a reply and there is no - log in directory services regarding the query. We also couldn't find - anything in procmon regarding this query either. + You can see it on the packet trace below: - Workaround/Fix: - Downgrading the adcli package back to version 0.8.2-1 fixes the issues and domain join works properly again. + https://paste.ubuntu.com/p/WRnnRMGBPm/ + + On Focal, where the implementation of GSS-SPNEGO is working, we see a + full exchange, and adcli works as expected: + + https://paste.ubuntu.com/p/8668pJrr2m/ + + The fix is to not assume use of confidentiality and integrity modes, and + instead use the flags negotiated by GSS-API during the initial + handshake, as required by Microsoft's implementation. + + [Testcase] + + You will need to set up a Windows Server 2019 system, install and + configure Active Directory and enable LDAP extensions and configure + LDAPS and import the AD SSL certificate to the Ubuntu client. Create + some users in Active Directory. + + On the Ubuntu client, set up /etc/hosts with the hostname of the Windows + Server machine, if your system isn't configured for AD DNS. + + From there, install adcli 0.8.2-1 from -release. + + $ sudo apt install adcli + + Set up a packet trace with tcpdump: + + $ sudo tcpdump -i any port '(389 or 3268 or 636 or 3269)' + + Next, join the AD realm using the normal GSS-API: + + # adcli join --verbose -U Administrator --domain WIN- + SB6JAS7PH22.testing.local --domain-controller WIN- + SB6JAS7PH22.testing.local --domain-realm TESTING.LOCAL + + You will be prompted for Administrator's passowrd. + + The output should look like the below: + + https://paste.ubuntu.com/p/NWHGQn746D/ + + Next, enable -proposed, and install adcli 0.8.2-1ubuntu1 which caused the regression. + Repeat the above steps. Now you should see the connection hang. + + https://paste.ubuntu.com/p/WRnnRMGBPm/ + + Finally, install the fixed cyrus-sasl2 package, which is available from the + below ppa: + + https://launchpad.net/~mruffell/+archive/ubuntu/lp1906627-test + + $ sudo add-apt-repository ppa:mruffell/lp1906627-test + $ sudo apt-get update + $ sudo apt install libsasl2-2 libsasl2-modules libsasl2-modules-db libsasl2-modules-gssapi-mit + + Repeat the steps. GSS-SPNEGO should be working as intended, and you + should get output like below: + + https://paste.ubuntu.com/p/W5cJNGvCsx/ + + [Where problems could occur] + + Since we are changing the implementation of GSS-SPNEGO, and cyrus-sasl2 + is the library which provides it, we can potentially break any package + which depends on libsasl2-modules-gssapi-mit for GSS-SPNEGO. + + $ apt rdepends libsasl2-modules-gssapi-mit + libsasl2-modules-gssapi-mit + Reverse Depends: + |Suggests: ldap-utils + Depends: adcli + Conflicts: libsasl2-modules-gssapi-heimdal + |Suggests: libsasl2-modules + Conflicts: libsasl2-modules-gssapi-heimdal + |Recommends: sssd-krb5-common + |Suggests: slapd + |Suggests: libsasl2-modules + |Suggests: ldap-utils + |Depends: msktutil + Conflicts: libsasl2-modules-gssapi-heimdal + |Depends: libapache2-mod-webauthldap + Depends: freeipa-server + Depends: freeipa-client + Depends: adcli + Depends: 389-ds-base + |Recommends: sssd-krb5-common + |Suggests: slapd + |Suggests: libsasl2-modules + + While this SRU makes cyrus-sasl2 work with Microsoft implementations of GSS-SPNEGO, which will be the more common usecase, it may change the behaviour when connecting to a MIT krb5 server with the GSS-SPNEGO protocol, as krb5 assumes use of confidentiality and integrity modes. This shouldn't be a problem as the krb5 implementation signals its intentions by setting the correct flags during handshake, which these patches to cyrus-sasl2 should now parse correctly. + + [Other Info] + + The below two commits are needed. The first fixes the problem, the second fixes + some unused parameter warnings. + + commit 816e529043de08f3f9dcc4097380de39478b0b16 + Author: Simo Sorce <s...@redhat.com> + Date: Thu Feb 16 15:25:56 2017 -0500 + Subject: Fix GSS-SPNEGO mechanism's incompatible behavior + https://github.com/cyrusimap/cyrus-sasl/commit/816e529043de08f3f9dcc4097380de39478b0b16 + + commit ed2ad48f242fe16e846a9db552a04fca1a5da45f + Author: Simo Sorce <s...@redhat.com> + Date: Tue Apr 11 18:31:46 2017 -0400 + Subject: Drop unused parameter from gssapi_spnego_ssf() + https://github.com/cyrusimap/cyrus-sasl/commit/ed2ad48f242fe16e846a9db552a04fca1a5da45f -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1906627 Title: GSS-SPNEGO implementation in cyrus-sasl2 is incompatible with Active Directory, causing recent adcli regression To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/adcli/+bug/1906627/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs