Package: python3-keystone
Version: 2:14.2.0-0+deb10u1
Severity: normal
Tags: patch upstream


Hello,

With Keystone configured as a federated-identity Service Provider (with the IdP accessed over OpenID in our case but it might affect other protocols as well), certain operations performed as a federated user - e.g. obtaining a scoped token from an unscoped one using 'openstack token issue' - report a server error 500. On the server side, Keystone logs show the following exception:

INFO keystone.common.wsgi [req-foo bar baz - Federated default] POSThttps://osc.example.com:5000/v3/auth/tokens
ERROR keystone.common.wsgi [req-foo bar baz - Federated default]
identity_provider failed validation: <function
FederatedCredential.<lambda> at 0xdeadbeef>: ValueError:
identity_provider failed validation: <function
FederatedCredential.<lambda> at 0xdeadbeef>
ERROR keystone.common.wsgi Traceback (most recent call last):
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/common/wsgi.py", line 148, in
__call__
ERROR keystone.common.wsgi     result = method(req, **params)ERROR
keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/auth/controllers.py", line 67,
in authenticate_for_token
ERROR keystone.common.wsgi     self.authenticate(request, auth_info,
auth_context)
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/auth/controllers.py", line 236,
in authenticate
ERROR keystone.common.wsgi     auth_info.get_method_data(method_name))
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/auth/plugins/token.py", line
46, in authenticate
ERROR keystone.common.wsgi     PROVIDERS.identity_api
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/auth/plugins/mapped.py", line
101, in handle_scoped_token
ERROR keystone.common.wsgi     send_notification(taxonomy.OUTCOME_SUCCESS)
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/keystone/notifications.py", line 685, in
send_saml_audit_notification
ERROR keystone.common.wsgi     user=user_id, groups=group_ids)
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/pycadf/credential.py", line 84, in __init__
ERROR keystone.common.wsgi     setattr(self,
FED_CRED_KEYNAME_IDENTITY_PROVIDER, identity_provider)
ERROR keystone.common.wsgi   File
"/usr/lib/python3/dist-packages/pycadf/cadftype.py", line 66, in __set__
ERROR keystone.common.wsgi     (self.name, self.func))
ERROR keystone.common.wsgi ValueError: identity_provider failed
validation: <function FederatedCredential.<lambda> at 0xdeadbeef>

i.e. the request has succeeded but then things fall over when an audit
notification is to be sent.

Having poked around the sources of
keystone.notifications.send_saml_audit_notifications() and the code it
references, I found out the following:
  - the lambda function which triggers the error checks if
'identity_provider' is a six string type;
  - when this error occurs the value of 'identity_provider' is indeed
the name of my IdP - but as *bytes* rather than str!
- this doesn't happen every time this IdP name is used - if I add a simple

identity_provider = identity_provider.decode('utf-8') to the relevant
function

I start getting errors suggesting that under some circumstances,
'identity_provider' is str as it should be.
All in all, it seems this particular bit of Keystone code does not fully
support Python3 in Rocky.

A simple workaround that I have put in place (which is why debsums has found notifications.py to have changed) looks as follows:

--- a/keystone/notifications.py
+++ b/keystone/notifications.py
@@ -680,6 +680,8 @@
     user_id = user_id or taxonomy.UNKNOWN
     token_id = token_id or taxonomy.UNKNOWN
     group_ids = group_ids or []
+    if isinstance(identity_provider, bytes):
+        identity_provider = identity_provider.decode('utf-8')
     cred = credential.FederatedCredential(token=token_id, type=audit_type,

identity_provider=identity_provider,
                                           user=user_id, groups=group_ids)

On Debian 10 Keystone is a Python3-only package so I didn't bother with six. With this patch in place getting scoped tokens works and I have yet to hear from our federated users about any authentication-related issues. Unfortunately having changed the contents of a package I had to put python3-keystone on hold, which of course means no automatic security updates.

PS. I have already mentioned the problem upstream, see
http://lists.openstack.org/pipermail/openstack-discuss/2021-June/023281.html


-- System Information:
Debian Release: 10.10
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.19.0-14-amd64 (SMP w/56 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=C.UTF-8 (charmap=locale: Cannot set
LC_ALL to default locale: No such file or directory
UTF-8), LANGUAGE=en_US.UTF-8 (charmap=locale: Cannot set LC_ALL to
default locale: No such file or directory
UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages python3-keystone depends on:
ii  python3                        3.7.3-1
ii  python3-babel                  2.6.0+dfsg.1-1
ii  python3-bcrypt                 3.1.6-1
ii  python3-crypto                 2.6.1-9+b1
ii  python3-cryptography           2.6.1-3+deb10u2
ii  python3-dateutil               2.7.3-3
ii  python3-dogpile.cache          0.6.2-6
ii  python3-flask                  1.0.2-3
ii  python3-flask-restful          0.3.7-1
ii  python3-jsonschema             2.6.0-4
ii  python3-keystoneclient         1:3.17.0-2
ii  python3-keystonemiddleware     5.2.0-2
ii  python3-ldap [python3-pyldap]  3.1.0-2
ii  python3-ldappool               2.3.1-1
ii  python3-lxml                   4.3.2-1+deb10u3
ii  python3-memcache               1.59-1
ii  python3-migrate                0.11.0-5
ii  python3-msgpack                0.5.6-1+b1
ii  python3-mysqldb                1.3.10-2
ii  python3-oauthlib               2.1.0-1
ii  python3-openstackclient        3.16.2-1
ii  python3-oslo.cache             1.30.3-1
ii  python3-oslo.concurrency       3.27.0-3
ii  python3-oslo.config            1:6.4.1-1
ii  python3-oslo.context           2.21.0-2
ii  python3-oslo.db                4.40.0-3
ii  python3-oslo.i18n              3.21.0-2
ii  python3-oslo.log               3.39.0-2
ii  python3-oslo.messaging         8.1.4-1+deb10u1
ii  python3-oslo.middleware        3.36.0-2
ii  python3-oslo.policy            1.38.1-2
ii  python3-oslo.serialization     2.27.0-2
ii  python3-oslo.utils             3.36.5-0+deb10u1
ii  python3-osprofiler             2.3.0-3
ii  python3-passlib                1.7.1-1
ii  python3-pbr                    4.2.0-5
ii  python3-pycadf                 2.7.0-2
ii  python3-pymysql                0.9.3-1
ii  python3-pysaml2                4.5.0-4+deb10u1
ii  python3-routes                 2.4.1-1
ii  python3-scrypt                 0.8.0-0.1+b1
ii  python3-six                    1.12.0-1
ii  python3-sqlalchemy             1.2.18+ds1-2
ii  python3-stevedore              1.29.0-2
ii  python3-tz                     2019.1-1
ii  python3-webob                  1:1.8.5-1

python3-keystone recommends no packages.

python3-keystone suggests no packages.

-- debconf information excluded

-- debsums errors found:
perl: warning: Setting locale failed.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
debsums: changed file
/usr/lib/python3/dist-packages/keystone/notifications.py (from
python3-keystone package)

Reply via email to