@@ -137,29 +137,14 @@ func MergeConfigurations(userTemplate, defaultTemplate *ImageTemplate) (*ImageTe
137137 // Validate immutability configuration and fix if needed
138138 validateAndFixImmutabilityConfig (& mergedTemplate )
139139
140- // Debug mode: Pretty print the merged template
140+ // Debug mode: Pretty print the merged template with sensitive data redacted
141141 if IsDebugMode () {
142- // pretty, err := json.MarshalIndent(mergedTemplate, "", " ")
143- // Build a redacted debug view of the merged template that avoids sensitive fields
144- debugView := struct {
145- ImageName string `json:"imageName"`
146- SystemConfigName string `json:"systemConfigName"`
147- Immutability bool `json:"immutability"`
148- Packages []string `json:"packages"`
149- }{
150- ImageName : mergedTemplate .Image .Name ,
151- SystemConfigName : mergedTemplate .SystemConfig .Name ,
152- Immutability : mergedTemplate .IsImmutabilityEnabled (),
153- Packages : mergedTemplate .SystemConfig .Packages ,
154- }
155-
156- pretty , err := json .MarshalIndent (debugView , "" , " " )
142+ redactedTemplate := redactSensitiveData (& mergedTemplate )
143+ pretty , err := json .MarshalIndent (redactedTemplate , "" , " " )
157144 if err != nil {
158- // log.Warnf("Failed to pretty print merged template: %v", err)
159- log .Warnf ("Failed to pretty print merged template debug view: %v" , err )
145+ log .Warnf ("Failed to pretty print merged template: %v" , err )
160146 } else {
161- // log.Debugf("Merged Template:\n%s", string(pretty))
162- log .Debugf ("Merged Template (redacted):\n %s" , string (pretty ))
147+ log .Debugf ("Merged Template (sensitive data redacted):\n %s" , string (pretty ))
163148 }
164149 }
165150
@@ -169,6 +154,50 @@ func MergeConfigurations(userTemplate, defaultTemplate *ImageTemplate) (*ImageTe
169154 return & mergedTemplate , nil
170155}
171156
157+ // redactSensitiveData creates a copy of the template with sensitive data redacted for safe logging.
158+ // This prevents passwords, keys, and other sensitive information from appearing in logs.
159+ func redactSensitiveData (template * ImageTemplate ) * ImageTemplate {
160+ // Create a deep copy
161+ redacted := * template
162+ redacted .SystemConfig = redactSensitiveSystemConfig (template .SystemConfig )
163+ return & redacted
164+ }
165+
166+ // redactSensitiveSystemConfig creates a copy of SystemConfig with sensitive fields redacted
167+ func redactSensitiveSystemConfig (config SystemConfig ) SystemConfig {
168+ redacted := config
169+
170+ // Redact user passwords and sensitive user data
171+ if len (config .Users ) > 0 {
172+ redacted .Users = make ([]UserConfig , len (config .Users ))
173+ for i , user := range config .Users {
174+ redactedUser := user
175+ // Redact password if present
176+ if user .Password != "" {
177+ redactedUser .Password = "[REDACTED]"
178+ }
179+ // Redact hash algorithm to prevent revealing password security details
180+ if user .HashAlgo != "" {
181+ redactedUser .HashAlgo = "[REDACTED]"
182+ }
183+ redacted .Users [i ] = redactedUser
184+ }
185+ }
186+
187+ // Redact secure boot keys/certificates (sensitive file paths that could reveal security setup)
188+ if config .Immutability .SecureBootDBKey != "" {
189+ redacted .Immutability .SecureBootDBKey = "[REDACTED]"
190+ }
191+ if config .Immutability .SecureBootDBCrt != "" {
192+ redacted .Immutability .SecureBootDBCrt = "[REDACTED]"
193+ }
194+ if config .Immutability .SecureBootDBCer != "" {
195+ redacted .Immutability .SecureBootDBCer = "[REDACTED]"
196+ }
197+
198+ return redacted
199+ }
200+
172201// mergeSystemConfig merges a single system configuration
173202func mergeSystemConfig (defaultConfig , userConfig SystemConfig ) SystemConfig {
174203 merged := defaultConfig // Start with default
0 commit comments