Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用JDBC/ODBC驱动程序将R与数据库连接时保护用户凭据_Linux_R_Security_Unix_Rstudio - Fatal编程技术网

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

Linux 使用JDBC/ODBC驱动程序将R与数据库连接时保护用户凭据,linux,r,security,unix,rstudio,Linux,R,Security,Unix,Rstudio,通常我使用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") 我

通常我使用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才允许用户对其进行源代码设置。如果我授予读取权限,我的凭据将被公开。我们有没有办法通过保护用户凭据来解决这个问题

是否已发送凭据?下面是一个如何做到这一点的示例:

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")
该软件包显然是受同名软件包的启发,因此可能也很有用

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

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
库(RJDBC)
库(argparse)

args您是否希望授予某人访问权限,但不允许他们查看您的凭据?在这种情况下,这是不可能的。如果我的代码可以读取文件,我就可以看到文件中的所有内容


在SQL server上创建更多帐户。或者开一个客人帐户。但是您正试图解决帐户管理所解决的问题。

除非您通过制作一个Rcpp函数或包来进行初始JDBC连接(这不会很简单),从而使您的凭证变得非常模糊唯一较轻的混淆机制之一是将凭证存储在文件中,并让源代码R脚本从文件中读取凭证,在调用中使用凭证,然后在调用后立即从环境中使用凭证。这仍然会暴露它们,但不会直接暴露

另一种方法是,由于用户有自己的RStudio服务器登录名,因此使用Hadley的新软件包(我们中的一些sec人员正在运行它),添加用户密钥并加密存储您的凭据,但让源代码R脚本自动解密。您仍然需要对您使用的任何变量执行
rm
,因为如果您不这样做,它们将成为环境的一部分

最后一种方法是,因为您无论如何都要让他们访问数据,所以使用一组单独的凭据(您表达问题的方式似乎是使用您的凭据),该凭据仅在只读模式下对这些分析所需的数据库和表起作用。那样的话,不管信用是否泄露,因为没有什么“坏”的东西可以用它们来做


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

Jana,奇怪的是,你愿意让用户通过R连接,而不是以任何其他方式连接。这怎么会让他们看不到任何东西


我不明白为什么您会对一个对某些表(甚至视图)具有特定的仅选择访问权限的来宾帐户不满意?

我不确定您是否能够超越模糊处理。如果您提供更多信息说明为什么不为客户端创建单独的用户,这可能会有所帮助。这是在一台共享计算机上完成的,还是在某个地方部署了此代码?基本shell环境变量呢?@bdecaf:数据是敏感的,我只希望它们具有读取权限。如果我创建单独的用户凭据,他们应该能够在本地计算机上下载数据。整个想法是保护数据库连接凭据,以便它们只能从部署此代码的一台服务器读取数据。@Visser:所有操作都在一台服务器上完成。我为用户设置了R studio服务器。我希望用户通过获取上述脚本登录到此服务器并访问数据库,但我需要保护登录凭据。但您可以设置您的数据库,用户只能从指定的计算机连接。我认为这对我没有帮助。目标是为所有最终用户使用单一凭证,而不让他们知道用户名和密码。即使我使用“argparse”选项,我也需要将此文件的读取权限授予最终用户。在这种情况下,他们仍然可以看到默认的用户名和密码。您只需要将密码指定为参数。如果您只需要授予用户读访问权限,则可以编写一个存储过程来执行所需操作。如果必须将密码指定为参数,则仍必须与最终用户共享密码。对吗?我想指出,R UDF是我无法选择的。这就是我使用RJDBC连接的主要原因。我还试着运行上面提到的代码,我得到了这个错误“parser$classPath中的错误:类型为“closure”的对象不可子集”嗯。。。我的下一个建议是使用实时向最终用户公开数据。我没有数据库的任何管理员权限。我只能使用我的凭据读取/写入数据库。同时,我需要让一群人使用专用的RStudio服务器,从数据库读取数据并进行分析。如果我将用户设置为只读权限,他们可以使用本地计算机读取数据并在本地保存。我需要保护它。你能设置其他基础设施吗?你可以使用类似于代理的东西,并以这种方式强制执行限制(不确定是否有限制,但其他人有)。我明白你的观点,但在我的情况下,为这个问题设置另一个基础设施将被视为低效。我明白你的老板不想要更多的基础设施,但另一种选择是不安全的设置。句号。@MontesChemist:我的主要挑战是保护本地存储的数据(在专用服务器之外),同时我还需要一组人员对其进行分析。即使我分配了来宾帐户并与组共享凭据。他们可以使用这些凭证使用R/RJDBC“读取”数据并“保存”
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