Skip to content

Commit 8a73c46

Browse files
authored
Merge pull request #72 from zama-ai/piizama/kms-connector-awskms-signing-key
feat(mpc-party): add kms-connector awskms key and service account
2 parents 4dd98e9 + 197c00c commit 8a73c46

File tree

9 files changed

+159
-5
lines changed

9 files changed

+159
-5
lines changed

examples/mpc-party/main.tf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
# Deploy MPC Party infrastructure using the enhanced mpc-party module
66
module "mpc_party" {
7-
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.10"
7+
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.13"
88

99
# Network environment configuration
1010
network_environment = var.network_environment
@@ -98,6 +98,9 @@ module "mpc_party" {
9898
rds_vpc_id = var.rds_vpc_id
9999
rds_deletion_protection = var.rds_deletion_protection
100100

101+
# KMS-Connector Configuration
102+
kms_connector_enable_txsender_key = true
103+
101104
# Tagging
102105
common_tags = merge(var.additional_tags, {
103106
"Environment" = var.environment

examples/terragrunt-infra/kms-dev-v1/mpc-party/terraform.tfvars

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,5 @@ kms_enabled_nitro_enclaves = true
6262
# This image attestation SHA must be updated for each KMS enclave release image.
6363
kms_image_attestation_sha = "5292569b5945693afcde78e5a0045f4bf8c0a594d174baf1e6bccdf0e6338ebe46e89207054e0c48d0ec6deef80284ac"
6464
kms_deletion_window_in_days = 7
65+
66+
kms_connector_enable_txsender_key = true

examples/terragrunt-infra/kms-dev-v1/mpc-party/terragrunt.hcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ include "common" {
1313

1414
# Reference the mpc-network-provider example module
1515
terraform {
16-
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.10"
16+
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.13"
1717

1818
extra_arguments "tfvars" {
1919
commands = get_terraform_commands_that_need_vars()

examples/terragrunt-infra/zws-dev/mpc-party/terraform.tfvars

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,5 @@ kms_enabled_nitro_enclaves = true
6666
# This image attestation SHA must be updated for each KMS enclave release image.
6767
kms_image_attestation_sha = "5292569b5945693afcde78e5a0045f4bf8c0a594d174baf1e6bccdf0e6338ebe46e89207054e0c48d0ec6deef80284ac"
6868
kms_deletion_window_in_days = 7
69+
70+
kms_connector_enable_txsender_key = true

examples/terragrunt-infra/zws-dev/mpc-party/terragrunt.hcl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ include "common" {
1313

1414
# Reference the mpc-network-provider example module
1515
terraform {
16-
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.10"
16+
source = "git::https://github.com/zama-ai/terraform-mpc-modules.git//modules/mpc-party?ref=v0.1.13"
1717

1818
extra_arguments "tfvars" {
1919
commands = get_terraform_commands_that_need_vars()

modules/mpc-party/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ module "mpc_party" {
132132
rds_storage_encrypted = true
133133
rds_manage_master_user_password = true
134134
135+
# KMS-Connector Configuration
136+
kms_connector_enable_txsender_key = true
137+
kms_connector_txsender_key_usage = "SIGN_VERIFY"
138+
kms_connector_txsender_key_spec = "ECC_SECP256K1"
139+
135140
# RDS Network Configuration
136141
rds_allowed_cidr_blocks = ["10.0.0.0/16"]
137142
@@ -307,6 +312,7 @@ The module can optionally create:
307312
| Name | Source | Version |
308313
|------|--------|---------|
309314
| <a name="module_eks_managed_node_group"></a> [eks\_managed\_node\_group](#module\_eks\_managed\_node\_group) | terraform-aws-modules/eks/aws//modules/eks-managed-node-group | 21.0.6 |
315+
| <a name="module_iam_assumable_role_kms_connector"></a> [iam\_assumable\_role\_kms\_connector](#module\_iam\_assumable\_role\_kms\_connector) | terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc | 5.48.0 |
310316
| <a name="module_iam_assumable_role_mpc_party"></a> [iam\_assumable\_role\_mpc\_party](#module\_iam\_assumable\_role\_mpc\_party) | terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc | 5.48.0 |
311317
| <a name="module_rds_instance"></a> [rds\_instance](#module\_rds\_instance) | terraform-aws-modules/rds/aws | ~> 6.10 |
312318
| <a name="module_rds_security_group"></a> [rds\_security\_group](#module\_rds\_security\_group) | terraform-aws-modules/security-group/aws | ~> 5.3.0 |
@@ -316,8 +322,10 @@ The module can optionally create:
316322
| Name | Type |
317323
|------|------|
318324
| [aws_iam_policy.mpc_aws](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |
325+
| [aws_kms_alias.mpc_connector_tx_sender](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_alias) | resource |
319326
| [aws_kms_alias.mpc_party](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_alias) | resource |
320327
| [aws_kms_alias.mpc_party_backup](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_alias) | resource |
328+
| [aws_kms_external_key.mpc_connector_tx_sender](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_external_key) | resource |
321329
| [aws_kms_key.mpc_party](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
322330
| [aws_kms_key.mpc_party_backup](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
323331
| [aws_s3_bucket.vault_private_bucket](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket) | resource |
@@ -334,6 +342,7 @@ The module can optionally create:
334342
| [kubernetes_daemon_set_v1.aws_nitro_enclaves_device_plugin](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/daemon_set_v1) | resource |
335343
| [kubernetes_namespace.mpc_party_namespace](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/namespace) | resource |
336344
| [kubernetes_service.externalname](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service) | resource |
345+
| [kubernetes_service_account.mpc_kms_connector_service_account](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service_account) | resource |
337346
| [kubernetes_service_account.mpc_party_service_account](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/service_account) | resource |
338347
| [null_resource.validate_auto_resolved_node_sg](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource |
339348
| [random_id.mpc_party_suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |
@@ -365,6 +374,9 @@ The module can optionally create:
365374
| <a name="input_kms_backup_external_role_arn"></a> [kms\_backup\_external\_role\_arn](#input\_kms\_backup\_external\_role\_arn) | ARN of the backup vault for the KMS key | `string` | `null` | no |
366375
| <a name="input_kms_backup_vault_customer_master_key_spec"></a> [kms\_backup\_vault\_customer\_master\_key\_spec](#input\_kms\_backup\_vault\_customer\_master\_key\_spec) | Key spec for the backup vault | `string` | `"ASYMMETRIC_DEFAULT"` | no |
367376
| <a name="input_kms_backup_vault_key_usage"></a> [kms\_backup\_vault\_key\_usage](#input\_kms\_backup\_vault\_key\_usage) | Key usage for the backup vault | `string` | `"ENCRYPT_DECRYPT"` | no |
377+
| <a name="input_kms_connector_enable_txsender_key"></a> [kms\_connector\_enable\_txsender\_key](#input\_kms\_connector\_enable\_txsender\_key) | Whether to enable the KMS key for the kms-connector txsender | `bool` | `false` | no |
378+
| <a name="input_kms_connector_txsender_key_spec"></a> [kms\_connector\_txsender\_key\_spec](#input\_kms\_connector\_txsender\_key\_spec) | Specification for the KMS-Connector txsender (e.g., ECC\_SECG\_P256K1 for Ethereum key signing) | `string` | `"ECC_SECG_P256K1"` | no |
379+
| <a name="input_kms_connector_txsender_key_usage"></a> [kms\_connector\_txsender\_key\_usage](#input\_kms\_connector\_txsender\_key\_usage) | Key usage for KMS-Connector txsender | `string` | `"SIGN_VERIFY"` | no |
368380
| <a name="input_kms_cross_account_kms_key_id"></a> [kms\_cross\_account\_kms\_key\_id](#input\_kms\_cross\_account\_kms\_key\_id) | KMS key ID of KMS key created in a different AWS account | `string` | `""` | no |
369381
| <a name="input_kms_customer_master_key_spec"></a> [kms\_customer\_master\_key\_spec](#input\_kms\_customer\_master\_key\_spec) | Specification for the KMS customer master key (e.g., SYMMETRIC\_DEFAULT, RSA\_2048) | `string` | `"SYMMETRIC_DEFAULT"` | no |
370382
| <a name="input_kms_deletion_window_in_days"></a> [kms\_deletion\_window\_in\_days](#input\_kms\_deletion\_window\_in\_days) | Deletion window in days for KMS key | `number` | `30` | no |
@@ -445,6 +457,7 @@ The module can optionally create:
445457
| <a name="output_irsa_summary"></a> [irsa\_summary](#output\_irsa\_summary) | Summary of the IRSA role for MPC party |
446458
| <a name="output_k8s_configmap_summary"></a> [k8s\_configmap\_summary](#output\_k8s\_configmap\_summary) | Summary of the Kubernetes ConfigMap for MPC party |
447459
| <a name="output_k8s_service_account_summary"></a> [k8s\_service\_account\_summary](#output\_k8s\_service\_account\_summary) | Summary of the Kubernetes service account for MPC party |
460+
| <a name="output_kms_connector_tx_sender"></a> [kms\_connector\_tx\_sender](#output\_kms\_connector\_tx\_sender) | KMS Connector Transaction Sender KMS Key |
448461
| <a name="output_nitro_enclaves_summary"></a> [nitro\_enclaves\_summary](#output\_nitro\_enclaves\_summary) | Summary of the Nitro Enclaves for MPC party |
449462
| <a name="output_node_group_tolerations"></a> [node\_group\_tolerations](#output\_node\_group\_tolerations) | Kubernetes tolerations derived from EKS node group taints |
450463
| <a name="output_nodegroup_auto_assign_security_group_summary"></a> [nodegroup\_auto\_assign\_security\_group\_summary](#output\_nodegroup\_auto\_assign\_security\_group\_summary) | Summary of the auto resolved security group |

modules/mpc-party/main.tf

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,49 @@ resource "kubernetes_service_account" "mpc_party_service_account" {
247247
depends_on = [kubernetes_namespace.mpc_party_namespace, module.iam_assumable_role_mpc_party]
248248
}
249249

250+
module "iam_assumable_role_kms_connector" {
251+
source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
252+
version = "5.48.0"
253+
provider_url = data.aws_eks_cluster.cluster.identity[0].oidc[0].issuer
254+
create_role = true
255+
role_name = "mpc-${var.cluster_name}-${var.party_name}-connector"
256+
oidc_fully_qualified_subjects = ["system:serviceaccount:${var.k8s_namespace}:${var.k8s_service_account_name}-connector"]
257+
role_policy_arns = []
258+
depends_on = [kubernetes_namespace.mpc_party_namespace]
259+
}
260+
261+
resource "kubernetes_service_account" "mpc_kms_connector_service_account" {
262+
count = var.create_service_account ? 1 : 0
263+
264+
metadata {
265+
name = "${var.k8s_service_account_name}-connector"
266+
namespace = var.k8s_namespace
267+
268+
labels = merge({
269+
"app.kubernetes.io/name" = "mpc-connector"
270+
"app.kubernetes.io/component" = "service-account"
271+
"app.kubernetes.io/part-of" = "mpc-cluster"
272+
"app.kubernetes.io/managed-by" = "terraform"
273+
"mpc.io/party-name" = var.party_name
274+
}, var.service_account_labels)
275+
276+
annotations = merge({
277+
"terraform.io/module" = "mpc-party"
278+
"mpc.io/party-name" = var.party_name
279+
"eks.amazonaws.com/role-arn" = module.iam_assumable_role_kms_connector.iam_role_arn
280+
}, var.service_account_annotations)
281+
}
282+
depends_on = [kubernetes_namespace.mpc_party_namespace, module.iam_assumable_role_kms_connector]
283+
}
284+
285+
250286
# ***************************************
251287
# AWS KMS Key for MPC Party
252288
# ***************************************
253289
locals {
254-
create_mpc_party_key = var.kms_enabled_nitro_enclaves && !var.kms_use_cross_account_kms_key
255-
create_mpc_party_key_backup = var.kms_enabled_nitro_enclaves && var.kms_enable_backup_vault && !var.kms_use_cross_account_kms_key
290+
create_mpc_party_key = var.kms_enabled_nitro_enclaves && !var.kms_use_cross_account_kms_key
291+
create_mpc_party_key_backup = var.kms_enabled_nitro_enclaves && var.kms_enable_backup_vault && !var.kms_use_cross_account_kms_key
292+
create_mpc_connector_txsender_key = var.kms_connector_enable_txsender_key && !var.kms_use_cross_account_kms_key
256293
}
257294

258295
resource "aws_kms_key" "mpc_party" {
@@ -407,6 +444,73 @@ resource "aws_kms_alias" "mpc_party_backup" {
407444
target_key_id = aws_kms_key.mpc_party_backup[0].key_id
408445
}
409446

447+
# ***************************************
448+
# KMS-Connector Ethereum TxSender Key
449+
# ***************************************
450+
resource "aws_kms_external_key" "mpc_connector_tx_sender" {
451+
count = local.create_mpc_connector_txsender_key ? 1 : 0
452+
453+
description = "KMS Connector tx sender key for MPC Party"
454+
key_usage = var.kms_connector_txsender_key_usage
455+
key_spec = var.kms_connector_txsender_key_spec
456+
deletion_window_in_days = var.kms_deletion_window_in_days
457+
tags = var.tags
458+
459+
policy = jsonencode({
460+
Version = "2012-10-17"
461+
Statement = [
462+
{
463+
Effect = "Allow",
464+
Principal = {
465+
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${module.iam_assumable_role_kms_connector.iam_role_name}"
466+
},
467+
Action = [
468+
"kms:DescribeKey",
469+
"kms:GetPublicKey",
470+
"kms:Sign",
471+
"kms:Verify"
472+
],
473+
Resource = "*",
474+
},
475+
{
476+
Effect = "Allow",
477+
Principal = {
478+
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
479+
},
480+
Action = [
481+
"kms:Create*",
482+
"kms:Describe*",
483+
"kms:Enable*",
484+
"kms:List*",
485+
"kms:Put*",
486+
"kms:Update*",
487+
"kms:Revoke*",
488+
"kms:Disable*",
489+
"kms:Get*",
490+
"kms:Delete*",
491+
"kms:TagResource",
492+
"kms:UntagResource",
493+
"kms:ScheduleKeyDeletion",
494+
"kms:CancelKeyDeletion",
495+
"kms:ImportKeyMaterial",
496+
"kms:DeleteImportedKeyMaterial"
497+
],
498+
Resource = "*"
499+
}
500+
]
501+
})
502+
}
503+
504+
# ***************************************
505+
# KMS Key Alias for KMS-Connector Ethereum TxSender Key
506+
# ***************************************
507+
resource "aws_kms_alias" "mpc_connector_tx_sender" {
508+
count = local.create_mpc_connector_txsender_key ? 1 : 0
509+
510+
name = "alias/mpc-${var.party_name}-connector-txsender"
511+
target_key_id = aws_kms_external_key.mpc_connector_tx_sender[0].id
512+
}
513+
410514
# ***************************************
411515
# ConfigMap for MPC Party
412516
# ***************************************
@@ -446,6 +550,7 @@ resource "kubernetes_config_map" "mpc_party_config" {
446550
"KMS_CORE__PUBLIC_VAULT__STORAGE__S3__PREFIX" = ""
447551
"KMS_CORE__PRIVATE_VAULT__KEYCHAIN__AWS_KMS__ROOT_KEY_ID" = local.kms_key_id
448552
"KMS_CORE__PRIVATE_VAULT__KEYCHAIN__AWS_KMS__ROOT_KEY_SPEC" = var.kms_enabled_nitro_enclaves ? "symm" : null
553+
"KMS_CONNECTOR__TX_SENDER_AWS_KMS_KEY_ID" = var.kms_connector_enable_txsender_key ? aws_kms_external_key.mpc_connector_tx_sender[0].id : null
449554
}
450555

451556
depends_on = [kubernetes_namespace.mpc_party_namespace, aws_s3_bucket.vault_private_bucket, aws_s3_bucket.vault_public_bucket]

modules/mpc-party/outputs.tf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,16 @@ output "rds_summary" {
8989
} : null
9090
}
9191

92+
# KMS Connector KMS Key
93+
output "kms_connector_tx_sender" {
94+
description = "KMS Connector Transaction Sender KMS Key"
95+
value = var.kms_connector_enable_txsender_key ? {
96+
key_id = aws_kms_external_key.mpc_connector_tx_sender[0].id
97+
key_spec = aws_kms_external_key.mpc_connector_tx_sender[0].key_spec
98+
key_usage = aws_kms_external_key.mpc_connector_tx_sender[0].key_usage
99+
} : null
100+
}
101+
92102
# Node Group Tolerations
93103
output "node_group_tolerations" {
94104
description = "Kubernetes tolerations derived from EKS node group taints"

modules/mpc-party/variables.tf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,25 @@ variable "kms_deletion_window_in_days" {
363363
default = 30
364364
}
365365

366+
variable "kms_connector_enable_txsender_key" {
367+
type = bool
368+
description = "Whether to enable the KMS key for the kms-connector txsender"
369+
default = false
370+
}
371+
372+
373+
variable "kms_connector_txsender_key_usage" {
374+
type = string
375+
description = "Key usage for KMS-Connector txsender"
376+
default = "SIGN_VERIFY"
377+
}
378+
379+
variable "kms_connector_txsender_key_spec" {
380+
description = "Specification for the KMS-Connector txsender (e.g., ECC_SECG_P256K1 for Ethereum key signing)"
381+
type = string
382+
default = "ECC_SECG_P256K1"
383+
}
384+
366385
variable "kms_enable_backup_vault" {
367386
type = bool
368387
description = "Whether to enable the backup vault for the KMS key"

0 commit comments

Comments
 (0)