2014-10-08 4 views
5

Di solito mi collego a un database con R utilizzando il driver JDBC/ODBC. Un codice tipica sarebbe simileProtezione delle credenziali utente quando si collega R ai database utilizzando i driver JDBC/ODBC

library(RJDBC) 
vDriver = JDBC(driverClass="com.vertica.jdbc.Driver", classPath="/home/Drivers/vertica-jdbc-7.0.1-0.jar") 
vertica = dbConnect(vDriver, "jdbc:vertica://servername:5433/db", "username", "password") 

vorrei altri di accedere al db con le mie credenziali ma voglio proteggere la mia username e password. Quindi pianifico di salvare lo script sopra come un file "Connections.r" e chiedo agli utenti di trovare questo file.

source("/opt/mount1/Connections.r") 

Se do eseguire solo il permesso di Connections.r gli altri non può fonte il file

chmod 710 Connections.r 

Solo se mi danno letto ed esecuzione R consente agli utenti di fonte esso. Se fornisco il permesso di lettura, le mie credenziali saranno esposte. C'è comunque la possibilità di risolvere questo problema proteggendo le credenziali dell'utente?

+0

Non sono sicuro che si possa andare oltre l'offuscamento. Potrebbe essere d'aiuto se fornisci maggiori informazioni sul perché non crei utenti separati per i tuoi clienti. – bdecaf

+0

Tutto questo è stato eseguito su una macchina condivisa o il codice è stato distribuito da qualche parte? E le variabili di base della shell? – Visser

+0

@bdecaf: i dati sono sensibili e voglio solo che abbiano accesso in lettura. Se creo credenziali utente separate, dovrebbero essere in grado di scaricare i dati sul loro computer locale. L'idea è di proteggere le credenziali di connettività del database in modo che possano leggere i dati solo da un server su cui è distribuito questo codice. – Jana

risposta

1

Sono state inviate le credenziali as command arguments? Ecco un esempio di come si potrebbe farlo:

suppressPackageStartupMessages(library("argparse")) 
# create parser object 
parser <- ArgumentParser() 
# specify our desired options 
# by default ArgumentParser will add an help option 
parser$add_argument("-v", "--verbose", action="store_true", default=TRUE, 
help="Print extra output [default]") 
parser$add_argument("-q", "--quietly", action="store_false", 
dest="verbose", help="Print little output") 
parser$add_argument("-c", "--count", type="integer", default=5, 
help="Number of random normals to generate [default %(default)s]", 
metavar="number") 
parser$add_argument("--generator", default="rnorm", 
help = "Function to generate random deviates [default \"%(default)s\"]") 
parser$add_argument("--mean", default=0, type="double", help="Mean if generator == \"rnorm\" [default %(default)s]") 
parser$add_argument("--sd", default=1, type="double", 
metavar="standard deviation", 
help="Standard deviation if generator == \"rnorm\" [default %(default)s]") 
# get command line options, if help option encountered print help and exit, 
# otherwise if options not found on command line then set defaults, 
args <- parser$parse_args() 
# print some progress messages to stderr if "quietly" wasn't requested 
if (args$verbose) { 
write("writing some verbose output to standard error...\n", stderr()) 
} 
# do some operations based on user input 
if(args$generator == "rnorm") { 
cat(paste(rnorm(args$count, mean=args$mean, sd=args$sd), collapse="\n")) 
} else { 
cat(paste(do.call(args$generator, list(args$count)), collapse="\n")) 
} 
cat("\n") 

corsa del campione (senza parametri):

usage: example.R [-h] [-v] [-q] [-c number] [--generator GENERATOR] [--mean MEAN] [--sd standard deviation] 
optional arguments: 
-h, --help show this help message and exit 
-v, --verbose Print extra output [default] 
-q, --quietly Print little output 
-c number, --count number 
Number of random normals to generate [default 5] 
--generator GENERATOR 
Function to generate random deviates [default "rnorm"] 
--mean MEAN Mean if generator == "rnorm" [default 0] 
--sd standard deviation 
Standard deviation if generator == "rnorm" [default 1] 

Il pacchetto è stato a quanto pare ispirato dal pacchetto python con lo stesso nome, in modo da looking there possono essere anche utile.

Guardando il codice, probabilmente sarei riscrivere come segue:

library(RJDBC) 
library(argparse) 
args <- ArgumentParser() 
args$add_argument('--driver', dest='driver', default="com.vertica.jdbc.Driver") 
args$add_argument('--classPath', dest='classPath', default="/home/Drivers/vertica-jdbc-7.0.1-0.jar") 
args$add_argument('--url', dest='url', default="jdbc:vertica://servername:5433/db") 
args$add_argument('--user', dest='user', default='username') 
args$add_argument('--password', dest='password', default='password') 
parser <- args$parse_args 
vDriver <- JDBC(driverClass=parser$driver, parser$classPath) 
vertica <- dbConnect(vDriver, parser$url, parser$user , parser$password) 
# continue here 
+0

Non penso che questo mi aiuterà. L'obiettivo è utilizzare credenziali singole per tutti gli utenti finali senza che conoscano il nome utente e la password. Anche se uso l'opzione 'argparse' ho bisogno di dare l'accesso in lettura di questo file all'utente finale. In quel caso potevano ancora vedere il nome utente e la password predefiniti. – Jana

+0

No, non lo fai. Si richiede semplicemente che la password sia specificata come argomento. Se è sufficiente fornire all'utente l'accesso in lettura, è possibile [incorporare R] (http://www.vertica.com/2012/12/21/a-deeper-dive-on-vertica-r/) e scrivere un stored procedure per fare ciò che vuoi. – hd1

+0

Se devo specificare la password come argomento, devo ancora condividere la password con l'utente finale. Destra? Vorrei sottolineare che le UDF R sono fuori dalle mie possibilità. Questa è la ragione principale per cui sto usando la connettività RJDBC. Inoltre ho provato a eseguire il codice che hai menzionato sopra e ottengo questo errore "Errore nel parser $ classPath: oggetto di tipo 'chiusura' non è subsiabile" – Jana

2

Vuoi dare accesso a qualcuno, ma non li hanno in grado di vedere le credenziali? Non è possibile in questo caso. Se il mio codice può leggere un file, posso vedere tutto nel file.

Creare più account sul server SQL. Oppure crea un account ospite. Ma stai cercando di risolvere il problema che la gestione degli account risolve.

3

A meno che non si confondano le credenziali in modo profondo creando una funzione Rcpp o un pacchetto che esegue la connessione JDBC iniziale (che non sarà banale) uno dei meccanismi di occultamento solo più leggeri è quello di memorizzare le proprie credenziali in un file e il tuo script R di origine li legge dal file, li usa nella chiamata e li li rm dall'ambiente subito dopo quella chiamata. Ciò li esporrà ancora, ma non direttamente.

Un altro modo, dal momento che gli utenti hanno i propri accessi a RStudio Server, è quello di utilizzare il nuovo pacchetto secure di Hadley (alcuni di noi sec sono in esecuzione attraverso le sue funzioni), aggiungere le chiavi utente e avere le credenziali memorizzate crittografati ma il tuo script R di origine li decodifica automaticamente. Avrai comunque bisogno di fare il rm di qualsiasi variabile che usi poiché faranno parte dell'ambiente se non lo fai.

Un modo definitivo, dal momento che si sta dando loro l'accesso ai dati in ogni caso, è quello di utilizzare un gruppo separato di credenziali (il modo in cui formulato la questione sembra si sta utilizzando tue credenziali di per questo) che solo lavorare in modalità di sola lettura per le banche dati & necessarie per queste analisi. In questo modo, non importa se i crediti perdono perché non c'è nulla di "cattivo" che possa essere fatto con loro.

In definitiva, sono confuso sul motivo per cui non è possibile configurare gli utenti con autorizzazioni di sola lettura sul lato del database? Ecco a cosa servono i controlli di accesso basati sui ruoli. È un lavoro amministrativo, ma è assolutamente la cosa giusta da fare.

+0

Non ho diritti di amministratore sul database. Potrei usare solo le mie credenziali per leggere/scrivere sul db. Allo stesso tempo, ho bisogno di consentire a un gruppo di persone di utilizzare un server RStudio DEDICATED, leggere i dati dal db e analizzarlo. Se imposto agli utenti un'autorizzazione di sola lettura, potrebbero usare le loro macchine locali per leggere i dati e salvarli localmente. Devo proteggerlo. – Jana

+0

È possibile configurare un'altra infrastruttura? Potresti usare qualcosa come [sqlrelay] (http://sqlrelay.sourceforge.net/sqlrelay/gettingstarted/postgresql.html) come proxy e imporre restrizioni in questo modo (non sono sicuro se fa il bit di restrizione, ma lo fanno altri). – hrbrmstr

+0

Vedo il tuo punto, ma nel mio caso la creazione di un'altra infrastruttura per questo problema sarà considerata inefficiente. – Jana

1

Jana, sembra strano che tu sia disposto a consentire agli utenti di connettersi tramite R ma non in altro modo. Come mai oscura qualcosa da loro?

Non capisco perché non si accontenti di un account guest con accesso solo SELECT specifico a determinate tabelle (o anche a visualizzazioni)?

+0

@MontesChemist: La mia sfida principale è proteggere i dati memorizzati localmente (all'esterno di un server dedicato) e allo stesso tempo voglio che un gruppo di persone li analizzi. Anche se ho assegnato un account ospite e condiviso le credenziali con il gruppo. Potrebbero usare quelle credenziali per "leggere" i dati usando R/RJDBC e "salvarli" localmente sui loro sistemi. – Jana

+0

Capisco che si desidera proteggere i dati. Quello che non capisco è come proteggerlo (con qualche meccanismo ancora da scoprire in R) ti dà più protezione dell'accesso in sola lettura in PostgreSQL. Cioè, per analizzare i dati in R, le persone non devono leggerlo (in alcuni vettori in R)? In tal caso, in che modo è più sicuro dell'accesso in sola lettura (seleziona) in PostgreSQL?Mi piacerebbe davvero aiutare qui ma non vedo ancora una distinzione ancora ... – MonetsChemist