Abbiamo avuto un caso di supporto molto intensificato una volta che le password sono state stampate nel file di log e, come puoi immaginare, la gestione è passata alla modalità antincendio, indirizzando gli sviluppatori a risolverlo "con tutti i mezzi necessari".
Non sono sicuro di quale lingua stai usando, ma qui ci sono le varie misure che possono essere adottate:
- Alcuni framework di registrazione dispongono di funzionalità di filtro, tagliati su misura per filtrare le password ( esempio ): verifica se il tuo ha una funzione del genere
- Se è possibile isolare i colpevoli della stampa della password in un set di pacchetti / classi, quindi disabilitarli interamente per INFO / livelli superiori (log4j consente di farlo facilmente). Ad esempio, la disattivazione della registrazione per i pacchetti di Hibernate elimina tutti i registri relativi a ORM che potrebbero contenere stringhe di connessione contenenti password.
- Se utilizzi l'internazionalizzazione (I10n), elimina tutti i messaggi di stampa della password dal file di risorse
-
Nei casi in cui desideri offuscare solo la password e continuare a stampare il resto del messaggio di log,
a. Crea un gestore di log / formattatore personalizzato in qualsiasi libreria di registrazione che utilizzi in modo che tutti i registri passino attraverso la tua funzione
b. Aggiungi un po 'di logica qui per sostituire la stringa della password (identificata in vari modi nel messaggio di log, come ad esempio la ricerca di "password = ..." o la corrispondenza con una regex) con asterischi
c. Assicurati che questa funzione 'filtro' sia chiamata solo per un particolare livello di log (preferibilmente solo DEBUG) e solo quando il livello di log configurato è < = a quello. È probabile che si verifichi un problema di prestazioni e non si desideri eseguire TUTTI i messaggi di registro tramite questo filtro)
(4) sopra può essere fatto facilmente in Python come segue:
class PasswordSafeLogFormatter(logging.Formatter):
""" Custom formatter that obfuscates passwords """
def format(self, record):
"""
Search the log message for a password-like string and obfuscate it
:param record: Logging record
:return: Formatted message
"""
PASSWORD_REGEX = r'password=.*' # Regular expression that matches a password present in a log
PASSWORD_SUBSTITUTION = r'password=****' # Obfuscated text to be inserted in the log
record.message = re.sub(PASSWORD_REGEX,PASSWORD_SUBSTITUTION, record.message)
return super(PasswordSafeLogFormatter, self).format(record)
def initialize_logger():
""" Initializes the logging module for the application """
root_logger = logging.getLogger()
file_log_handler = RotatingFileHandler(log_file_path, maxBytes=LOG_FILE_ROTATION_BYTES,
backupCount=LOG_FILE_RETENTION_COUNT)
formatter = PasswordSafeLogFormatter(LOG_FORMAT_SPECIFIER)
file_log_handler.setFormatter(formatter)
root_logger.addHandler(file_log_handler)
Nota: questo snippet di codice filtra tutti i messaggi di log e ignora palesemente (4) c sopra - non usarlo AS-IS!