autotoc_md906
doc_id: "LOG-API-002c" doc_title: "API Reference - Security" doc_version: "1.0.0" doc_date: "2026-04-04" doc_status: "Released" project: "logger_system"
category: "API"
Language: English | 한국어
API Reference - Security
Split from: API_REFERENCE.md
Version: 0.5.0.0 Last Updated: 2026-02-08
Table of Contents
- Overview
- Security Error Codes
- Encrypted Writer
- Secure Key Storage
- Security-Critical Logger Interface
- Log Sanitization
- Path Validation
- Security Filters
- Audit Logging
Overview
The logger_system security module provides encryption, sanitization, path validation, and audit logging capabilities for production environments with compliance requirements (PCI-DSS, HIPAA, SOC 2, GDPR).
Headers: Located under include/kcenon/logger/security/
Security Error Codes
Security-related errors use codes in the 1700-1799 range:
enum class logger_error_code {
encryption_failed = 1700,
decryption_failed = 1701,
authentication_failed = 1702,
sanitization_failed = 1703,
file_read_failed = 1704,
insecure_permissions = 1705,
path_traversal_detected = 1706,
invalid_key_size = 1707,
invalid_filename = 1708,
};
| Code | Name | Description |
| 1700 | encryption_failed | AES-256 encryption operation failed |
| 1701 | decryption_failed | Decryption failed (wrong key or corrupted data) |
| 1702 | authentication_failed | Authentication check failed |
| 1703 | sanitization_failed | Log message sanitization error |
| 1704 | file_read_failed | Failed to read a security-related file |
| 1705 | insecure_permissions | File permissions are too permissive |
| 1706 | path_traversal_detected | Path traversal attempt detected in filename |
| 1707 | invalid_key_size | Encryption key size does not meet requirements |
| 1708 | invalid_filename | Filename contains invalid or dangerous characters |
Encrypted Writer
The encrypted writer decorator provides AES-256 encryption for log data at rest. Requires OpenSSL.
Writer Builder Integration
#include <kcenon/logger/builders/writer_builder.h>
auto key_result = security::secure_key_storage::generate_key(32);
auto secure_writer = writer_builder()
.file("secure.log.enc")
.encrypted(std::move(key_result.value()))
.buffered()
.async()
.build();
writer_builder::encrypted()
RAII wrapper for encryption keys with secure memory management.
Parameters:
key – A security::secure_key object (must be 32 bytes for AES-256)
Requires: LOGGER_USE_ENCRYPTION=ON CMake option and OpenSSL
Error: Returns logger_error_code::invalid_key_size if key is not 32 bytes
Secure Key Storage
Header: <kcenon/logger/security/secure_key_storage.h>
Key Generation
class secure_key_storage {
public:
const std::string& key_path);
};
}
static result< secure_key > load_key(const std::filesystem::path &path, size_t expected_size=32, const std::filesystem::path &allowed_base="/var/log/keys")
Load key from file with permission verification.
static common::VoidResult save_key(const secure_key &key, const std::filesystem::path &path, const std::filesystem::path &allowed_base="/var/log/keys")
Save key to file with secure permissions.
static result< secure_key > generate_key(size_t size=32)
Generate a secure random key.
Usage Example
auto key_result = secure_key_storage::generate_key(32);
if (!key_result) {
std::cerr << "Key generation failed: " << key_result.error_message() << "\n";
return 1;
}
auto save_result = secure_key_storage::save_key(key_result.value(), "/etc/app/log.key");
auto loaded_key = secure_key_storage::load_key("/etc/app/log.key");
RAII wrapper for encryption keys with secure memory management.
Security-Critical Logger Interface
Header: <kcenon/logger/security/critical_logger_interface.h>
The main logger class implements security::critical_logger_interface for crash-safe, signal-safe logging:
public:
};
}
Interface for loggers that support emergency flushing.
virtual ~critical_logger_interface()=default
virtual int get_emergency_fd() const =0
Get file descriptor for emergency writing.
virtual const char * get_emergency_buffer() const =0
Get emergency buffer pointer.
virtual size_t get_emergency_buffer_size() const =0
Get emergency buffer size.
These methods are designed to be called from signal handlers and use only async-signal-safe operations.
Log Sanitization
Log sanitization prevents sensitive data from appearing in log output.
Common Sanitization Patterns
auto sanitized = sanitizer::mask_credit_card(log_message);
auto sanitized = sanitizer::mask_email(log_message);
auto sanitized = sanitizer::mask_pattern(log_message, regex_pattern, replacement);
Integration with Filters
auto logger = logger_builder::create()
.add_function_filter([](
const log_entry& entry) {
return !contains_pii(entry.
message);
})
.build();
Represents a single log entry with all associated metadata.
small_string_256 message
The actual log message.
Error Code: sanitization_failed (1703) – returned when sanitization logic encounters an error
Path Validation
Path validation prevents directory traversal attacks in log file paths.
Validation Checks
The logger validates all file paths to prevent:
- Path traversal (
../) – attempting to write outside the log directory
- Absolute path injection – overriding the configured log directory
- Null byte injection – truncating paths with embedded null characters
- Invalid characters – characters not allowed in filenames
Error Codes
path_traversal_detected (1706) – directory traversal attempt detected
invalid_filename (1708) – filename contains invalid characters
insecure_permissions (1705) – file permissions are too permissive
Example
auto writer = writer_builder()
.file("/var/log/app/../../etc/passwd")
.build();
auto writer = writer_builder()
.file("/var/log/app/application.log")
.build();
Security Filters
Security-focused filters for compliance requirements.
Level-Based Security Filtering
if (entry.context.count("category") &&
entry.context.at("category") == "security") {
return true;
}
return entry.
level >= log_level::warning;
}
);
log_level level
Severity level of the log message.
Sampling Bypass for Security Events
Log sampling implementation for high-volume scenarios kcenon.
Configuration for log sampling behavior.
std::vector< std::string > always_log_fields
std::unordered_map< std::string, double > category_rates
Audit Logging
Audit logging provides tamper-evident, compliance-ready log records.
Best Practices for Audit Logs
- Use structured logging for machine-parseable audit trails
- Include context (user ID, session ID, action, timestamp)
- Never drop audit logs – use sampling bypass or critical_writer
- Encrypt at rest – use the encrypted writer decorator
- Rotate and archive – maintain retention policy compliance
Example: Audit Trail
#include <kcenon/logger/builders/writer_builder.h>
auto audit_key = security::secure_key_storage::load_key("/etc/app/audit.key").value();
auto audit_writer = writer_builder()
.file("/var/log/audit/audit.log.enc")
.encrypted(std::move(audit_key))
.buffered(50, std::chrono::milliseconds(1000))
.build();
.with_async(true)
.add_writer("audit", std::move(audit_writer))
.with_structured_logging(true)
.build()
.value();
.message("User data access")
.field("user_id", 12345)
.field("action", "read")
.field("resource", "patient_record")
.field("record_id", "PR-2025-001")
.category("audit")
.emit();
Secure audit logging with tamper detection.
High-performance, thread-safe logging system with asynchronous capabilities.
Related Documentation
Last Updated: 2026-02-08