作者:Ricardo Gutierrez
2017 年 10 月
在本系列的上一篇文章中,我们介绍了 Oracle 身份云服务 (IDCS),并介绍了实现多租户供应、使用自定义应用模板实现联合一次性登录以及使用 Salesforce 和 ServiceNow 应用实现即时供应的方法。我们还介绍了一种集成 Oracle Identity Manager (OIM) 的混合方案以及集成这两种解决方案的固有协同效应。在本文中,我们将继续探讨混合方案,这次重点介绍与 Microsoft Active Directory 这个存在于大多数组织中的内部部署基础设施的集成。
逐步向云迁移的组织通常需要能够利用现有基础设施;例如,需要与 Active Directory (AD) 之类的企业目录集成。Microsoft Active Directory Bridge (AD Bridge) 是一个可以内部部署的 IDCS 组件,通过允许组织将 AD 身份与 IDCS 身份存储同步来促进与 AD 的集成。
此类集成将为您带来以下好处:
图 1 描述了一个典型部署方案,其中使用 AD Bridge 代理促进与内部部署 AD 的集成。
图 1.IDCS 与 Active Directory 集成
AD Bridge 代理是一个使用 .NET Framework 构建的 IDCS 组件,作为 Windows 服务部署在 AD 域的计算机成员中。如上所述,其主要任务是将 AD 用户身份和组与 IDCS 身份存储同步。
AD Bridge 代理可从 IDCS 租户服务下载,并使用图形模式 (GUI) 或静默安装进行安装。AD Bridge 代理目前具有以下特性:
Swarm 是 Docker 引擎(自 1.12 版起)中内嵌的原生集群系统;它提供了具备容错和自我修复功能的分散架构。Swarm 中的节点是在物理或虚拟机中运行的 Docker 实例。服务的概念是指节点中执行的任务定义;例如,数据库、应用或 Web 服务器。一个任务含有一个 Docker 容器和要在容器中运行的命令,因此可以假设,每次创建一个服务时,就在 Swarm 中的一个或多个节点上部署一个或多个容器。
Docker Swarm 中存在两种类型的节点:管理节点和工作节点。管理节点将任务分派给工作节点,并执行维持 Swarm 的期望状态所需的编排和管理功能。工作节点接收和执行管理节点分派的任务。
Docker 建议部署奇数个节点;例如,一个三管理节点的 Swarm 至多容许损失一个管理节点,而一个五管理节点的 Swarm 容许同时损失两个管理节点。Docker 推荐的一个 Swarm 中能拥有的最大管理节点数是七。
包含一个管理节点的 Swarm 仍然可以通过工作节点和服务提供高可用性功能,但没有容错功能(也就是说,如果管理节点故障,服务将继续正常工作,但失去该管理节点就需要新建一个 Swarm 才能恢复)。
图 2 中的示意图介绍了由至少一个管理节点和一个或多个工作节点组成的 Docker Swarm 的概念。
图 2.Docker Swarm — 概念视图
Windows 容器是 Microsoft 的原生容器技术(在 Windows Server 2016 和 Windows 10 中可用),有助于将 Docker 引擎与 Docker 客户端(如 Composer、Swarm 和其他工具)一起移植到 Windows 上。根据隔离级别,有两种 Windows 容器类型:
目前,可以在 Windows 容器中部署两种 Windows 操作系统映像:
图 3.Windows Server 容器和 Hyper-V 容器
本节将演示如何利用 Docker Swarm 和 Windows 容器实现 AD Bridge 代理的高可用性 (HA) 部署。如上所述,AD Bridge 代理是一个作为 Windows 服务部署的 .NET 应用,可以轻松安装在 Windows Server Core 实例中。因此,利用 Windows Server 2016 中提供的 Docker 引擎,可以将 AD Bridge 代理托管在运行于两个或多个 Docker 节点上的 Windows 容器中,这些节点形成一个集群,代表一个虚拟系统,最终代表 IDCS 中的一个代理实例。
注:本文描述的方法属于概念验证 (PoC),仅用于演示容器技术的工作原理。IDCS 不支持此方法/解决方案。
图 4 中的示意图展示了用于测试解决方案的环境:Microsoft Active Directory 域(左)显示要与 IDCS 租户服务(右)集成的目标目录。中间代表由三个节点组成的 AD Bridge 集群,每个节点托管一个 Windows 容器。在此 Swarm 配置中,一个节点担任管理节点的角色,另两个充当工作节点。
这些节点可以是物理机或虚拟机,可托管任意数量的容器,仅受可用资源的限制。每个容器至少可以有一个 AD Bridge 代理,在我们的配置中,每个节点上部署了一个容器,每个容器运行一个代理,总共有三个代理。虽然 IDCS 和 AD Bridge 逻辑并不知道集群的存在,但是在发生节点或服务故障时,我们完全依靠 Docker Swarm 功能为 AD Bridge 代理提供高可用性。
这个解决方案还可以方便地在代理中添加逻辑以增加额外的特性,例如,在各节点间分配负载,这在有许多用户和组要同步的域中很有用。
图 4.解决方案概述
以本地或域管理员身份登录并运行以下命令:
sconfig
从菜单中选择 6) Download and Install Updates 选项,更新您的 Windows Server 2016。对其余服务器重复此步骤。
从 Windows 资源管理器中启动安装程序:
C:\temp\Docker for Windows Installer.exe
按照安装向导的指示完成安装。
检查客户端和服务器版本的一种方法是在命令提示符窗口中运行以下命令:
docker version
您的输出必须类似以下文本所示:
C:\>docker version Client: Version: 17.06.0-ce-rc2 API version: 1.30 Go version:
go1.8.1 Git commit: 402dd4a Built: Wed Jun 7 10:01:32 2017 OS/Arch: windows/amd64
Server: Version: 17.06.0-ce-rc2 API version: 1.30 (minimum version 1.24) Go version:
go1.8.3 Git commit: 402dd4a Built: Wed Jun 7 10:03:57 2017 OS/Arch: windows/amd64
Experimental: true
图 5.适用于 Microsoft Windows Server 2016 的 Docker
Group Name : SRVCOREGROUP Group Type : Security Group
ID1-SRVCORE, ID2-SRVCORE and ID3-SRVCORE
Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10)) New-ADServiceAccount -Name
oracleservice -DNSHostName oracleservice.other.com -
PrincipalsAllowedToRetrieveManagedPassword SRVCOREGROUP -ServicePrincipalNames
http/oracleservice.other.com
打开一个 PowerShell ISE 窗口,运行以下命令:
Import-Module ActiveDirectory Get-ADServiceAccount -Filter * Install-ADServiceAccount -
Identity oracleservice Test-AdServiceAccount oracleservice
最后一条命令应返回 True,表明帐户已成功安装。
将脚本下载到临时文件夹中后,打开一个 PowerShell ISE 窗口,运行以下命令:
Add-WindowsFeature RSAT-AD-PowerShell Import-Module ActiveDirectory Import-Module
C:\TEMP\CredentialSpec.psm1 New-CredentialSpec -Name oracleservice -AccountName
oracleservice
运行以下命令来验证结果:
Get-CredentialSpec
输出应类似以下文本所示
Name Path ------------- ---------------- oracleservice
C:\ProgramData\Docker\CredentialSpecs\oracleservice.json
打开一个命令提示符窗口,运行以下命令:
docker pull microsoft/windowsservercore
此命令将从 Microsoft 信息库下载映像,并将其提供给本地 Docker 信息库。Windows Server Core 的平均映像大小为 10 GB。
运行以下命令列出本地信息库中的映像:
docker images
您的输出应类似以下文本所示:
REPOSITORY TAG IMAGE ID CREATED SIZE microsoft/windowsservercore latest 4f222178c921 2 weeks ago
10.2 GB
记下 IDCS 生成的信息:
Cloud Service URL : https://mydemotenant1.idcs.internal.oracle.com:8943 Cliend ID :
e7c04e28bc12415190ea37f0e2fdf325 Client Secret : 71d6b308-a21e-47ef-9dc1-f5ee907ce2e3
接下来,单击 Download 按钮下载 AD Bridge 安装程序。将文件保存到安装了 Docker 引擎的 Windows Server 2016 中的临时文件夹。
打开一个命令提示符窗口,运行以下命令:
docker run -it --name id1-docker --hostname id1-docker --security-opt
"credentialspec=file://oracleservice.json" microsoft/windowsservercore cmd
此命令在 Windows 容易中部署映像 microsoft/windowsservercore,将其命名为 (id1-docker),主机名 (id1-docker),传递上述步骤中生成的凭证文件 (oracleservice.json),运行命令 (cmd) 启动命令提示符界面或命令解释器来执行命令。因为命令提示符是交互式的,容器将一直运行,直到执行 exit 命令或通过 docker stop 命令停止容器。
在命令提示符窗口中,运行以下命令:
docker ps
您的输出应类似以下文本所示:
C:\>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3950c998bc94
microsoft/windowsservercore:latest "cmd" 2 hours ago Up 2 hours id1-docker
连接容器内的映像:
docker exec -it 3950c998bc94 cmd
此命令连接一个运行中的容器,并在该容器内打开一个命令提示符窗口。运行以下命令:
nltest.exe /parentdomain
如果成功,则返回域名,类似以下输出:
C:\>nltest.exe /parentdomain other.com. (1) The command completed successfully
接下来,键入 exit 关闭容器中的命令提示符窗口,返回主机的命令提示符窗口。
从命令提示符窗口运行以下命令:
docker cp C:\TEMP\ad-id-bridge-17.2.2-rel.1314.exe
3950c998bc94:C:\TEMP\ad-id-bridge.exe docker cp C:\TEMP\idcs.cer 3950c998bc94:C:\TEMP
这些命令将 AD Bridge 安装程序 ad-id-bridge-17.2.2-rel.1314.exe 和 idcs.cer 文件复制到运行 Windows Server Core 映像的 Windows 容器 3950c998bc94 内的文件夹 C:\TEMP。
连接容器内的映像:
docker exec -it 3950c998bc94 cmd
启动 PowerShell,运行以下命令:
C:\powershell cd C:\TEMP $file = (Get-ChildItem -Path C:\Temp\idcs.cer) $file |
Import-Certificate -CertStoreLocation cert:\LocalMachine\Root
为了以静默模式安装 AD Bridge 代理,首先需要创建两个输入文件,如下所示:
a.文件名:SilentInstallData.json
{ "CloudServiceUrl": "https://mydemotenant1.idcs.internal.oracle.com:8943", "ClientID":
"e7c04e28bc12415190ea37f0e2fdf325", "ClientSecret": "71d6b308-a21e-47ef-9dc1-f5ee907ce2e3",
"AdUserName": "oracle", "AdUserPassword": "P@ssw0rd", "UseLdapSsl": false }
使用 IDCS 生成的信息填充 CloudServiceUrl、ClientID 和 ClientSecret 参数的值。AdUserName 和 AdUserPassword 对应于 AD Bridge 在同步过程中执行查询操作所使用的 AD 域帐户。确保此帐户具有适当的权限来查询 AD 域中的数据。
b.文件名:domainDefs.json
[{ "domain": "other.com", "dc": "zeus.other.com" }]
domain 和 dc 参数分别代表域控制器的 AD 域名和主机名。创建输入文件之后,在容器中运行以下命令来执行 AD Bridge 的静默安装:
cd C:\TEMP ad-id-bridge.exe DomainDefs=domainDefs.json ResponseFile=SilentInstallData.json
/quiet /log idbinstall.log
最后一条命令结束之后,检查日志文件,验证安装是否完成且无错误。此时,如果您登录 IDCS 租户服务并转至 Settings #→ Directory Integrations,您应该能够看到安装了 AD Bridge 的容器的主机名(图 6)。
图 6.目录集成 — AD Bridge
运行以下命令将正在运行的容器 3950c998bc94 提交到新映像中:
docker commit -m "AD-BRIDGE" 3950c998bc94 adbridge/winsrvcore2016:1.0
运行以下命令,验证新映像是否在本地信息库中列出:
docker images
输出应类似以下文本所示:
C:\>docker images REPOSITORY TAG IMAGE ID CREATED SIZE adbridge/winsrvcore2016 1.0
51e3b01191e9 56 minutes ago 10.3 GB microsoft/windowsservercore latest 4f222178c921 3 weeks
ago 10.2 GB
此输出显示了两个映像;一个包含基本 Windows Server Core 映像,另一个 (adbridge/winsrvcore2016) 还包含我们的更改,包括 SSL 证书的导入以及安装的 AD Bridge 代理。由于 Docker 中的分层系统,新映像显示为 10.3 GB,但实际上仅使用了 0.5 GB 的物理空间;其余属于基本映像。
运行以下命令将映像保存到压缩文件中:
docker save --output C:\Temp\idbridge-srvcore.tar 51e3b01191e9
运行以下命令,停止并删除当前 Windows 容器:
docker stop id1-docker docker rm 3950c998bc94
运行以下命令,将映像加载到本地信息库中并做标记:
运行以下命令:
docker swarm init --advertise-addr 192.168.0.204
此命令初始化 Docker Swarm,将当前服务器添加为第一个节点。advertise-addr 参数指定服务器(本例中为第一个 Windows Server 2016)的 IP 地址,此地址将发布给其他 Swarm 成员,用于 API 访问和覆盖网络。
运行以下命令列出 Swarm 中的可用节点:
docker node ls
输出应类似以下文本所示:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 3sbj6rsvuewvaw78307keunxr * ID1-SRVCORE Ready
Active Leader
由于这是加入 Swarm 的第一个节点,因此它将自动承担管理节点的角色 (Leader)。
运行以下命令:
docker service create -t --name adbridge --detach=false --hostname id1-docker --credential-
spec="file://oracleservice.json" --replicas 1 adbridge/srvcore2016:1.0 cmd
此命令指示 Swarm 使用 adbridge/srvcore2016:1.0 映像创建一个新服务。replica 参数指定复制服务的副本任务数。默认情况下,管理节点也可以像工作节点一样运行服务;因此,上一条命令将产生一个在管理节点中运行的新 Windows 容器。运行以下命令验证服务是否在 Swarm 中运行:
docker service ls
输出应类似以下文本所示:
ID NAME MODE REPLICAS IMAGE PORTS ryawbq164eqz adbridge replicated 1/1
adbridge/srvcore2016:1.0
以下命令显示正在运行的容器:
docker ps
输出应类似以下文本所示:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca0c41382737 adbridge/srvcore2016:1.0
"cmd" 2 minutes ago Up About a minute adbridge.1.m2c4yeaexhmunclj5qa6rfa2o
运行以下命令:
docker service scale adbridge=2
上面一条命令指示将 Swarm 服务数增加到 2;基本上,这意味着的另一个 AD Bridge 实例将开始在新容器中运行。
运行以下命令显示服务状态:
docker service ls
输出应类似以下文本所示(注意,现在副本数是两个):
ID NAME MODE REPLICAS IMAGE PORTS ryawbq164eqz adbridge replicated 2/2
adbridge/srvcore2016:1.0
以下命令将显示正在运行的容器:
docker ps
输出应类似以下文本所示:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca0c41382737 adbridge/srvcore2016:1.0
"cmd" About a minute ago Up About a minute adbridge.2.sew9xkw74tgrzjh68ewws55be 9931a440fb8f
adbridge/srvcore2016:1.0 "cmd" 5 minutes ago Up 5 minutes adbridge.1.m2c4yeaexhmunclj5qa6rfa2o
运行以下命令访问容器,确定容器内运行的 AD Bridge 实例是否是处理导入过程的实例。
docker exec -it <container_id> cmd type C:\ProgramData\Oracle\IDBridge\logs\IDBridge.log
第二条命令将显示日志文件的内容,帮助确定该实例是否正在处理用户数据导入。否则,我们将在第二个容器中运行相同的命令。如果该实例正在处理导入,以下命令将停止该实例:
Powershell Stop-Service -name IDBridge exit
最后一条命令退出容器并返回到主机服务器。然后,我们将使用以下命令停止并删除该容器:
docker stop <container_id> docker rm <container_id>
运行以下命令:
docker ps
输出显示已经添加了一个新的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3155e78cb2e5 adbridge/srvcore2016:1.0
"cmd" 14 minutes ago Up 14 minutes adbridge.2.pxk7bfu66lbvgkm7iz7zgewsz 9931a440fb8f
adbridge/srvcore2016:1.0 "cmd" About an hour ago Up About an hour
adbridge.1.60vcbqp4w4ctb5c9tg8gfdxp0
图 7.目录集成 — 导入过程
在第一个服务器或管理节点上运行以下命令:
docker swarm join-token worker
此命令将显示将其他节点加入集群所需的令牌字符串。输出类似以下文本所示:
To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1
-05zmd77r7fla384zx8dus28zpsv0n5rus38gugns2fe3o97f2u-5a9zp4mbpp3qolloa48gitog9
192.168.0.204:2377
在第二个和第三个服务器上运行以下命令:
docker swarm join --token SWMTKN-1-05zmd77r7fla384zx8dus28zpsv0n5rus38gugns2fe3o97f2u-
5a9zp4mbpp3qolloa48gitog9 192.168.0.204:2377
在第一个服务器或管理节点中运行以下命令,列出 Swarm 中的可用节点:
docker node ls
输出应类似以下文本所示:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS hdnactidu3kb8z00f47hwq0f5 ID3-SRVCORE Ready
Active juehq3q313dazsxllhtbn0il2 * ID1-SRVCORE Ready Active Leader m9fih9k6p882z39w8yghrphl8
ID2-SRVCORE Ready Active
在第一个服务器或管理节点上运行以下命令:
docker service scale adbridge=3
上述命令指示 Swarm 将 adbridge 服务的副本数增加到 3。由于集群中现在有三个可用节点,因此它将在其余每个服务器上启动一个 Windows 容器,共计三个容器。
运行以下命令显示服务状态:
docker service ls
输出应类似以下文本所示(注意副本数现在是三个):
ID NAME MODE REPLICAS IMAGE PORTS 2jtgntraysn1 adbridge replicated 3/3
adbridge/srvcore2016:1.0
以下命令显示 Swarm 集群中服务 adbridge 的其他详细信息:
docker service ps adbridge
输出应类似以下文本所示:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS h4nhqmckt96j adbridge.1
adbridge/srvcore2016:1.0 ID3-SRVCORE Running Running about a minute ago im8ypfbp9xlk
adbridge.2 adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running 2 minutes ago 82b1iqhsm0sd
adbridge.3 adbridge/srvcore2016:1.0 ID2-SRVCORE Running Running about a minute ago
在每个节点上运行以下命令访问容器,确定容器内运行的 AD Bridge 实例是否是处理导入过程的实例:
docker exec -it <container_id> cmd type C:\ProgramData\Oracle\IDBridge\logs\IDBridge.log
第二条命令将显示日志文件的内容,帮助确定该实例是否正在处理用户数据导入。如果正在处理,我们将关闭正在运行实例的节点。
运行以下命令查看服务详细信息:
docker service ps adbridge
输出反映其中一个节点已关闭,同时还显示现在第一个节点上有两个服务在运行。这样做是为了补偿第二个节点的损失,并保持运行中的服务数为 3:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS h4nhqmckt96j adbridge.1
adbridge/srvcore2016:1.0 ID3-SRVCORE Running Running 19 minutes ago im8ypfbp9xlk adbridge.2
adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running 19 minutes ago 93mn9x7q1loe adbridge.3
adbridge/srvcore2016:1.0 ID1-SRVCORE Running Running about a minute ago 82b1iqhsm0sd \_
adbridge.3 adbridge/srvcore2016:1.0 ID2-SRVCORE Shutdown Running 19 minutes ago
Docker 得到广泛采纳的原因之一是它能够让应用的打包和发送变得非常轻松。在 Docker 引擎中包含 Swarm 是其功能扩展过程中的重大进步,也是集群技术的入口点,和加入 Kubernetes 和 Mesos 等是一个道理。
在本文中,我们探讨了在 AD Bridge(与 Microsoft Active Directory 集成时所使用的 IDCS 组件)中实现高可用性的方法。
有关本文中提及的产品和特性的其他参考资料,请参见以下链接:
Ricardo Gutierrez 是 Oracle 的资深 IT 顾问,致力于 IDaaS、CASB、身份和访问管理、身份分析、身份治理、企业 SSO、联合、特权帐户管理、数据库和应用安全。Ricardo 拥有超过 25 年的经验,过去 13 年从事 IBM、Microsoft 和 Oracle 的全套安全产品的工作。他还是 PMP、CCSP 和 VMware 认证专业人员,发表了多种有关安全和云计算的白皮书、文章和培训材料。
SaveSaveSave