it-swarm.dev

Come posso evitare di inserire la password del database in uno script Perl?

Ho uno script Perl collegato che si collega al nostro database e fa vari tipi di ricerche e controlli di integrità. La sceneggiatura originale è stata scritta da qualcuno molto tempo fa. Il mio compito è di apportare alcune modifiche. Ma non mi piace davvero guardare il username="foo", password="bar" parametri codificati per accedere al database.

Deve esserci un modo più sicuro per farlo. Tutto quello che mi viene in mente di fare per ora è commentare il cron job, eliminare la riga nello script che aveva la password e iniziare a fare brainstorming su come renderlo più sicuro. Ma nel frattempo le cose che la sceneggiatura deve fare devono essere fatte a mano.

Qualche idea?

23
Luke Sheppard

Il metodo standard consiste nel mettere le credenziali in un file di configurazione e tentare di proteggere il file di configurazione in modo che sia più leggibile del file Perl. Ciò offre un moderato aumento della sicurezza; ad esempio, il codice potrebbe essere nel controllo del codice sorgente e accessibile agli sviluppatori, il file di configurazione non lo sarebbe. Il codice deve trovarsi nella radice cgi del server Web e possibilmente scaricabile con alcune configurazioni errate, e il file di configurazione non deve essere.

Il modo ambizioso è crittografare in modo reversibile le credenziali e inserirle in un file di configurazione. Naturalmente, qualsiasi cosa crittografata in modo reversibile può essere decifrata. L'applicazione BladeLogic ha fatto questo, ed è stato banale (<1 giorno) per me decompilare i loro Java abbastanza per scoprire la funzione per decrittografare le credenziali e usarla per decrittografarle per la mia soddisfazione Non un segno contro di loro, questo è solo il nome del gioco criptato reversibilmente.

Un'altra opzione è quella di utilizzare l'autorizzazione basata su SO in concerto con restrizioni di database strettamente limitate. Ad esempio, limitare l'accesso dell'utente client del database a una serie di procedure memorizzate per limitare il potenziale abuso e consentire a tale utente di accedere al database senza password. Questo non funziona se stai facendo client-server sulla rete, il che limita la frequenza con cui è utile. Inoltre, le persone tendono a guardare più alla domanda di accesso utente "senza password" del sistema operativo rispetto a quando scrivono la password, volenti o nolenti. Non è completamente logico, ma ci sono standard che dicono che tutti gli utenti del database devono avere password, quindi è così.

24
gowenfawr

Spesso passo la password allo script in una variabile di ambiente in questo modo lo script non deve avere accesso alla posizione sicura che contiene la password.

PASSWORD=`cat passwd_file`  Perl_script.pl

quindi lo script legge la password

my $password = $ENV{'PASSWORD'}

punti bonus se lo script Perl rilascia privilegi

8
Arthur Ulfeldt

Come altri hanno già detto, metti le credenziali in un file separato che verrà caricato dallo script. I rischi di avere la password nello script includono essere esposti alla navigazione a spalla, essere impegnato in sistemi di controllo di revisione o sistemi di gestione della configurazione e distribuiti ben oltre ciò che dovrebbe essere, copiando accidentalmente in un'altra posizione quando si riutilizza parte del codice, ecc.

Il file delle credenziali deve disporre delle autorizzazioni minime necessarie. Probabilmente non dovrebbe essere incluso o trattato in modo diverso dai sistemi di gestione della configurazione.

Se disponibile, esaminare l'utilizzo di una funzione del sistema operativo che limiti l'accesso al file delle credenziali oltre alle autorizzazioni. Ad esempio, AppArmor o SELinux su Linux possono limitare l'accesso al file delle credenziali a uno script che ne ha bisogno. Questo protegge solo da un utente malintenzionato che non può assumere il controllo dello script legittimo, quindi assicurati che lo script legittimo non sia di proprietà dell'utente che lo esegue (questa è una raccomandazione generale: non avere programmi eseguibili di proprietà dell'utente che li esegue ).

Il consenso sembra essere:

  1. La password deve essere in un file separato, non parte del controllo versione e protetta con autorizzazioni più restrittive di quella dello script.
  2. La crittografia della password memorizzata è una perdita di tempo poiché lo script deve essere in grado di decrittografare la password comunque.

Ma sto pensando di aggiungere un terzo controllo in aggiunta a questi: il controllo degli accessi basato sul tempo (temporale) potrebbe essere d'aiuto anche qui. Limitare il periodo di tempo in cui la password in chiaro è disponibile per gli utenti con privilegi più bassi aggiungerebbe un altro livello (anche se piccolo) di controllo dell'accesso tra la password e qualsiasi aggressore locale.

La mia idea è di avere root il file delle password, impostato su modalità 04 . E quindi avere un cronjob root che esegue un chmod 0404 sul file della password appena prima del cronjob con privilegi inferiori che esegue lo script. Ad un intervallo specificato in seguito (si spera che dopo l'esecuzione dello script), un secondo cronjob root esegua un chmod 0400 sul file delle password. Tutto ciò presuppone che lo script abbia bisogno solo della password per un periodo di tempo inferiore a sempre . I tuoi pensieri su questo schema?

2
Luke Sheppard

Questa sarebbe una soluzione appropriata:

  1. La password è memorizzata in un programma compilato C/C++ che è offuscato in questo modo: char password [100]; password [0] = 'a'; password [1] = 'b'; password [2] = 'c'; password [3] = '\ 0';

O qualche altro modo per offuscare la password. (la password non dovrebbe essere disponibile eseguendo "stringhe" sull'eseguibile)

  1. Il programma C/C++ restituisce la password solo a script attendibili e registrati: A. Ottieni ppid e controlla/proc // cmdline,/proc // comm, ecc. B. Ottieni l'inode dello script del chiamante e confronta con l'identità registrata, per assicurarti lo script non è stato modificato.

Mi piace mettere le configurazioni in ~/config/appname e avere una configurazione generica per la mia connessione mysql locale (o qualsiasi altra). Se non vuoi dare a X la tua casa un'autorizzazione X ed eseguire l'app in quanto un altro utente ha una cartella di configurazione standard da qualche parte. Lo faccio in modo da non impacchettare o assegnare accidentalmente password o nomi utente ad altri programmatori. Non credo sia un grosso problema, ma il mio capo è un maniaco della sicurezza ed è una buona abitudine soprattutto quando pubblica qualsiasi cosa sul web.

Sarebbe saggio scrivere un oneliner o un twoliner standard per i tuoi file di configurazione e copiarli/incollarli in tutti i nuovi script che scrivi

0
user5575

Questo è quello che sto pensando di fare per uno script che si collega a un database remoto. Richiede 2 server per memorizzare la chiave separatamente dal valore crittografato.

  1. Sul server 2 (dove verrà memorizzata la chiave), creare uno script che accetti un parametro chiave e lo memorizzi localmente.
  2. Sul server 1 (in cui è archiviato lo script), creare uno script che accetti la stringa di connessione (Host, nome_db, nome utente, password) come parametro e generi una chiave casuale per crittografare la stringa di connessione. Archiviamo la stringa crittografata localmente, eseguiamo l'hash della chiave e la memorizziamo localmente, quindi inviamo la chiave (su SSL) al server 2. Questo script dovrà essere eseguito manualmente con la stringa di connessione effettiva per inizializzarla e può essere rieseguito su reimpostare la chiave se il secondo server viene in qualche modo compromesso.
  3. Sul server 1 Impostare lo script originale per accettare un parametro chiave, convalidare la chiave rispetto all'hash memorizzato, quindi utilizzare la chiave per decrittografare la stringa di connessione crittografata.
  4. Sul server 2 Impostare una chiamata cURL allo script sul server 1 (su SSL) che invia la chiave ed esegue lo script. Questo può essere impostato su cron o comunque tu voglia farlo funzionare.
0
knsheely