login到Linux容器上的Windows域

我的公司是专门使用Windows机器,当我login到Windows域时,它使我可以访问一些共享的驱动器和数据库。 现在我想在一个容器中运行R,例如以下教程https://ropenscilabs.github.io/r-docker-tutorial/02-Launching-Docker.html

我的问题是:是否有一种方法,我的R脚本在这个容器中执行的脚本inheritance主机操作系统的权限? 访问正在使用Windows身份validation的MSSQL数据库似乎特别棘手…..

RockScience,

我在这里看到两个选项,它们都使您能够inheritance权限,而不是传递用户和密码凭据。 为了解决你的具体问题,在Linux上看看:

  • 在Linux上使用SQL Server进行Active Directory身份validation

如果采取运行Windows容器的方法,请查看Active Directory gMSA (Group Managed Service Accounts)帐户以及以下MSDN文章和video:

  • Windows容器的Active Directory服务帐户

  • 走容器化之路 – 将工作负载转化为容器

这将使您能够创buildWindows容器和R环境。


在Linux上使用SQL Server进行Active Directory身份validation

本教程介绍了如何在Linux上configurationSQL Server以支持Active Directory(AD)身份validation,也称为集成身份validation。 AD身份validation使Windows或Linux上的域join的客户端能够使用其域凭据和Kerberos协议向SQL Server进行身份validation。

AD身份validation比SQL Server身份validation具有以下优点:

  • 用户通过单一login进行身份validation,而不会提示input密码。
  • 通过为AD组创buildlogin,可以使用AD组成员身份pipe理SQL Server中的访问和权限。
  • 每个用户在整个组织中都有一个标识,因此您不必跟踪哪个SQL Serverlogin对应哪个人。
  • AD使您能够在整个组织中实施集中式密码策略。

本教程由以下任务组成:

  • 将SQL Server主机joinAD域
  • 为SQL Server创buildAD用户并设置SPN
  • configurationSQL Server服务密钥表
  • 在Transact-SQL中创build基于AD的login
  • 使用AD身份validation连接到SQL Server

Windows容器的Active Directory服务帐户

如今,组pipe理服务帐户通常用于保护一台计算机或服务与另一台计算机或服务之间的连接。 使用一般的步骤是:

  1. 创build一个gMSA
  2. configuration服务作为gMSA运行
  3. 将运行服务访问的域join的主机授予Active Directory中的gMSA机密
  4. 允许在其他服务(如数据库或文件共享)上访问gMSA

启动服务时,join域的主机将自动从Active Directory获取gMSA机密,并使用该帐户运行服务。 由于该服务作为gMSA运行,因此可以访问gMSA允许的任何资源。

  1. Windows容器遵循类似的过程:
  2. 创build一个gMSA。 默认情况下,域pipe理员或帐户操作员必须执行此操作。 否则,他们可以委托创build和pipe理gMSA的权限给pipe理使用它们的服务的pipe理员。 请参阅gMSA入门
  3. 给join域的容器主机访问gMSA
  4. 允许在其他服务(如数据库或文件共享)上访问gMSA
  5. 使用windows-server-container-tools中的CredentialSpec PowerShell模块存储使用gMSA所需的设置
  6. 使用额外选项启动容器--security-opt "credentialspec=..."

启动容器后,以“本地系统”或“networking服务”运行的已安装服务将显示为gMSA。 这与这些帐户在join域的主机上的工作方式类似,除了使用gMSA而不是计算机帐户。

示例用途

SQL连接string

当服务在容器中作为本地系统或networking服务运行时,它可以使用Windows集成身份validation连接到Microsoft SQL Server。

例:

复制

 Server=sql.contoso.com;Database=MusicStore;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=30 

在Microsoft SQL Server上,使用域名和gMSA名称创build一个login,然后是$。 一旦login被创build,它可以被添加到数据库上的用户,并给予适当的访问权限。

例:

SQL

复制

 CREATE LOGIN "DEMO\WebApplication1$" FROM WINDOWS WITH DEFAULT_DATABASE = "MusicStore" GO USE MusicStore GO CREATE USER WebApplication1 FOR LOGIN "DEMO\WebApplication1$" GO EXEC sp_addrolemember 'db_datareader', 'WebApplication1' EXEC sp_addrolemember 'db_datawriter', 'WebApplication1' 

要看到它的实际运行情况,请查看Microsoft Ignite 2016中的“ 通往容器化的path – 将工作负载转换为容器 ”会话中logging的演示。

正如@ Technophobe01显示,一个Windows容器将是更自然的适合inheritanceAD权限。

在获取R脚本连接到您的文件共享和MS SQL数据库方面,我会build议如下

MS SQL连接

使用R脚本中的连接string连接到数据库
这是一个传统的方法,而不是inheritance一些权限。
请参阅SQL Server RODBC连接

 library(RODBC) conn <- odbcDriverConnect('driver={SQL Server};server=mysqlhost;database=mydbname;uid=user;pwd=pwd') 

您可以在部署时间或docker机密中使用ENVvariables指定任何敏感字段,并将其加载到R脚本中。

文件共享

请参阅https://blogs.msdn.microsoft.com/stevelasker/2016/06/14/configuring-docker-for-windows-volumes/
1.将networking驱动器映射到Windows泊坞窗主机上
2.在Docker设置中将它们指定为容器可用,您将需要添加一个具有pipe理权限的新用户帐户。
3.假设networking驱动器映射到d:
docker run -vd:/somedata:/data <container> ls /data会将驱动器挂载在/data的容器中并列出其内容。