mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-25 05:26:50 +00:00
fix(security): redact target debug logs and remove eval-based bench hook (#2637)
This commit is contained in:
@@ -28,6 +28,33 @@ pub fn collect_target_configs(
|
||||
collect_target_configs_from_env(config, route_prefix, target_type, valid_fields, std::env::vars())
|
||||
}
|
||||
|
||||
fn is_sensitive_target_field(field_name: &str) -> bool {
|
||||
let field_name = field_name.to_ascii_lowercase();
|
||||
field_name.contains("password")
|
||||
|| field_name.contains("secret")
|
||||
|| field_name.contains("token")
|
||||
|| field_name.contains("credential")
|
||||
|| field_name.contains("private_key")
|
||||
|| field_name.contains("client_key")
|
||||
|| field_name.contains("access_key")
|
||||
|| field_name.contains("auth")
|
||||
}
|
||||
|
||||
fn redact_target_field_value(field_name: &str, value: &str) -> String {
|
||||
if is_sensitive_target_field(field_name) && !value.is_empty() {
|
||||
return "***redacted***".to_string();
|
||||
}
|
||||
value.to_string()
|
||||
}
|
||||
|
||||
fn redacted_target_config(config: &KVS) -> Vec<(String, String)> {
|
||||
config
|
||||
.0
|
||||
.iter()
|
||||
.map(|kv| (kv.key.clone(), redact_target_field_value(&kv.key, &kv.value)))
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn collect_env_target_instance_ids(route_prefix: &str, target_type: &str, valid_fields: &HashSet<String>) -> HashSet<String> {
|
||||
collect_env_target_instance_ids_from_env(route_prefix, target_type, valid_fields, std::env::vars())
|
||||
}
|
||||
@@ -104,7 +131,7 @@ where
|
||||
debug!(
|
||||
instance_id = %if instance_id == DEFAULT_DELIMITER { DEFAULT_DELIMITER } else { &instance_id },
|
||||
%field_name,
|
||||
%value,
|
||||
value = %redact_target_field_value(&field_name, value),
|
||||
"Parsed target environment override"
|
||||
);
|
||||
env_overrides
|
||||
@@ -137,7 +164,10 @@ where
|
||||
merged_config.extend(env_instance_cfg.clone());
|
||||
}
|
||||
|
||||
debug!(instance_id = %id, ?merged_config, "Merged target configuration");
|
||||
if tracing::enabled!(tracing::Level::DEBUG) {
|
||||
let redacted_config = redacted_target_config(&merged_config);
|
||||
debug!(instance_id = %id, ?redacted_config, "Merged target configuration");
|
||||
}
|
||||
if is_target_enabled(&merged_config) {
|
||||
merged_configs.push((id, merged_config));
|
||||
}
|
||||
@@ -148,7 +178,7 @@ where
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{collect_env_target_instance_ids_from_env, collect_target_configs_from_env};
|
||||
use super::{collect_env_target_instance_ids_from_env, collect_target_configs_from_env, redact_target_field_value};
|
||||
use rustfs_config::notify::NOTIFY_ROUTE_PREFIX;
|
||||
use rustfs_config::{ENABLE_KEY, WEBHOOK_ENDPOINT, WEBHOOK_QUEUE_LIMIT};
|
||||
use rustfs_ecstore::config::{Config, KVS};
|
||||
@@ -236,4 +266,17 @@ mod tests {
|
||||
|
||||
assert_eq!(ids, HashSet::from(["primary".to_string()]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn redact_target_field_value_redacts_sensitive_fields() {
|
||||
assert_eq!(redact_target_field_value("password", "secret"), "***redacted***");
|
||||
assert_eq!(redact_target_field_value("auth_token", "token"), "***redacted***");
|
||||
assert_eq!(redact_target_field_value("credentials_file", "/tmp/creds"), "***redacted***");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn redact_target_field_value_keeps_non_sensitive_fields() {
|
||||
assert_eq!(redact_target_field_value("endpoint", "https://example.com"), "https://example.com");
|
||||
assert_eq!(redact_target_field_value("queue_limit", "1000"), "1000");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -672,7 +672,7 @@ where
|
||||
bucket = %meta.bucket_name,
|
||||
object = %meta.object_name,
|
||||
event = %meta.event_name,
|
||||
preview = %meta.best_effort_preview(&body, 256),
|
||||
payload_len = body.len(),
|
||||
"Sending MQTT payload"
|
||||
);
|
||||
|
||||
|
||||
@@ -288,7 +288,7 @@ where
|
||||
bucket = %meta.bucket_name,
|
||||
object = %meta.object_name,
|
||||
event = %meta.event_name,
|
||||
preview = %meta.best_effort_preview(&body, 256),
|
||||
payload_len = body.len(),
|
||||
"Sending webhook payload"
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user