Skip to content

Commit 822854f

Browse files
authored
Fix masking of ironic_osism_* secrets in kernel_append_params (#2120)
When ironic_osism_* values in the Netbox secrets custom field are vault-encrypted and decryption fails in the API context, deep_decrypt silently removes the keys, so no secret values are collected for string replacement. This leaves passwords exposed in the API response. Add a regex-based fallback: before decryption, collect ironic_osism_* key names and derive kernel parameter names (ironic_osism_aa -> osism-aa). After value-based replacement, also mask param=value patterns by name, ensuring secrets are masked even when vault decryption is unavailable. AI-assisted: Claude Code Signed-off-by: Christian Berendt <berendt@osism.tech>
1 parent 1747170 commit 822854f

1 file changed

Lines changed: 22 additions & 0 deletions

File tree

osism/tasks/openstack.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from celery import Celery
44
import os
5+
import re
56
import shutil
67
import tempfile
78
import yaml
@@ -260,6 +261,17 @@ def get_baremetal_node_parameters(node_uuid):
260261
if node_secrets is None:
261262
node_secrets = {}
262263

264+
# Collect ironic_osism_* parameter names BEFORE decryption
265+
# so they're available even if vault decryption removes them.
266+
# Convention: ironic_osism_aa -> osism-aa in kernel_append_params
267+
secret_param_names = set()
268+
for key in node_secrets:
269+
if isinstance(key, str) and key.lower().startswith("ironic_osism_"):
270+
param_name = key[len("ironic_") :].replace( # noqa: E203
271+
"_", "-"
272+
)
273+
secret_param_names.add(param_name)
274+
263275
vault = get_vault()
264276
deep_decrypt(node_secrets, vault)
265277

@@ -280,6 +292,16 @@ def get_baremetal_node_parameters(node_uuid):
280292
kernel_append_params = kernel_append_params.replace(
281293
sv, "***"
282294
)
295+
296+
# Also mask by parameter name for ironic_osism_* params.
297+
# This catches cases where vault decryption failed and
298+
# the secret values could not be collected.
299+
for param_name in secret_param_names:
300+
kernel_append_params = re.sub(
301+
rf"\b{re.escape(param_name)}=\S+",
302+
f"{param_name}=***",
303+
kernel_append_params,
304+
)
283305
except Exception as e:
284306
logger.debug(f"Could not mask secrets for {node_name}: {e}")
285307

0 commit comments

Comments
 (0)