[fix][proxy] Refresh auth data if ProxyLookupRequests - #20067
Merged
michaeljmarshall merged 14 commits intoApr 11, 2023
Merged
Conversation
michaeljmarshall
requested review from
RobertIndie,
eolivelli,
lhotari,
merlimat and
nodece
April 11, 2023 03:54
nodece
reviewed
Apr 11, 2023
Member
Author
|
@cbornet - I think this is a necessary bug fix for 3.0. Without it, OIDC will not work correctly through the pulsar proxy. This bug was not introduced recently, but it didn't matter until now because the OIDC work exposes the bug. I've been fighting with CI all day due to flaky tests (and some legitimate failures, too). If we're able to hold off on creating |
michaeljmarshall
added a commit
to michaeljmarshall/pulsar
that referenced
this pull request
Apr 20, 2023
Fixes: apache#10816 PIP: apache#19771 Supersedes: apache#19026 Depends on: apache#20062 The Pulsar Proxy does not properly handle authentication data refresh when in state `ProxyLookupRequests`. The consequence is described in apache#10816. Essentially, the problem is that the proxy caches stale authentication data and sends it to the broker leading to connection failures. apache#17831 attempted to fix the underlying problem, but it missed an important edge cases. Specifically, it missed the case that the `ConnectionPool` will have multiple connections when a lookup gets redirected. As such, the following problem exists (and is fixed by this PR): 1. Client opens connection to perform lookups. 2. Proxy connects to broker 1 to get the topic ownership info. 3. Time passes. 4. Client does an additional lookup, and this topic is on a newly created broker 2. In this case, the proxy opens a new connection with the stale client auth data. 5. Broker 2 rejects the connection because it fails with expired authentication. * Remove some of the implementation from apache#17831. This new implementation still allows a broker to challenge the client through the proxy, but notably, it limits the number of challenges sent to the client. Further, the proxy does not challenge the client when the auth data is not expired. * Introduce authentication refresh in the proxy so that the proxy challenges the client any time the auth data is expired. * Update the `ProxyClientCnx` to get the `clientAuthData` from the `ProxyConnection` to ensure that it gets new authentication data. * Add clock skew to the `AuthenticationProviderToken`. This is necessary to make some of the testing not flaky and it will also be necessary for users to configure in their clusters. The `ProxyRefreshAuthTest` covers the existing behavior and I expanded it to cover the edge case described above. Additionally, testing this part of the code will be much easier to test once we implement apache#19624. - [x] `doc-not-needed` PR in forked repository: the relevant tests pass locally, so I am going to skip the forked tests. (cherry picked from commit 075b625)
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes: #10816
PIP: #19771
Supersedes: #19026
Depends on: #20062
Motivation
The Pulsar Proxy does not properly handle authentication data refresh when in state
ProxyLookupRequests. The consequence is described in #10816. Essentially, the problem is that the proxy caches stale authentication data and sends it to the broker leading to connection failures.#17831 attempted to fix the underlying problem, but it missed an important edge cases. Specifically, it missed the case that the
ConnectionPoolwill have multiple connections when a lookup gets redirected. As such, the following problem exists (and is fixed by this PR):Modifications
ProxyClientCnxto get theclientAuthDatafrom theProxyConnectionto ensure that it gets new authentication data.AuthenticationProviderToken. This is necessary to make some of the testing not flaky and it will also be necessary for users to configure in their clusters.Verifying this change
The
ProxyRefreshAuthTestcovers the existing behavior and I expanded it to cover the edge case described above.Additionally, testing this part of the code will be much easier to test once we implement #19624.
Documentation
doc-not-neededMatching PR in forked repository
PR in forked repository: the relevant tests pass locally, so I am going to skip the forked tests.