Avoid emitting informational headers to untrusted clients#1282
Merged
Conversation
The inbound proxy sets the `l5d-proxy-error` and `l5d-proxy-connection` headers when an error is encountered. This leaks information about the proxy to potentially untrusted clients. This change modifies the error handling behavior to only emit these headers from the inbound proxy when the client uses mesh identity. In doing so, we modify the `inbound::NewSetIdentiyHeader` layer to use `ExtractParam<tls::ConditionalServerTls, _>` to parameterize the server connection's identity to be consistent with the rescue parameters. This precipitated modifying the default impls for `ExtractParam` so that we can provide an impl for `()` that simply uses the target type. A new `CloneParam` type is introduced to replicate the former behavior.
hawkw
reviewed
Sep 22, 2021
Contributor
hawkw
left a comment
There was a problem hiding this comment.
overall, this looks good, but i was curious about the potential impact of moving all error recovery into ServerRescue --- there's a comment in the stack about ClientRescue being necessary to ensure error metrics aren't double-counted; what's the story with that?
hawkw
approved these changes
Sep 22, 2021
Contributor
hawkw
left a comment
There was a problem hiding this comment.
cool that we were able to back out the metrics change and it still works --- lgtm!
olix0r
added a commit
to linkerd/linkerd2
that referenced
this pull request
Sep 23, 2021
This release improves the proxy's error handling, introducing a new `l5d-proxy-connection` header to signal from an inbound proxy when its peers outbound connections should be torn down. Furthermore, error handling has been improved so that the `l5d-proxy-error` header is only sent to trusted peers--the inbound proxy only emits this header when its client is meshed; and the outbound proxy can be configured to disable these headers via configuration. --- * build(deps): bump hyper from 0.14.12 to 0.14.13 (linkerd/linkerd2-proxy#1273) * build(deps): bump tracing-subscriber from 0.2.22 to 0.2.23 (linkerd/linkerd2-proxy#1274) * tracing: use `Span::or_current` when spawning tasks (linkerd/linkerd2-proxy#1272) * dns: Log TTL with resolution (linkerd/linkerd2-proxy#1275) * error-respond: Support stack target configuration (linkerd/linkerd2-proxy#1276) * build(deps): bump tracing-subscriber from 0.2.23 to 0.2.24 (linkerd/linkerd2-proxy#1277) * build(deps): bump tracing from 0.1.27 to 0.1.28 (linkerd/linkerd2-proxy#1278) * build(deps): bump tokio from 1.11.0 to 1.12.0 (linkerd/linkerd2-proxy#1279) * build(deps): bump http from 0.2.4 to 0.2.5 (linkerd/linkerd2-proxy#1280) * Support a `l5d-proxy-connection: close` header (linkerd/linkerd2-proxy#1281) * Avoid emitting informational headers to untrusted clients (linkerd/linkerd2-proxy#1282) * outbound: Only honor the `l5d-proxy-connection` header when meshed (linkerd/linkerd2-proxy#1283) * outbound: Disable informational headers by config (linkerd/linkerd2-proxy#1284) * outbound: Strip peer-sent `l5d-proxy-error` headers (linkerd/linkerd2-proxy#1285)
alpeb
pushed a commit
to linkerd/linkerd2
that referenced
this pull request
Sep 23, 2021
This release improves the proxy's error handling, introducing a new `l5d-proxy-connection` header to signal from an inbound proxy when its peers outbound connections should be torn down. Furthermore, error handling has been improved so that the `l5d-proxy-error` header is only sent to trusted peers--the inbound proxy only emits this header when its client is meshed; and the outbound proxy can be configured to disable these headers via configuration. --- * build(deps): bump hyper from 0.14.12 to 0.14.13 (linkerd/linkerd2-proxy#1273) * build(deps): bump tracing-subscriber from 0.2.22 to 0.2.23 (linkerd/linkerd2-proxy#1274) * tracing: use `Span::or_current` when spawning tasks (linkerd/linkerd2-proxy#1272) * dns: Log TTL with resolution (linkerd/linkerd2-proxy#1275) * error-respond: Support stack target configuration (linkerd/linkerd2-proxy#1276) * build(deps): bump tracing-subscriber from 0.2.23 to 0.2.24 (linkerd/linkerd2-proxy#1277) * build(deps): bump tracing from 0.1.27 to 0.1.28 (linkerd/linkerd2-proxy#1278) * build(deps): bump tokio from 1.11.0 to 1.12.0 (linkerd/linkerd2-proxy#1279) * build(deps): bump http from 0.2.4 to 0.2.5 (linkerd/linkerd2-proxy#1280) * Support a `l5d-proxy-connection: close` header (linkerd/linkerd2-proxy#1281) * Avoid emitting informational headers to untrusted clients (linkerd/linkerd2-proxy#1282) * outbound: Only honor the `l5d-proxy-connection` header when meshed (linkerd/linkerd2-proxy#1283) * outbound: Disable informational headers by config (linkerd/linkerd2-proxy#1284) * outbound: Strip peer-sent `l5d-proxy-error` headers (linkerd/linkerd2-proxy#1285)
cratelyn
added a commit
that referenced
this pull request
Feb 13, 2025
`linkerd-app-core` includes an error recovery body middleware. this middleware will gracefully catch and report errors encountered when polling an inner body, and via an `R`-typed recovery strategy provided by the caller, will attempt to map the error to a gRPC status code denoting an error. before we upgrade to hyper 1.0 in service of linkerd/linkerd2#8733, we add some test coverage to ensure that we preserve the behavior of this middleware. see: * linkerd/linkerd2#8733 * #3614. for historical context on this tower layer, see: * #222 * #1246 * #1282 --- * refactor(http/retry): outline `ForwardCompatibleBody<B>` in #3559 (4b53081), we introduced a backported `Frame<T>` type, and a `ForwardCompatibleBody<B>` type that allows us to interact with a `http_body::Body` circa 0.4.6 in terms of frame-based interfaces that match those of the 1.0 interface. see linkerd/linkerd2#8733 for more information on upgrading hyper. in #3559, we narrowly added this as an internal submodule of the `linkerd-http-retry` library. these facilities however, would have utility in other places such as `linkerd-app-core`. this commit pulls these compatibility shims out into a `linkerd-http-body-compat` library so that they can be imported and reused elsewhere. Signed-off-by: katelyn martin <[email protected]> * nit(http/body-compat): tidy `combinators` imports Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): hoist `errors::code_header` helper Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): `l5d-*` constants are headers these are header values. `http::HeaderName` has a const fn constructor, so let's use that. Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): grpc constants are headers Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): hoist `l5d-` and `grpc-` constants Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): outline `ResponseBody` middleware we'll add a few tests for this middleware shortly. this commit moves this middleware out into its own submodule. Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): encapsulate `ResponseBody` enum for other body middleware, we hide inner enum variants and their constituent members by using the "inner" pattern. this commit tweaks `ResponseBody` to follow suit, such that it now holds an `Inner`, but does not expose its passthrough and rescue variants to callers. Signed-off-by: katelyn martin <[email protected]> * docs(app/core): document `ResponseBody<R, B>` this adds a small documentation comment describing what this type does. Signed-off-by: katelyn martin <[email protected]> * refactor(app/core): a unit test suite for rescue body this commit introduces a test suite for our error recovery middleware. this body middleware provides a mechanism to "rescue" errors, gracefully mapping an error encountered when polling a gRPC body into e.g. trailers with a gRPC status code. before we upgrade this middleware in service of linkerd/linkerd2#8733, we add some test coverage to ensure that we preserve this middleware. Signed-off-by: katelyn martin <[email protected]> --------- Signed-off-by: katelyn martin <[email protected]>
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.
The inbound proxy sets the
l5d-proxy-errorandl5d-proxy-connectionheaders when an error is encountered. This leaks information about the
proxy to potentially untrusted clients.
This change modifies the error handling behavior to only emit these
headers from the inbound proxy when the client uses mesh identity.
In doing so, we modify the
inbound::NewSetIdentiyHeaderlayer to useExtractParam<tls::ConditionalServerTls, _>to parameterize the serverconnection's identity to be consistent with the rescue parameters. This
precipitated modifying the default impls for
ExtractParamso that wecan provide an impl for
()that simply uses the target type. A newCloneParamtype is introduced to replicate the former behavior.