Skip to content

Commit 220adca

Browse files
Mahuwa-BarmanPM-Darshanchintamani-bhat07
authored
Merge and validate secured production mode in WLS for OCI (#272)
https://jira.oraclecorp.com/jira/browse/JCS-14433 --------- Co-authored-by: PM-Darshan <[email protected]> Co-authored-by: Chintamani Bhat <[email protected]>
1 parent d59e9f0 commit 220adca

File tree

20 files changed

+869
-92
lines changed

20 files changed

+869
-92
lines changed

terraform/data_sources.tf

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2023, Oracle and/or its affiliates.
1+
# Copyright (c) 2023, 2024, Oracle and/or its affiliates.
22
# Licensed under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
data "oci_identity_regions" "home_region" {
@@ -209,3 +209,9 @@ data "oci_core_instances" "provisioned_instances" {
209209
}
210210
}
211211

212+
data "oci_certificates_management_certificate_authority" "root_certificate_authority" {
213+
count = var.configure_secure_mode && var.root_ca_id != "" ? 1 : 0
214+
#Required
215+
certificate_authority_id = var.root_ca_id
216+
}
217+

terraform/locals.tf

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2023, Oracle and/or its affiliates.
1+
# Copyright (c) 2023, 2024, Oracle and/or its affiliates.
22
# Licensed under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
locals {
@@ -93,7 +93,7 @@ locals {
9393
deploy_sample_app = (var.deploy_sample_app && var.wls_edition != "SE")
9494

9595
admin_ip_address = local.assign_weblogic_public_ip ? module.compute.instance_public_ips[0] : module.compute.instance_private_ips[0]
96-
admin_console_app_url = format("https://%s:%s/console", local.admin_ip_address, var.wls_extern_ssl_admin_port)
96+
admin_console_app_url = format("https://%s:%s/console", local.admin_ip_address, local.wls_extern_ssl_admin_port)
9797
sample_app_protocol = local.add_load_balancer ? "https" : "http"
9898
sample_app_url_lb_ip = local.deploy_sample_app && local.add_load_balancer ? format("%s://%s/sample-app", local.sample_app_protocol, local.lb_ip) : ""
9999
sample_app_url_wls_ip = local.deploy_sample_app ? format("https://%s:%s/sample-app", local.admin_ip_address, var.wls_ms_extern_ssl_port) : ""
@@ -184,4 +184,16 @@ locals {
184184
is_rms_private_endpoint_required = var.is_rms_private_endpoint_required && var.wls_existing_vcn_id != "" && var.wls_subnet_id != "" && !local.assign_weblogic_public_ip ? true : false
185185
add_new_rms_private_endpoint = local.is_rms_private_endpoint_required && var.add_rms_private_endpoint == "Create New Resource Manager Endpoint" ? true : false
186186
add_existing_rms_private_endpoint = local.is_rms_private_endpoint_required && var.add_rms_private_endpoint == "Use Existing Resource Manager Endpoint" ? true : false
187+
188+
# Secured Production Mode
189+
preserve_boot_properties = var.configure_secure_mode ? var.preserve_boot_properties : true
190+
wls_admin_port = var.configure_secure_mode ? var.administration_port : var.wls_admin_port
191+
keystore_password_id = var.configure_secure_mode ? var.keystore_password_id : ""
192+
root_ca_id = var.configure_secure_mode ? var.root_ca_id : ""
193+
cert_compartment_id = var.cert_compartment_id == "" ? local.network_compartment_id : var.cert_compartment_id
194+
wls_domain_configuration = var.configure_secure_mode ? "Secured Production Mode" : "Production Mode"
195+
wls_extern_ssl_admin_port = var.configure_secure_mode ? var.administration_port : var.wls_extern_ssl_admin_port
196+
wls_admin_user = var.configure_secure_mode ? var.wls_primary_admin_user : var.wls_admin_user
197+
wls_secondary_admin_password_id = var.configure_secure_mode ? var.wls_secondary_admin_password_id : ""
198+
root_ca_compartment_id = var.configure_secure_mode && var.root_ca_id != "" ? data.oci_certificates_management_certificate_authority.root_certificate_authority[0].compartment_id : ""
187199
}

terraform/main.tf

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2023,2024, Oracle and/or its affiliates.
1+
# Copyright (c) 2023, 2024, Oracle and/or its affiliates.
22
# Licensed under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
### Removing network validation script from provisioning flow temporarily.
@@ -63,9 +63,12 @@ module "network-vcn-config" {
6363
wls_extern_ssl_admin_port = var.wls_extern_ssl_admin_port
6464
wls_extern_admin_port = var.wls_extern_admin_port
6565
wls_expose_admin_port = var.wls_expose_admin_port
66+
wls_admin_ssl_port = var.wls_admin_ssl_port
6667
wls_admin_port_source_cidr = var.wls_admin_port_source_cidr
67-
wls_ms_content_port = local.add_load_balancer ? (var.is_idcs_selected ? var.idcs_cloudgate_port : var.wls_ms_extern_port) : var.wls_ms_extern_ssl_port
68+
wls_ms_content_port = local.add_load_balancer ? (var.is_idcs_selected ? var.idcs_cloudgate_port : (var.configure_secure_mode ? var.wls_ms_extern_ssl_port : var.wls_ms_extern_port)) : var.wls_ms_extern_ssl_port
6869
assign_backend_public_ip = local.assign_weblogic_public_ip
70+
configure_secure_mode = var.configure_secure_mode
71+
administration_port = var.administration_port
6972

7073
wls_subnet_cidr = local.wls_subnet_cidr
7174
wls_ms_source_cidrs = local.add_load_balancer ? [local.lb_subnet_1_subnet_cidr] : ["0.0.0.0/0"]
@@ -239,6 +242,12 @@ module "policies" {
239242
fss_compartment_id = var.fss_compartment_id == "" ? var.compartment_ocid : var.fss_compartment_id
240243
mount_target_compartment_id = var.mount_target_compartment_id == "" ? var.compartment_ocid : var.mount_target_compartment_id
241244
is_rms_private_endpoint_required = local.is_rms_private_endpoint_required
245+
instance_image_id = var.instance_image_id
246+
configure_secure_mode = var.configure_secure_mode
247+
keystore_password_id = local.keystore_password_id
248+
cert_compartment_id = local.cert_compartment_id
249+
root_ca_compartment_id = local.root_ca_compartment_id
250+
wls_secondary_admin_password_id = local.wls_secondary_admin_password_id
242251
}
243252

244253
module "bastion" {
@@ -464,6 +473,14 @@ module "validators" {
464473
provisioned_node_count = length(data.oci_core_instances.provisioned_instances.instances.*.display_name)
465474
use_marketplace_image = var.use_marketplace_image
466475
wls_edition = var.wls_edition
476+
477+
# Secured Production Mode
478+
configure_secure_mode = var.configure_secure_mode
479+
keystore_password_id = local.keystore_password_id
480+
root_ca_id = local.root_ca_id
481+
wls_secondary_admin_password_id = local.wls_secondary_admin_password_id
482+
administration_port = var.administration_port
483+
ms_administration_port = var.ms_administration_port
467484
}
468485

469486
module "fss" {
@@ -591,7 +608,7 @@ module "compute" {
591608
tf_script_version = var.tf_script_version
592609
use_regional_subnet = local.use_regional_subnet
593610
wls_14c_jdk_version = var.wls_14c_jdk_version
594-
wls_admin_user = var.wls_admin_user
611+
wls_admin_user = local.wls_admin_user
595612
wls_admin_password_id = var.wls_admin_password_id
596613
wls_admin_server_name = format("%s_adminserver", local.service_name_prefix)
597614
wls_ms_server_name = format("%s_server_", local.service_name_prefix)
@@ -604,13 +621,25 @@ module "compute" {
604621
wls_machine_name = format("%s_machine_", local.service_name_prefix)
605622
wls_extern_admin_port = var.wls_extern_admin_port
606623
wls_extern_ssl_admin_port = var.wls_extern_ssl_admin_port
607-
wls_admin_port = var.wls_admin_port
624+
wls_admin_port = local.wls_admin_port
608625
wls_admin_ssl_port = var.wls_admin_ssl_port
609626
wls_domain_name = format("%s_domain", local.service_name_prefix)
610627
wls_server_startup_args = var.wls_server_startup_args
611628
wls_existing_vcn_id = var.wls_existing_vcn_id
612629
create_policies = var.create_policies
613630

631+
# Secured Production Mode
632+
configure_secure_mode = var.configure_secure_mode
633+
preserve_boot_properties = local.preserve_boot_properties
634+
administration_port = var.administration_port
635+
ms_administration_port = var.ms_administration_port
636+
keystore_password_id = local.keystore_password_id
637+
root_ca_id = local.root_ca_id
638+
cert_compartment_id = local.cert_compartment_id
639+
thread_pool_limit = var.thread_pool_limit
640+
wls_secondary_admin_user = var.wls_secondary_admin_user
641+
wls_secondary_admin_password_id = local.wls_secondary_admin_password_id
642+
614643
#The following two are for adding a dependency on the peering module
615644
wls_vcn_peering_dns_resolver_id = element(flatten(concat(module.vcn-peering[*].wls_vcn_dns_resolver_id, [""])), 0)
616645
wls_vcn_peering_route_table_attachment_id = local.assign_weblogic_public_ip ? element(flatten(concat(module.vcn-peering[*].wls_vcn_public_route_table_attachment_id, [""])), 0) : element(flatten(concat(module.vcn-peering[*].wls_vcn_private_route_table_attachment_id, [""])), 0)
@@ -709,8 +738,11 @@ module "load-balancer-backends" {
709738
lb_backendset_name = local.lb_backendset_name
710739
num_vm_instances = var.wls_node_count
711740
instance_private_ips = module.compute.instance_private_ips
712-
backend_port = var.is_idcs_selected ? var.idcs_cloudgate_port : var.wls_ms_extern_port
741+
backend_port = var.is_idcs_selected ? var.idcs_cloudgate_port : (var.configure_secure_mode ? var.wls_ms_extern_ssl_port : var.wls_ms_extern_port)
713742
health_check_url = var.is_idcs_selected ? "/cloudgate" : "/"
743+
744+
configure_secure_mode = var.configure_secure_mode
745+
root_ca_id = local.root_ca_id
714746
}
715747

716748
module "observability-logging" {

terraform/modules/compute/wls_compute/variables.tf

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2023,2024, Oracle and/or its affiliates.
1+
# Copyright (c) 2023, 2024, Oracle and/or its affiliates.
22
# Licensed under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
variable "tenancy_id" {
@@ -293,3 +293,56 @@ variable "is_ucm_image" {
293293
type = bool
294294
description = "The metadata info to send it to instance to determine if its ucm image based instance or not"
295295
}
296+
297+
# All the variables under this comment belong to Secured Production Mode
298+
variable "configure_secure_mode" {
299+
type = bool
300+
description = "Set to true to configure a secure WebLogic domain"
301+
}
302+
303+
variable "preserve_boot_properties" {
304+
type = bool
305+
description = "Set to true to preserve the boot.properties file for administration server and managed servers"
306+
}
307+
308+
variable "administration_port" {
309+
type = number
310+
description = "The domain-wide administration port to configure a secure WebLogic domain"
311+
}
312+
313+
variable "ms_administration_port" {
314+
type = number
315+
description = "The administration port for managed servers to configure a secure WebLogic domain"
316+
}
317+
318+
variable "keystore_dir" {
319+
type = string
320+
description = "The directory where the pkcs12 keystores will be created in the compute instance when secured production mode is enabled."
321+
default = "/u01/data/keystores"
322+
}
323+
324+
variable "keystore_password_id" {
325+
type = string
326+
description = "The OCID of the vault secret with the password for creating the keystore"
327+
}
328+
329+
variable "root_ca_id" {
330+
type = string
331+
description = "The OCID of the existing root certificate authority to issue the certificates"
332+
}
333+
334+
variable "cert_compartment_id" {
335+
type = string
336+
description = "The OCID of the compartment where the certificate will be created. Leave it blank to use the network compartment for the certificate"
337+
}
338+
339+
variable "thread_pool_limit" {
340+
type = number
341+
description = "Shared Capacity For Work Managers"
342+
}
343+
344+
variable "certificate_id" {
345+
type = string
346+
description = "The OCID of the SSL certificate to configure a secure WebLogic domain"
347+
default = ""
348+
}

terraform/modules/compute/wls_compute/wls_compute.tf

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ module "wls-instances" {
5454
wls_ms_server_name = var.wls_ms_server_name
5555
wls_admin_server_name = var.wls_admin_server_name
5656
wls_cluster_name = var.wls_cluster_name
57-
wls_cluster_mc_port = var.wls_cluster_mc_port
5857
wls_machine_name = var.wls_machine_name
5958
wls_server_startup_args = var.wls_server_startup_args
6059
total_vm_count = var.num_vm_instances
@@ -69,6 +68,20 @@ module "wls-instances" {
6968
is_bastion_instance_required = var.is_bastion_instance_required
7069
create_policies = var.create_policies
7170

71+
# Secured Production Mode
72+
configure_secure_mode = var.configure_secure_mode
73+
preserve_boot_properties = var.preserve_boot_properties
74+
administration_port = var.administration_port
75+
ms_administration_port = var.ms_administration_port
76+
keystore_dir = var.keystore_dir
77+
keystore_password_id = var.keystore_password_id
78+
root_ca_id = var.root_ca_id
79+
cert_compartment_id = var.cert_compartment_id
80+
certificate_id = var.certificate_id
81+
thread_pool_limit = var.thread_pool_limit
82+
wls_secondary_admin_user = var.wls_secondary_admin_user
83+
wls_secondary_admin_password_ocid = var.wls_secondary_admin_password_id
84+
7285
user_data = data.template_cloudinit_config.config.rendered
7386
mode = var.mode
7487
wls_version = var.wls_version

terraform/modules/compute/wls_compute/wls_variables.tf

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ variable "wls_edition" {
1313

1414
variable "wls_admin_user" {
1515
type = string
16-
description = "The name of the admin user that will be added to the WebLogic domain"
16+
description = "Name of WebLogic administration user"
17+
default = "weblogic"
1718
validation {
1819
condition = replace(var.wls_admin_user, "/^[a-zA-Z][a-zA-Z0-9_-]{7,127}/", "0") == "0"
1920
error_message = "WLSC-ERROR: The value for wls_admin_user should be between 8 and 128 characters long and alphanumeric, and can contain underscore (_) and hyphen(-) special characters."
@@ -137,16 +138,6 @@ variable "wls_ms_ssl_port" {
137138
}
138139
}
139140

140-
variable "wls_cluster_mc_port" {
141-
type = number
142-
description = "The managed server port on which to send heartbeats and other internal cluster traffic"
143-
default = 5555
144-
validation {
145-
condition = var.wls_cluster_mc_port > 0
146-
error_message = "WLSC-ERROR: The value for wls_cluster_mc_port should be greater than 0."
147-
}
148-
}
149-
150141
variable "wls_nm_port" {
151142
type = number
152143
description = "The listen port number for the node manager process on all compute instances"
@@ -170,8 +161,8 @@ variable "provisioning_timeout_mins" {
170161

171162
variable "wls_admin_server_wait_timeout_mins" {
172163
type = number
173-
description = "Teh timeout in minutes for the administration server to enroll to node manager"
174-
default = 30
164+
description = "The timeout in minutes for the administration server to enroll to node manager"
165+
default = 10
175166
}
176167

177168
variable "wls_version" {
@@ -228,3 +219,29 @@ variable "wls_version_to_rcu_component_list_map" {
228219
"12.2.1.4" = "MDS,WLS,STB,IAU_APPEND,IAU_VIEWER,UCSUMS,IAU,OPSS"
229220
}
230221
}
222+
223+
# All variables under this comment belong to secured production mode
224+
variable "wls_primary_admin_user" {
225+
type = string
226+
description = "Name of primary WebLogic administration user"
227+
default = "wls_user"
228+
validation {
229+
condition = replace(var.wls_primary_admin_user, "/^[a-zA-Z][a-zA-Z0-9_-]{7,127}/", "0") == "0" && !contains(["system", "admin", "administrator", "weblogic"], var.wls_primary_admin_user)
230+
error_message = "WLSC-ERROR: The value for wls_primary_admin_user should be between 8 and 128 characters long and alphanumeric, and can contain underscore (_) and hyphen(-) special characters, and should not be system, admin, administrator, or weblogic."
231+
}
232+
}
233+
234+
variable "wls_secondary_admin_user" {
235+
type = string
236+
description = "Name of secondary WebLogic administration user"
237+
default = "wls_user_1"
238+
validation {
239+
condition = replace(var.wls_secondary_admin_user, "/^[a-zA-Z][a-zA-Z0-9_-]{7,127}/", "0") == "0" && !contains(["system", "admin", "administrator", "weblogic"], var.wls_secondary_admin_user)
240+
error_message = "WLSC-ERROR: The value for wls_secondary_admin_user should be between 8 and 128 characters long and alphanumeric, and can contain underscore (_) and hyphen(-) special characters, and should not be system, admin, administrator, or weblogic."
241+
}
242+
}
243+
244+
variable "wls_secondary_admin_password_id" {
245+
type = string
246+
description = "The OCID of the vault secret with the password for secondary WebLogic administration user"
247+
}

terraform/modules/lb/backends/lb_backends.tf

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2023, Oracle and/or its affiliates.
1+
# Copyright (c) 2023, 2024, Oracle and/or its affiliates.
22
# Licensed under the Universal Permissive License v1.0 as shown at https://oss.oracle.com/licenses/upl.
33

44
locals {
@@ -9,7 +9,7 @@ locals {
99

1010
resource "oci_load_balancer_backend_set" "wls_lb_backendset" {
1111
# If using existing load balancer, use per-created backend set of existing lb
12-
count = var.use_existing_lb ? 0 : 1
12+
count = var.configure_secure_mode ? 0 : var.use_existing_lb ? 0 : 1
1313

1414
name = var.lb_backendset_name
1515
load_balancer_id = var.load_balancer_id
@@ -27,11 +27,41 @@ resource "oci_load_balancer_backend_set" "wls_lb_backendset" {
2727
lb_cookie_session_persistence_configuration {}
2828
}
2929

30+
resource "oci_load_balancer_backend_set" "wls_lb_backendset_secure_mode" {
31+
# If using existing load balancer in secured production mode, use per-created backend set of existing lb
32+
count = var.use_existing_lb ? 0 : var.configure_secure_mode ? 1 : 0
33+
34+
name = var.lb_backendset_name
35+
load_balancer_id = var.load_balancer_id
36+
policy = var.lb_policy
37+
38+
health_checker {
39+
port = var.backend_port
40+
protocol = var.lb_protocol
41+
response_body_regex = ".*"
42+
url_path = local.health_check_url_path
43+
return_code = var.return_code
44+
}
45+
46+
ssl_configuration {
47+
trusted_certificate_authority_ids = [var.root_ca_id]
48+
verify_depth = 1
49+
verify_peer_certificate = true
50+
}
51+
52+
# Set the session persistence to lb-session-persistence with all default values.
53+
lb_cookie_session_persistence_configuration {}
54+
55+
lifecycle {
56+
ignore_changes = [ssl_configuration]
57+
}
58+
}
59+
3060
resource "oci_load_balancer_listener" "wls_lb_listener_https" {
3161
count = local.use_https_listener_count
3262
load_balancer_id = var.load_balancer_id
3363
name = "${var.resource_name_prefix}_https"
34-
default_backend_set_name = var.use_existing_lb ? var.lb_backendset_name : oci_load_balancer_backend_set.wls_lb_backendset[count.index].name
64+
default_backend_set_name = var.use_existing_lb ? var.lb_backendset_name : var.configure_secure_mode ? oci_load_balancer_backend_set.wls_lb_backendset_secure_mode[count.index].name : oci_load_balancer_backend_set.wls_lb_backendset[count.index].name
3565
port = var.lb_https_lstr_port
3666
protocol = var.lb_protocol
3767
rule_set_names = [oci_load_balancer_rule_set.SSL_headers[count.index].name]
@@ -51,10 +81,10 @@ resource "oci_load_balancer_listener" "wls_lb_listener_https" {
5181
}
5282

5383
resource "oci_load_balancer_backend" "wls_lb_backend" {
54-
count = var.use_existing_lb || (length(oci_load_balancer_backend_set.wls_lb_backendset) > 0) ? var.num_vm_instances : 0
84+
count = var.use_existing_lb || (length(oci_load_balancer_backend_set.wls_lb_backendset) > 0) || (length(oci_load_balancer_backend_set.wls_lb_backendset_secure_mode) > 0) ? var.num_vm_instances : 0
5585

5686
load_balancer_id = var.load_balancer_id
57-
backendset_name = var.use_existing_lb ? var.lb_backendset_name : oci_load_balancer_backend_set.wls_lb_backendset[0].name
87+
backendset_name = var.use_existing_lb ? var.lb_backendset_name : var.configure_secure_mode ? oci_load_balancer_backend_set.wls_lb_backendset_secure_mode[0].name : oci_load_balancer_backend_set.wls_lb_backendset[0].name
5888
ip_address = var.instance_private_ips[count.index]
5989
port = var.backend_port
6090
backup = false

0 commit comments

Comments
 (0)