Registrazione dei dati privati

0

In generale, scrivo un registro di debug ogni volta che viene inserita una delle mie funzioni, compresi i parametri.

Ad esempio:

    function execute_query($query, $conn_string)
    {
        $this->log->debug(sprintf('Entering execute_query(query=%s, conn_string=%s)', $query, $conn_string));
        //Do Stuff
    }

Il potenziale problema che vedo è che il parametro potrebbe contenere dati privati (ad esempio la stringa di connessione potrebbe contenere un nome utente e una password) e verrà scritto nel registro.

Detto questo, durante lo sviluppo dell'applicazione ho il logger impostato per includere il livello di debug, e in effetti troverei utile questo. Quando si esegue la distribuzione in produzione, mi aspetto che il livello sia impostato su informazioni o errori, pertanto il nome utente / password non verranno mai scritti nel registro.

Esiste una best practice intorno a questo?

    
posta jzacharuk 26.06.2015 - 18:47
fonte

1 risposta

1

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:

  1. 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
  2. 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.
  3. Se utilizzi l'internazionalizzazione (I10n), elimina tutti i messaggi di stampa della password dal file di risorse
  4. 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!

    
risposta data 29.07.2015 - 10:00
fonte

Leggi altre domande sui tag