在Linux容器上登录到Windows域

时间:2017-10-09 16:48:24

标签: r docker containers windows-authentication

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

我的问题如下:我的R脚本在此容器中执行的方式是否继承了主机操作系统的权限? 访问使用Windows身份验证的MSSQL数据库似乎特别棘手......

2 个答案:

答案 0 :(得分:9)

RockScience,

我在这里看到两个选项,它们都允许您继承权限,而不是传入用户和密码凭据。要解决您的具体问题,请在Linux周围查看:

如果您采用运行Windows容器的方法,请查看Active Directory gMSA(组管理服务帐户)帐户以及以下MSDN文章和视频:

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

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

本教程介绍如何在Linux上配置SQL Server以支持Active Directory(AD)身份验证,也称为集成身份验证。 AD身份验证允许Windows或Linux上的已加入域的客户端使用其域凭据和Kerberos协议对SQL Server进行身份验证。

AD身份验证与SQL Server身份验证相比具有以下优势:

  • 用户通过单点登录进行身份验证,而不会提示您输入密码。
  • 通过为AD组创建登录,您可以使用AD组成员身份管理SQL Server中的访问权限。
  • 每个用户在整个组织中都有一个身份,因此您无需跟踪哪些SQL Server登录与哪些人对应。
  • AD使您可以在整个组织中实施集中式密码策略。

本教程包含以下任务:

  • 将SQL Server主机加入AD域
  • 为SQL Server创建AD用户并设置SPN
  • 配置SQL Server服务密钥表
  • 在Transact-SQL中创建基于AD的登录
  • 使用AD身份验证连接到SQL Server

Windows容器的Active Directory服务帐户

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

  1. 创建gMSA
  2. 将服务配置为以gMSA格式运行
  3. 为加入域的主机提供对Active Directory中gMSA机密的服务访问权限
  4. 允许访问其他服务(例如数据库或文件Shares
  5. )上的gMSA

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

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

      启动容器时,作为本地系统或网络服务运行的已安装服务将显示为作为gMSA运行。这类似于这些帐户在加入域的主机上的工作方式,除了使用gMSA而不是计算机帐户。

      示例使用

      SQL连接字符串

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

      实施例

      复制

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

      在Microsoft SQL Server上,使用域和gMSA名称创建登录名,后跟$。创建登录后,可以将其添加到数据库中的用户并获得适当的访问权限。

      实施例

      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提供的录制演示" Walk the Path to Containerization - transforming workloads into containers"。

答案 1 :(得分:2)

正如@Technophobe01所示,Windows容器更适合继承AD权限。

在将R脚本连接到文件共享和MS SQL数据库方面,我建议使用以下

MS SQL连接

使用R脚本中的连接字符串连接到数据库
这是一种传统方法,而不是继承一些权限 见SQL Server RODBC Connection

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

您可以在部署时使用ENV vars指定任何敏感字段,或者在Docker机密中将其加载到R脚本中。

文件共享

https://blogs.msdn.microsoft.com/stevelasker/2016/06/14/configuring-docker-for-windows-volumes/
1.将网络驱动器映射到Windows docker主机上 2.在docker设置中将它们指定为容器可用,您需要添加具有管理员权限的新用户帐户 3.假设网络驱动器映射到d:
   docker run -v d:/somedata:/data <container> ls /data   将驱动器安装在/data的容器中并列出其内容。