-
Notifications
You must be signed in to change notification settings - Fork 582
API-1844: Update KMSConfig to support all external kms plugins #2622
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
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -2,54 +2,33 @@ package v1 | |||||
|
|
||||||
| // KMSConfig defines the configuration for the KMS instance | ||||||
| // that will be used with KMSEncryptionProvider encryption | ||||||
| // +kubebuilder:validation:XValidation:rule="has(self.type) && self.type == 'AWS' ? has(self.aws) : !has(self.aws)",message="aws config is required when kms provider type is AWS, and forbidden otherwise" | ||||||
| // +union | ||||||
| type KMSConfig struct { | ||||||
| // type defines the kind of platform for the KMS provider. | ||||||
| // Available provider types are AWS only. | ||||||
| // managementModel defines how KMS plugins are managed. | ||||||
| // Valid values are "External". | ||||||
| // When set to External, encryption keys are managed by a user-deployed | ||||||
| // KMS plugin that communicates via UNIX domain socket using KMS V2 API. | ||||||
| // | ||||||
| // +unionDiscriminator | ||||||
| // +required | ||||||
| Type KMSProviderType `json:"type"` | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For serialization safety and to adhere to v1 API guarantees, we do not allow removal of any fields directly, even if it was only accessible in tech preview. Instead, we ask to tombstone them (removal with a comment), see some examples #2256 and #2576 This also means that the field name may not be used again, so we should be certain that we're ok with the removal.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you for review. That makes sense. I'll update this PR based on your comments, once we finalize the design. |
||||||
|
|
||||||
| // aws defines the key config for using an AWS KMS instance | ||||||
| // for the encryption. The AWS KMS instance is managed | ||||||
| // by the user outside the purview of the control plane. | ||||||
| // | ||||||
| // +unionMember | ||||||
| // +kubebuilder:validation:Enum=External | ||||||
| // +kubebuilder:default=External | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you help me understand why you'd like a default to be set here? We generally try not to set defaults via the API but instead through controllers and document the default behaviour via godocs, allowing for flexibility in the future. Since we only have one optional for now, is anything depending on this field to be explicitly set? For additional context, see: https://github.com/openshift/enhancements/blob/master/dev-guide/api-conventions.md#defaulting |
||||||
| // +optional | ||||||
| AWS *AWSKMSConfig `json:"aws,omitempty"` | ||||||
| } | ||||||
| ManagementModel ManagementModel `json:"managementModel,omitempty"` | ||||||
|
|
||||||
| // AWSKMSConfig defines the KMS config specific to AWS KMS provider | ||||||
| type AWSKMSConfig struct { | ||||||
| // keyARN specifies the Amazon Resource Name (ARN) of the AWS KMS key used for encryption. | ||||||
| // The value must adhere to the format `arn:aws:kms:<region>:<account_id>:key/<key_id>`, where: | ||||||
| // - `<region>` is the AWS region consisting of lowercase letters and hyphens followed by a number. | ||||||
| // - `<account_id>` is a 12-digit numeric identifier for the AWS account. | ||||||
| // - `<key_id>` is a unique identifier for the KMS key, consisting of lowercase hexadecimal characters and hyphens. | ||||||
| // | ||||||
| // +kubebuilder:validation:MaxLength=128 | ||||||
| // +kubebuilder:validation:MinLength=1 | ||||||
| // +kubebuilder:validation:XValidation:rule="self.matches('^arn:aws:kms:[a-z0-9-]+:[0-9]{12}:key/[a-f0-9-]+$')",message="keyARN must follow the format `arn:aws:kms:<region>:<account_id>:key/<key_id>`. The account ID must be a 12 digit number and the region and key ID should consist only of lowercase hexadecimal characters and hyphens (-)." | ||||||
| // +required | ||||||
| KeyARN string `json:"keyARN"` | ||||||
| // region specifies the AWS region where the KMS instance exists, and follows the format | ||||||
| // `<region-prefix>-<region-name>-<number>`, e.g.: `us-east-1`. | ||||||
| // Only lowercase letters and hyphens followed by numbers are allowed. | ||||||
| // endpoint specifies the UNIX domain socket endpoint for communicating with the external KMS plugin. | ||||||
| // The endpoint must follow the format "unix:///path". | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| // Abstract Linux sockets (i.e. "unix:///@abstractname") are not supported. | ||||||
| // | ||||||
| // +kubebuilder:validation:MaxLength=64 | ||||||
| // +kubebuilder:validation:MinLength=1 | ||||||
| // +kubebuilder:validation:XValidation:rule="self.matches('^[a-z0-9]+(-[a-z0-9]+)*$')",message="region must be a valid AWS region, consisting of lowercase characters, digits and hyphens (-) only." | ||||||
| // +kubebuilder:validation:MaxLength=120 | ||||||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Based on https://man7.org/linux/man-pages/man7/unix.7.html ("Address format" section), maximum length is 108. It is less for mac. So I decided to set it to 120. |
||||||
| // +kubebuilder:validation:MinLength=9 | ||||||
| // +kubebuilder:validation:XValidation:rule="self.matches('^unix:///[^@ ][^ ]*$')",message="endpoint must follow the format 'unix:///path'" | ||||||
| // +required | ||||||
| Region string `json:"region"` | ||||||
| Endpoint string `json:"endpoint,omitempty"` | ||||||
| } | ||||||
|
|
||||||
| // KMSProviderType is a specific supported KMS provider | ||||||
| // +kubebuilder:validation:Enum=AWS | ||||||
| type KMSProviderType string | ||||||
| // ManagementModel describes how the KMS plugin is managed. | ||||||
| // Valid values are "External". | ||||||
| type ManagementModel string | ||||||
|
|
||||||
| const ( | ||||||
| // AWSKMSProvider represents a supported KMS provider for use with AWS KMS | ||||||
| AWSKMSProvider KMSProviderType = "AWS" | ||||||
| // External represents a KMS plugin that is managed externally and accessed via unix domain socket | ||||||
| External ManagementModel = "External" | ||||||
| ) | ||||||
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.
Out of curiosity, what would potentially be other possible values in the future? Would there be any cloud-provided specific plugins supported here since you mentioned that AWS is obsolete? Just trying to understand what would be the api changes would look like in the future.