Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce meshtls facade to hide rustls crate #1353

Merged
merged 4 commits into from
Nov 3, 2021
Merged

Conversation

olix0r
Copy link
Member

@olix0r olix0r commented Nov 3, 2021

In #1351, we add an alternate identity/mtls implementation that uses
boring. To setup for that, this change introduces a new meshtls
crate that serves as a facade for application crates to depend on,
independently of the actual crypto implementation.

This change does not change any runtime logic and sets up for #1351 to
enable an alternate TLS implementation as a build-time configuration.

@olix0r olix0r requested a review from a team November 3, 2021 03:46
In #1351, we add an alternate identity/mtls implementation that uses
`boring`. To setup for that, this change introduces a new `meshtls`
crate that serves as a facade for application crates to depend on,
independently of the actual crypto implementation.

This change does not change any runtime logic and sets up for #1351 to
enable an alternate TLS implementation as a build-time configuration.
Copy link
Member

@hawkw hawkw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overall, this seems like the best possible way i could think of to structure the facade crate; it feels a big ugly, but i feel like abstracting over the different implementations with feature flags is always going to be ugly, so this looks like the neatest way of doing it.

i think it could be worth having the various unreachable!() panics include messages, just in case someone compiles a build where all the TLS implementations are disabled? but, that's not really a blocker.

also, i noticed a couple places where it looks like we forgot to forward an implementation through a wrapper; we should probably fix that before merging this?

other than that, lgtm!

return Connect::Rustls(new_client.new_service(target));
}

unreachable!()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit/TIOLI: not a big deal, but maybe this should say something like

Suggested change
unreachable!()
unreachable!("attempted o initiate a mTLS connection, but no TLS backends were enabled at compile time!")

or something, just in case someone makes a build of the proxy where no backends were enabled?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alternatively, we could probably make this unreachable at compile-time by putting #[cfg(any(feature = "rustls", feature = "boring", ...etc))] on the Service impl (and other stuff in this crate), but i'm not sure if that would make other stuff more complicated...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed this to use a match for all of these so there's no longer an unreachable case. I've added a build.rs check that ensures at least one feature is enabled.

linkerd/meshtls/src/client.rs Outdated Show resolved Hide resolved
linkerd/meshtls/src/client.rs Outdated Show resolved Hide resolved
linkerd/meshtls/src/lib.rs Outdated Show resolved Hide resolved
@olix0r olix0r merged commit bb26cdc into main Nov 3, 2021
@olix0r olix0r deleted the ver/boring-minus-boring branch November 3, 2021 22:48
Comment on lines +2 to +15
// Ensure that at least one TLS implementation feature is enabled.
static TLS_FEATURES: &[&str] = &["rustls"];
if !TLS_FEATURES
.iter()
.any(|f| std::env::var_os(&*format!("CARGO_FEATURE_{}", f.to_ascii_uppercase())).is_some())
{
return Err(format!(
"at least one of the following TLS implementations must be enabled: '{}'",
TLS_FEATURES.join("', '"),
)
.into());
}

Ok(())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FWIW, I think this could be achieved without a build script by just sticking

#![cfg(not(any(feature = "rustls"))]
compile_error!("at least one of the following TLS implementations must be enabled: 'rustls}''")

in lib.rs (and adding the other implementation feature flags as needed)

olix0r added a commit to linkerd/linkerd2 that referenced this pull request Nov 4, 2021
This release improves retries so that requests without a
`content-length` can be retried. This should permit requests emitted by
grpc-go to be retried.

Discovery diagnostics have also been improved by ensuring that service
discovery updates are logged at DEBUG. Previously these messages were
only emitted at the TRACE level.

---

* build(deps): bump hdrhistogram from 7.3.0 to 7.4.0 (linkerd/linkerd2-proxy#1330)
* build(deps): bump libc from 0.2.104 to 0.2.105 (linkerd/linkerd2-proxy#1332)
* tracing: update `tracing-subscriber` to v0.3.x (linkerd/linkerd2-proxy#1327)
* tls: Avoid circular dependencies (linkerd/linkerd2-proxy#1334)
* Fix misspecified dependencies (linkerd/linkerd2-proxy#1335)
* build(deps): bump tracing-subscriber from 0.2.25 to 0.3.1 (linkerd/linkerd2-proxy#1328)
* update `tonic`, `prost`, and `linkerd2-proxy-api` (linkerd/linkerd2-proxy#1339)
* Refactor mTLS & identity crates (linkerd/linkerd2-proxy#1333)
* Log discovery changes at DEBUG (linkerd/linkerd2-proxy#1340)
* build(deps): bump tokio-util from 0.6.8 to 0.6.9 (linkerd/linkerd2-proxy#1342)
* build(deps): bump tokio from 1.12.0 to 1.13.0 (linkerd/linkerd2-proxy#1343)
* build(deps): bump tokio-stream from 0.1.7 to 0.1.8 (linkerd/linkerd2-proxy#1344)
* retry: allow retrying requests without content-length headers  (linkerd/linkerd2-proxy#1341)
* retry: Simplify ReplayBody::poll_data for readability (linkerd/linkerd2-proxy#1346)
* build(deps): bump libc from 0.2.105 to 0.2.106 (linkerd/linkerd2-proxy#1348)
* reorg: Decouple TLS implementation from proxy client (linkerd/linkerd2-proxy#1349)
* build(deps): bump actions/checkout from 2.3.5 to 2.4.0 (linkerd/linkerd2-proxy#1352)
* Introduce `meshtls` facade to hide rustls crate (linkerd/linkerd2-proxy#1353)
olix0r added a commit to linkerd/linkerd2 that referenced this pull request Nov 5, 2021
This release improves retries so that requests without a
`content-length` can be retried. This should permit requests emitted by
grpc-go to be retried.

Discovery diagnostics have also been improved by ensuring that service
discovery updates are logged at DEBUG. Previously these messages were
only emitted at the TRACE level.

---

* build(deps): bump hdrhistogram from 7.3.0 to 7.4.0 (linkerd/linkerd2-proxy#1330)
* build(deps): bump libc from 0.2.104 to 0.2.105 (linkerd/linkerd2-proxy#1332)
* tracing: update `tracing-subscriber` to v0.3.x (linkerd/linkerd2-proxy#1327)
* tls: Avoid circular dependencies (linkerd/linkerd2-proxy#1334)
* Fix misspecified dependencies (linkerd/linkerd2-proxy#1335)
* build(deps): bump tracing-subscriber from 0.2.25 to 0.3.1 (linkerd/linkerd2-proxy#1328)
* update `tonic`, `prost`, and `linkerd2-proxy-api` (linkerd/linkerd2-proxy#1339)
* Refactor mTLS & identity crates (linkerd/linkerd2-proxy#1333)
* Log discovery changes at DEBUG (linkerd/linkerd2-proxy#1340)
* build(deps): bump tokio-util from 0.6.8 to 0.6.9 (linkerd/linkerd2-proxy#1342)
* build(deps): bump tokio from 1.12.0 to 1.13.0 (linkerd/linkerd2-proxy#1343)
* build(deps): bump tokio-stream from 0.1.7 to 0.1.8 (linkerd/linkerd2-proxy#1344)
* retry: allow retrying requests without content-length headers  (linkerd/linkerd2-proxy#1341)
* retry: Simplify ReplayBody::poll_data for readability (linkerd/linkerd2-proxy#1346)
* build(deps): bump libc from 0.2.105 to 0.2.106 (linkerd/linkerd2-proxy#1348)
* reorg: Decouple TLS implementation from proxy client (linkerd/linkerd2-proxy#1349)
* build(deps): bump actions/checkout from 2.3.5 to 2.4.0 (linkerd/linkerd2-proxy#1352)
* Introduce `meshtls` facade to hide rustls crate (linkerd/linkerd2-proxy#1353)
* rustls: Configure the initial TLS client with trust roots (linkerd/linkerd2-proxy#1355)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants