Skip to content

Commit d9b46e8

Browse files
authored
[NDR-235] Certificate generation for mTLS (#437)
* NDR-235 Certificate generation script * NDR-235 Remove local .tool-versions * NDR-235 add ssm params for certs and keys * NDR-235 tf fmt * DR-235 Ignore value field changes to smm param * DR-235 Fix reference * NDR-235 Use PDM kms key for param encryption * NDR-235 Update comment * NDR-235 Only create SSM params for persistent workspaces
1 parent c78f280 commit d9b46e8

File tree

9 files changed

+156
-0
lines changed

9 files changed

+156
-0
lines changed

infrastructure/kms_pdm.tf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module "pdm_encryption_key" {
2+
source = "./modules/kms"
3+
kms_key_name = "alias/pdm-encryption-key-kms-${terraform.workspace}"
4+
kms_key_description = "Custom KMS Key to enable server side encryption for PDM resources"
5+
environment = var.environment
6+
owner = var.owner
7+
service_identifiers = ["ssm.amazonaws.com"]
8+
kms_deletion_window = var.kms_deletion_window
9+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
resource "aws_ssm_parameter" "secret" {
2+
count = var.ignore_value_changes ? 0 : 1
23
name = "/ndr/${terraform.workspace}/${var.name}"
34
type = var.type
45
description = var.description
56
value = var.value
7+
key_id = var.key_id
68
depends_on = [var.resource_depends_on]
79
tags = {
810
Name = "${terraform.workspace}-ssm"
911
}
12+
13+
}
14+
15+
16+
resource "aws_ssm_parameter" "secret_ignore_value_changes" {
17+
count = var.ignore_value_changes ? 1 : 0
18+
name = "/ndr/${terraform.workspace}/${var.name}"
19+
type = var.type
20+
description = var.description
21+
value = var.value
22+
key_id = var.key_id
23+
depends_on = [var.resource_depends_on]
24+
tags = {
25+
Name = "${terraform.workspace}-ssm"
26+
}
27+
28+
lifecycle {
29+
ignore_changes = [
30+
value,
31+
]
32+
}
1033
}
1134

infrastructure/modules/ssm_parameter/variable.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,15 @@ variable "owner" {
3737
description = "Owner tag used to identify the team or individual responsible for the resource."
3838
type = string
3939
}
40+
41+
variable "key_id" {
42+
type = string
43+
default = null
44+
description = "KMS Key ID or ARN to encrypt the SecureString parameter"
45+
}
46+
47+
variable "ignore_value_changes" {
48+
type = bool
49+
default = false
50+
description = "Whether to ignore changes to the value field"
51+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Creating Params to hold a copy of externally signed client cert and key
2+
module "ssm_param_external_client_cert" {
3+
count = local.is_sandbox ? 0 : 1
4+
source = "./modules/ssm_parameter"
5+
environment = var.environment
6+
owner = var.owner
7+
name = "external_client_cert"
8+
type = "SecureString"
9+
description = "Externally signed client certificate for mTLS"
10+
value = "REPLACE_ME"
11+
key_id = module.pdm_encryption_key.id
12+
ignore_value_changes = true
13+
}
14+
15+
module "ssm_param_external_client_key" {
16+
count = local.is_sandbox ? 0 : 1
17+
source = "./modules/ssm_parameter"
18+
environment = var.environment
19+
owner = var.owner
20+
name = "external_client_key"
21+
type = "SecureString"
22+
description = "Externally signed client certificate for mTLS"
23+
value = "REPLACE_ME"
24+
key_id = module.pdm_encryption_key.id
25+
ignore_value_changes = true
26+
}

scripts/confs/dev.conf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[req]
2+
default_bits = 4096
3+
distinguished_name = req_distinguished_name
4+
req_extensions = v3_req
5+
prompt = no
6+
7+
[req_distinguished_name]
8+
C = GB
9+
ST = West Yorkshire
10+
L = Leeds
11+
O = NHS England
12+
OU = National Document Repository
13+
CN = client.dev.ndr.national.nhs.uk
14+
15+
[v3_req]
16+
keyUsage = keyEncipherment, dataEncipherment
17+
extendedKeyUsage = serverAuth

scripts/confs/preprod.conf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[req]
2+
default_bits = 4096
3+
distinguished_name = req_distinguished_name
4+
req_extensions = v3_req
5+
prompt = no
6+
7+
[req_distinguished_name]
8+
C = GB
9+
ST = West Yorkshire
10+
L = Leeds
11+
O = NHS England
12+
OU = National Document Repository
13+
CN = client.dev.preprod.national.nhs.uk
14+
15+
[v3_req]
16+
keyUsage = keyEncipherment, dataEncipherment
17+
extendedKeyUsage = serverAuth

scripts/confs/prod.conf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[req]
2+
default_bits = 4096
3+
distinguished_name = req_distinguished_name
4+
req_extensions = v3_req
5+
prompt = no
6+
7+
[req_distinguished_name]
8+
C = GB
9+
ST = West Yorkshire
10+
L = Leeds
11+
O = NHS England
12+
OU = National Document Repository
13+
CN = client.prod.ndr.national.nhs.uk
14+
15+
[v3_req]
16+
keyUsage = keyEncipherment, dataEncipherment
17+
extendedKeyUsage = serverAuth

scripts/confs/test.conf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[req]
2+
default_bits = 4096
3+
distinguished_name = req_distinguished_name
4+
req_extensions = v3_req
5+
prompt = no
6+
7+
[req_distinguished_name]
8+
C = GB
9+
ST = West Yorkshire
10+
L = Leeds
11+
O = NHS England
12+
OU = National Document Repository
13+
CN = client.test.ndr.national.nhs.uk
14+
15+
[v3_req]
16+
keyUsage = keyEncipherment, dataEncipherment
17+
extendedKeyUsage = serverAuth

scripts/create_csrs.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/bash
2+
3+
# This is for generating certs used during mTLS authentication.
4+
# Taken from https://github.com/NHSDigital/api-management-cert-generation/blob/master/README.md
5+
# This script is likely needed if certificates need to be regenerated due to expiry or if new environments are added etc.
6+
# Run create_csrs.sh to generate keys into keys/ and CSRs into csrs/ to send to a trusted CA.
7+
# Usage:
8+
# ./create_csrs.sh
9+
10+
set -euo pipefail
11+
12+
mkdir -p csrs
13+
mkdir -p keys
14+
15+
openssl req -new -newkey rsa:4096 -nodes -sha256 -keyout keys/dev.api.service.nhs.uk.key -out csrs/dev.api.service.nhs.uk.csr -config confs/dev.conf -extensions v3_req
16+
openssl req -new -newkey rsa:4096 -nodes -sha256 -keyout keys/test.api.service.nhs.uk.key -out csrs/test.api.service.nhs.uk.csr -config confs/test.conf -extensions v3_req
17+
openssl req -new -newkey rsa:4096 -nodes -sha256 -keyout keys/preprod.api.service.nhs.uk.key -out csrs/preprod.api.service.nhs.uk.csr -config confs/preprod.conf -extensions v3_req
18+
openssl req -new -newkey rsa:4096 -nodes -sha256 -keyout keys/api.service.nhs.uk.key -out csrs/api.service.nhs.uk.csr -config confs/prod.conf -extensions v3_req

0 commit comments

Comments
 (0)