-
Notifications
You must be signed in to change notification settings - Fork 736
Standard grpc mTLS #3909
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
Standard grpc mTLS #3909
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #3909 +/- ##
==========================================
+ Coverage 89.26% 89.33% +0.07%
==========================================
Files 260 260
Lines 14693 14735 +42
==========================================
+ Hits 13116 13164 +48
+ Misses 1577 1571 -6 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
5957e41 to
c26c20c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a quick pass with some nitpicks, didn't test functionally yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, except for one small nit.
EDIT: Updated review for the new code changes.
1b18395 to
2108790
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey, @georgeliao! So now, in the local environment, the GUI works fine both when upgrading from the old certificates and when starting with no certificates. But in the case of the CLI, it works when starting with no certificates, but if I upgrade from old certificates, I get the following error
E0211 14:23:49.406977684 36809 ssl_transport_security.cc:1316] Handshake failed with fatal error SSL_ERROR_SSL: error:0A000086:SSL routines::certificate verify failed.
And in the snap, both when starting fresh or when upgrading, I get the following
[error] [client] Caught an unhandled exception: failed to open file '/var/snap/multipass/commondata/multipassd/certificates/multipass_root_cert.pem': No such file or directory(2)
About this root certificate is unsync with server certificate issue in development environment, maybe we can add a check at here, which checks not only the existence of the certificates but also whether the root certificate is the one who signed the server certificate. If not, everything will be re-created. This check can be done by openssl c-api. However, not sure the juice worth the squeeze.
This is fixed in the latest version of the PR. |
|
Yeah, for the dev environment, I don't think it's worth doing the effort. We already have to remove stuff manually, so this is just an extra thing to remove. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great, now both the CLI and the GUI work as expected, both locally and in the snap, both when upgrading or installing fresh. Thanks, @georgeliao!
Now, one thing to discuss with everyone: the purpose of these changes was so that we could remove our grpc patches, and that goal is accomplished by this PR. And now the CLI verifies the server certificate, which couldn't be avoided without the patches. But the GUI can avoid verifying the server certificate, using the plain vanilla grpc dart library. My question is: should the GUI also verify the server certificate, to be in line with the CLI, or should we keep the existing, functioning behavior of not having the GUI verify the server certificate?
|
As discussed elsewhere, let's have the GUI also adhere to the new scheme, preferably in a separate PR. |
291dc64 to
10ecc25
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @georgeliao, lots of good work in here!
I am only doing a tertiary review in this case, so I glossed over most of the scary low-level certificate stuff. @andrei-toterman and @xmkg, we're relying on you on that front 💪 If you could provide assurance that you've verified sanity of all the nitty-gritty, that would be much appreciated. All of this would be for nothing if security were somehow broken on the foundation...
Other than that, I have some proposals for path derivation and the initialization. Let me know what you think.
ac0e4ee to
ee42308
Compare
…ts sub-folder." This reverts commit 26415bc. Revert "[qemu platform] enforce ower_all permission to network sub-folder." This reverts commit 6a1879f. Revert "[open ssh] enforce permission to ssh-keys sub-folder." This reverts commit b2afed4. Revert "[vault] enforce ower_all permission to vault sub-folder." This reverts commit 1ad954d. Revert "[daemon] enforce ower_all permission to multipassd-vm-instances.json file." This reverts commit 72f55a9.
Step1: recursively restrict everything before the creation of certificates directory, opens up the data directory only for other user read. Step 2: create certificate directory and certificates with the right permission. Or overwrite the permissions in the case of existing certificates directory and certificate files.
…ssing root certificate.
1bcc58b to
7254f69
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, everything works as expected on Ubuntu!
…the other users access
|
Can you do a review on the last two commits? Basically, the recursive permission setting on the data folder overwrites the root cert permission to be not accessible to client process. The exact behavior is that the server restart causes the client process unable to read the root cert due to permission issue. The last two commits are to fix that. By the way, also feel free to review the file permission related code, very little code in The functional testing is the same, includes multipass upgrade, new installation and plus the server restart. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, good catch with the restart issue! This time I tested the restart as well. Everything looks good to me on the Linux side of things!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks Jia, just a small comment, but otherwise looks good. Approving modulo suggestion
Co-authored-by: Ricardo Abreu <6698114+ricab@users.noreply.github.com> Signed-off-by: George Liao <georgeliaojia@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re-approving the latest changes.
Standard grpc mTLS
|
The merge queue pipeline should be fixed once #4017 lands. |
MULTI-1765
Public side of https://github.com/canonical/multipass-private/pull/719
A few things to note
The
make_cert_key_pairfunction originally handles the generation of both server and client key-certificate pairs . Theserver_nameparameter determines the use case, whenserver_nameis an empty string, it indicated the client key-certificate case. In the standard gRPC TLS scheme, the root key-certificate pair is added.Now, the role of the
make_cert_key_pairfunction is still generating and holding server and client key-certificate pairs. However, the server certificate has evolved into a signed server certificate. As the result, the server side branch must first generate root key-certificate pair and use it to sign the newly created server certificate.Previously the constructor of
X509Certonly handled server and client certifcate generation, distinguishing between them based on whetherserver_addresswas empty. Now, with the introduction of root, server and client certifcate, the dispatch is managed by using theCertTypeenumeration.Additionally, the
X509Certconstructor has been refined to generate certificates in a standard format. Key differences between before and after include adjustments to the serial number format and the inclusion of X509v3 extensions. To inspect a certificate, you can use the following command:openssl x509 -in <cert_path> -noout -textThe certificate paths are as follows:
/root/.local/share/multipassd/certificates/localhost.pem/home/<user name>/.local/share/multipass-client-certificate/multipass_cert.pem/usr/local/share/ca-certificates/multipass_root_cert.pemSnap environment considerations
In the snap environment, the root certificate is stored at
/var/snap/multipass/common/data/multipassd/certificates/multipass_root_cert.pemUnlike
/root/,/var/snap/directory allows other users view its files, making this setup feasible.Certificate regeneration and migration
The root certificate and server key-certificate pairs area automatically regenerated if either is missing. This mechanism ensures a smooth server key-certificate pair migration when updating Multipass. Upon upgrading, the server startup process will automatically generates root key-certificate pair and use it to sign a fresh server certificate. Consequently, the original server key-certificate pair will be overwritten, enabling successful verification under the new standard grpc TLS.
The Multipass upgrade process should be included in the functional testing as well, both the cmd and gui clients should be tested.
Unit test adaptations
The unit tests have been modified to accommodate changes in the gRPC TLS verification process. The key adjustments include:
get_root_cert_pathto allow usage of string-based certificates.MockCertProviderbeing used on both server side and client to provide key-certificate pair. In the unit testing environment, they can be the same.Following the commit history and messages is also a helpful way to understand changes that have been made.