diff --git a/README.md b/README.md index b701d767..2fc95306 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ You need the following permissions to run this module. | [port](#output\_port) | Database connection port | | [service\_credentials\_json](#output\_service\_credentials\_json) | Service credentials json map | | [service\_credentials\_object](#output\_service\_credentials\_object) | Service credentials object | +| [users\_credentials](#output\_users\_credentials) | Database user credentials | | [version](#output\_version) | Elasticsearch version | diff --git a/ibm_catalog.json b/ibm_catalog.json index e83f2901..20b0c931 100644 --- a/ibm_catalog.json +++ b/ibm_catalog.json @@ -446,19 +446,22 @@ "key": "kibana_image_port" }, { - "key": "kibana_image_secret" + "key": "cbr_code_engine_kibana_project_rules" }, { - "key": "kibana_registry_personal_access_token" + "key": "use_private_registry" }, { - "key": "kibana_registry_server" + "key": "kibana_image_secret" }, { "key": "kibana_registry_username" }, { - "key": "use_private_registry" + "key": "kibana_registry_personal_access_token" + }, + { + "key": "kibana_registry_server" }, { "key": "kibana_visibility", diff --git a/modules/fscloud/README.md b/modules/fscloud/README.md index ad179492..b224d684 100644 --- a/modules/fscloud/README.md +++ b/modules/fscloud/README.md @@ -74,5 +74,6 @@ No resources. | [port](#output\_port) | Database connection port | | [service\_credentials\_json](#output\_service\_credentials\_json) | Service credentials json map | | [service\_credentials\_object](#output\_service\_credentials\_object) | Service credentials object | +| [users\_credentials](#output\_users\_credentials) | Database user credentials | | [version](#output\_version) | Elasticsearch instance version | diff --git a/modules/fscloud/outputs.tf b/modules/fscloud/outputs.tf index 7c64dc70..be0b1397 100644 --- a/modules/fscloud/outputs.tf +++ b/modules/fscloud/outputs.tf @@ -59,3 +59,9 @@ output "certificate_base64" { value = module.elasticsearch.certificate_base64 sensitive = true } + +output "users_credentials" { + description = "Database user credentials" + value = module.elasticsearch.users_credentials + sensitive = true +} diff --git a/outputs.tf b/outputs.tf index 2eb40aff..87abe965 100644 --- a/outputs.tf +++ b/outputs.tf @@ -44,6 +44,12 @@ output "adminuser" { value = ibm_database.elasticsearch.adminuser } +output "users_credentials" { + description = "Database user credentials" + value = ibm_database.elasticsearch.users + sensitive = true +} + output "hostname" { description = "Database connection hostname" value = data.ibm_database_connection.database_connection.https[0].hosts[0].hostname diff --git a/solutions/fully-configurable/main.tf b/solutions/fully-configurable/main.tf index bbb1daeb..1f956168 100644 --- a/solutions/fully-configurable/main.tf +++ b/solutions/fully-configurable/main.tf @@ -273,6 +273,20 @@ data "ibm_database_connection" "existing_connection" { user_type = "database" } +locals { + kibana_users = [{ + name = "kibana_user" + password = local.kibana_app_login_password + type = "database" + }, + { + name = "kibana_system" + password = local.kibana_system_password + }] + + all_users = local.kibana_app_login_password != null ? concat(var.users, local.kibana_users) : var.users +} + # Create new instance module "elasticsearch" { count = var.existing_elasticsearch_instance_crn != null ? 0 : 1 @@ -292,7 +306,7 @@ module "elasticsearch" { access_tags = var.access_tags tags = var.resource_tags admin_pass = local.admin_pass - users = var.users + users = local.all_users members = var.members member_host_flavor = var.member_host_flavor memory_mb = var.member_memory_mb @@ -412,11 +426,29 @@ module "secrets_manager_service_credentials" { # Code Engine Kibana Dashboard instance ######################################################################################################################## +resource "random_password" "kibana_system_password" { + count = var.enable_kibana_dashboard ? 1 : 0 + length = 32 + special = true + override_special = "-_" + min_numeric = 1 +} + +resource "random_password" "kibana_app_login_password" { + count = var.enable_kibana_dashboard ? 1 : 0 + length = 32 + special = true + override_special = "-_" + min_numeric = 1 +} + locals { - code_engine_project_id = var.existing_code_engine_project_id != null ? var.existing_code_engine_project_id : null - code_engine_project_name = local.code_engine_project_id != null ? null : "${local.prefix}${var.kibana_code_engine_new_project_name}" - code_engine_app_name = "${local.prefix}${var.kibana_code_engine_new_app_name}" - kibana_version = var.enable_kibana_dashboard ? jsondecode(data.http.es_metadata[0].response_body).version.number : null + code_engine_project_id = var.existing_code_engine_project_id != null ? var.existing_code_engine_project_id : null + code_engine_project_name = local.code_engine_project_id != null ? null : (var.prefix != null && var.prefix != "") ? "${var.prefix}-${var.kibana_code_engine_new_project_name}" : var.kibana_code_engine_new_project_name + code_engine_app_name = (var.prefix != null && var.prefix != "") ? "${var.prefix}-${var.kibana_code_engine_new_app_name}" : var.kibana_code_engine_new_app_name + kibana_version = var.enable_kibana_dashboard ? jsondecode(data.http.es_metadata[0].response_body).version.number : null + kibana_system_password = var.enable_kibana_dashboard ? random_password.kibana_system_password[0].result : null + kibana_app_login_password = var.enable_kibana_dashboard ? random_password.kibana_app_login_password[0].result : null } data "http" "es_metadata" { @@ -432,12 +464,13 @@ module "code_engine_kibana" { resource_group_id = module.resource_group.resource_group_id project_name = local.code_engine_project_name existing_project_id = local.code_engine_project_id + cbr_rules = var.cbr_code_engine_kibana_project_rules secrets = merge( { "es-secret" = { format = "generic" data = { - "ELASTICSEARCH_PASSWORD" = local.admin_pass + "ELASTICSEARCH_PASSWORD" = local.kibana_system_password } } }, @@ -466,7 +499,7 @@ module "code_engine_kibana" { { type = "literal" name = "ELASTICSEARCH_USERNAME" - value = local.elasticsearch_username + value = "kibana_system" }, { type = "secret_key_reference" diff --git a/solutions/fully-configurable/outputs.tf b/solutions/fully-configurable/outputs.tf index 1f52d179..6f537439 100644 --- a/solutions/fully-configurable/outputs.tf +++ b/solutions/fully-configurable/outputs.tf @@ -60,6 +60,14 @@ output "kibana_app_endpoint" { value = var.enable_kibana_dashboard ? module.code_engine_kibana[0].app[local.code_engine_app_name].endpoint : null } +output "user_credentials" { + description = "Kibana/database user credentials for Elasticsearch" + value = var.enable_kibana_dashboard ? { + for user in module.elasticsearch[0].users_credentials : user.name => user.password + if user.name != "kibana_system" + } : null + sensitive = true +} output "cbr_rule_ids" { description = "CBR rule ids created to restrict Elasticsearch" value = var.existing_elasticsearch_instance_crn != null ? null : module.elasticsearch[0].cbr_rule_ids diff --git a/solutions/fully-configurable/variables.tf b/solutions/fully-configurable/variables.tf index acb32292..f11959de 100644 --- a/solutions/fully-configurable/variables.tf +++ b/solutions/fully-configurable/variables.tf @@ -583,3 +583,23 @@ variable "cbr_rules" { description = "(Optional, list) List of context-based restrictions rules to create. [Learn more](https://github.com/terraform-ibm-modules/terraform-ibm-icd-elasticsearch/tree/main/solutions/fully-configurable/DA-cbr_rules.md)" default = [] } + +variable "cbr_code_engine_kibana_project_rules" { + type = list(object({ + description = string + account_id = string + rule_contexts = list(object({ + attributes = optional(list(object({ + name = string + value = string + }))) })) + enforcement_mode = string + operations = optional(list(object({ + api_types = list(object({ + api_type_id = string + })) + }))) + })) + description = "(Optional, list) List of context-based restrictions rules to create for the Kibana dashboard and it is only applicable if `enable_kibana_dashboard` is true. [Learn more](https://github.com/terraform-ibm-modules/terraform-ibm-icd-elasticsearch/tree/main/solutions/standard/DA-cbr_rules.md)" + default = [] +}