使用JDBC / ODBC驱动程序将R与数据库连接时保护用户凭据

通常我使用JDBC / ODBC驱动程序连接到R数据库。 一个典型的代码看起来像

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") 

我想其他人使用我的凭据访问数据库,但我想保护我的用户名和密码。 所以我打算保存上面的脚本作为“Connections.r”文件,并要求用户来源这个文件。

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

如果我只给执行权限执行Connections.r其他人不能源文件

 chmod 710 Connections.r 

只有当我给予读取和执行权限时,R才能让用户来源。 如果我给读取权限,我的凭据将被暴露。 有没有反正我们可以通过保护用户凭据来解决这个问题?

除非通过创建初始JDBC连接的Rcpp函数或包(这不会是微不足道的)来深度模糊您的凭据,否则您唯一较轻的混淆机制之一是将您的凭据存储在一个文件中并使用您的源代码R脚本从文件中读取它们,在通话中使用它们,并在通话结束后从环境中读取它们。 这仍然会暴露他们,但不直接。

另一种方式,因为用户有自己的登录RStudio服务器,是使用哈德利新的安全包(我们几个人通过它的步伐运行它),添加用户密钥,并已加密您的凭据存储,但有你的源R脚本自动解密它们。 你仍然需要做任何你使用的变量的rm ,因为如果你不这样做,它们将成为环境的一部分。

最后一种方式,因为无论如何你都允许他们访问数据,所以使用一组单独的凭证(就像你使用凭证的方式来表示这个问题的方式)只能在只读模式下工作到这些分析所需的数据库和表格。 那样的话,信用泄露并不重要,因为没有任何“坏”可以与他们做。

最后,我很困惑,为什么你不能只在数据库端设置只读权限的用户? 这就是基于角色的访问控制。 这是行政工作,但绝对是正确的做法。

你想给别人访问权限,但不能让他们看到你的证书吗? 这在这种情况下是不可能的。 如果我的代码可以读取文件,我可以看到文件中的所有内容。

在SQL服务器上创建更多帐户。 或者创建一个访客帐户。 但是,您正试图解决帐户管理解决的问题。

将凭据作为命令参数发送? 以下是一个如何做的例子:

 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") 

样品运行(无参数):

 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] 

这个软件包明显受到同名python软件包的启发,所以在那里看也可能有用。

看看你的代码,我可能会重写它如下:

 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 

Jana,你很乐意让用户通过R连接,但不能以任何其他方式连接。 这是如何模糊他们的东西?

我不明白为什么你不会满足于对特定表(甚至视图)具有特定SELECT访问权限的访客帐户?