在Linux容器上登录Windows域

14

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

我的问题如下:是否有一种方法可以使在此容器中执行的R脚本继承主机操作系统的权限?这似乎对于使用Windows身份验证的MSSQL数据库尤其棘手.....

2个回答

9

RockScience,您好!

我看到两个选项,它们都可以让您继承权限,而不是传递用户和密码凭据。针对您具体的问题,在Linux方面可以参考以下内容:

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

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


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

本教程介绍了如何配置 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 容器上活动目录服务帐户

今天,组管理服务帐户经常用于保护一个计算机或服务与另一个计算机或服务之间的连接。使用它的一般步骤如下:

  1. 创建 gMSA
  2. 将服务配置为以 gMSA 身份运行
  3. 允许运行服务的域加入主机在 Active Directory 中访问 gMSA 密钥
  4. 允许其他服务(例如数据库或文件共享)中的 gMSA 访问
当服务启动时,域加入的主机会自动从Active Directory获取gMSA秘密,并使用该帐户运行该服务。由于该服务正在作为gMSA运行,因此可以访问gMSA被允许访问的任何资源。
  1. Windows容器遵循类似的过程:
  2. 创建gMSA。默认情况下,域管理员或帐户操作员必须执行此操作。否则,他们可以将创建和管理gMSA的特权委派给管理使用它们的服务的管理员。请参阅gMSA入门
  3. 使域加入的容器主机能够访问gMSA
  4. 允许对其他服务(如数据库或文件共享)中的gMSA进行访问
  5. 使用来自windows-server-container-tools的CredentialSpec PowerShell模块存储使用gMSA所需的设置
  6. 使用额外选项启动容器--security-opt "credentialspec=..."

当容器启动时,以本地系统或网络服务运行的安装服务将显示为作为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 中的记录演示,该演示在“将工作负载转换为容器”的会议中可用。 链接

1
你有没有看到过利用gMSA来支持Linux容器的方法? - duct_tape_coder
@duct_tape_coder 我的感觉(我可能错了)是你想看看如何在Azure Fabric下运行Linux容器。为什么?理论上,你可以在Azure Fabric下部署一组Linux容器,并通过gsmA进行身份验证。这是一个解决问题的想法,而不是确认的解决方案。
  • https://learn.microsoft.com/en-us/azure/service-fabric/service-fabric-get-started-containers-linux
  • https://learn.microsoft.com/en-us/azure/service-fabric/service-fabric-run-service-as-ad-user-or-group
- Technophobe01
@duct_tape_coder 请参考 https://github.com/Microsoft/mssql-docker/issues/165 获取建议。不幸的是,目前这个问题仍然是一个未解决的问题。 - Technophobe01

2

@Technophobe01表明,使用Windows容器将更加自然地继承AD权限。

为了连接您的文件共享和MS SQL数据库中的R脚本,我建议采取以下措施:

MS SQL连接

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

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

您可以在部署时使用环境变量或docker secrets指定任何敏感字段,并将它们加载到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 将在容器中挂载驱动器并列出其内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接