Innanzitutto , come hanno già detto diverse persone, è essenziale mantenere le credenziali separate dalla sceneggiatura. (Oltre a una maggiore sicurezza, significa anche che è possibile riutilizzare lo stesso script per diversi sistemi con credenziali diverse.)
In secondo luogo , è necessario considerare non solo la sicurezza delle credenziali, ma anche l'impatto se / quando tali credenziali sono compromesse. Non dovresti avere una sola password per tutti gli accessi al database, dovresti avere credenziali diverse con diversi livelli di accesso. Ad esempio, potresti avere un utente DB che ha la capacità di eseguire una ricerca nel database: quell'utente dovrebbe avere accesso in sola lettura. Un altro utente può disporre dell'autorizzazione per inserire nuovi record, ma non per eliminarli. Un terzo potrebbe avere l'autorizzazione per eliminare i record.
Oltre a limitare le autorizzazioni per ciascun account, dovresti anche avere delle restrizioni sulla provenienza di ciascun account. Ad esempio, l'account utilizzato dal server Web non deve essere autorizzato a connettersi da un indirizzo IP diverso da quello del server Web. Un account con permessi di root completi per il database dovrebbe essere molto limitato in termini di provenienza e non dovrebbe mai essere usato se non interattivamente. Considera anche di utilizzare le procedure memorizzate nel database per limitare esattamente ciò che può essere fatto da ciascun account.
Queste restrizioni devono essere implementate sul lato DB-server del sistema, in modo che anche se il lato client è compromesso, le restrizioni non possono essere modificate da esso. (E, ovviamente, il server DB deve essere protetto con firewall ecc. Oltre alla configurazione del DB ...)
Nel caso di un account DB a cui è consentito solo un accesso di sola lettura limitato e solo da un determinato indirizzo IP, potrebbe non essere necessario disporre di ulteriori credenziali oltre a quello, a seconda della sensibilità dei dati e della sicurezza dell'host dello script viene eseguito da. Un esempio potrebbe essere un modulo di ricerca sul tuo sito Web, che può essere eseguito con un utente a cui è consentito utilizzare solo una procedura memorizzata che estrae solo le informazioni che verranno presentate sulla pagina Web. In questo caso, l'aggiunta di una password non conferisce in realtà alcuna sicurezza aggiuntiva, poiché tali informazioni sono già destinate a essere pubbliche e l'utente non può accedere ad altri dati che sarebbero più sensibili.
Assicurati inoltre che la connessione al database venga stabilita tramite TLS, altrimenti chiunque sia in ascolto sulla rete può ottenere le tue credenziali.
In terzo luogo , considera quale tipo di credenziali utilizzare. Le password sono solo una forma e non la più sicura. È possibile invece utilizzare una qualche forma di coppia di chiavi pubblica / privata o AD / PAM o simili.
In quarto luogo , considerare le condizioni in cui verrà eseguito lo script:
Se viene eseguito in modo interattivo, è necessario immettere la password o la password per la chiave privata o la chiave privata o essere connessi con un ticket Kerberos valido, quando lo si esegue - in altre parole, lo script dovrebbe ottenere il suo credenziali direttamente da te al momento dell'esecuzione, invece di leggerle da alcuni file.
Se viene eseguito da un server Web, prendere in considerazione l'impostazione delle credenziali nel momento in cui si avvia il server Web. Un buon esempio qui sono i certificati SSL: hanno un certificato pubblico e una chiave privata e la chiave privata ha una password. È possibile memorizzare la chiave privata sul server Web, ma è comunque necessario immettere la password quando si avvia Apache. È inoltre possibile disporre delle credenziali su un tipo di hardware, ad esempio una scheda fisica o un HSM, che può essere rimosso o bloccato all'avvio del server. (Ovviamente, l'aspetto negativo di questo metodo è che il server non può riavviarsi da solo se succede qualcosa. Preferirei questo al rischio di compromettere il mio sistema, ma il tuo chilometraggio può variare ...)
Se lo script viene eseguito da cron, questa è la parte difficile. Non vuoi avere le credenziali ovunque nel tuo sistema dove qualcuno possa accedervi - ma vuoi averle in giro in modo che il tuo script possa accedervi, giusto? Bene, non proprio. Considera esattamente cosa sta facendo la sceneggiatura. Di quali autorizzazioni ha bisogno sul database? Può essere limitato in modo che non importa se la persona sbagliata si connette con tali autorizzazioni? Puoi invece eseguire lo script direttamente sul server DB a cui nessun altro ha accesso, anziché dal server che ha altri utenti? Se, per qualche ragione che non riesco a pensare, è assolutamente necessario avere lo script in esecuzione su un server non sicuro e deve essere in grado di fare qualcosa di pericoloso / distruttivo ... ora è un buon momento per ripensare la tua architettura.
In quinto luogo , se apprezzi la sicurezza del tuo database, non dovresti eseguire questi script su server a cui altre persone hanno accesso. Se qualcuno ha effettuato l'accesso al tuo sistema, avrà la possibilità di ottenere le tue credenziali. Ad esempio, nel caso di un server Web con un certificato SSL, esiste almeno una possibilità teorica che qualcuno sia in grado di ottenere il root e accedere all'area di memoria del processo httpd ed estrarre le credenziali. Negli ultimi tempi c'è stato almeno un exploit in cui questo poteva essere fatto su SSL, senza nemmeno aver bisogno che l'attaccante avesse effettuato l'accesso.
Considera anche l'uso di SELinux o apparmor o qualsiasi altra cosa disponibile per il tuo sistema per limitare quali utenti possono fare cosa. Ti permetteranno di impedire agli utenti di provare a connettersi al database, anche se riescono ad accedere alle credenziali.
Se tutto ciò ti sembra eccessivo e non puoi permetterti o non hai il tempo di farlo - quindi, secondo la mia opinione (arrogante ed elitaria), non dovresti archiviare nulla di importante o sensibile nel tuo database. E se non stai memorizzando nulla di importante o sensibile, anche dove archiviare le tue credenziali non è importante - nel qual caso, perché usare una password?
Infine , se non puoi assolutamente evitare di archiviare un qualche tipo di credenziali, potresti avere le credenziali di sola lettura e di proprietà di root e root che potrebbero garantire la proprietà su una base estremamente temporanea quando richiesto da uno script (perché il tuo script non dovrebbe essere eseguito come root a meno che non sia assolutamente necessario e la connessione a un database non lo rende necessario). Ma non è ancora una buona idea.