亚马逊AWS官方博客

基于 TLS 1.2 TLS 1.3 的 SAML ADFS 实现控制台及 Redshift 用户的安全单点登录(一)

背景介绍

很多企业都希望借助 Windows Active Directory Federation Service(以下简称 ADFS)将亚马逊云科技 Identity and Access Management(以下简称 IAM)用户与现有的用户管理系统集成以实现单点登录 Single Sign-On(以下简称 SSO)。以往知识库曾介绍过配置方法,如:[为 AWS 北京区管理控制台集成 ADFS 访问],[Enabling Federation to AWS Using ADFS]等。但是随着 TLS 1.0 TLS 1.1 的弃用以及 Windows 操作系统的更新迭代,在 Windows 2016 及以上版本的操作系统中部署这些应用的方式存在较大的差异。

本文兼顾控制台用户以及 Amazon Redshift(以下简称 Redshift)用户鉴权的实现,分以下三部分介绍如何在 Windows 2022 上完成相应的安装配置。

  • Windows 域服务器:TLS 1.2/TLS 1.3 更安全更高效,是 Windows 2016 及后续操作系统版本所推荐的默认配置。在本文中我将介绍如何为 .NET Framework 设置 TLS 1.2/TLS 1.3,并安装 Active Directory(以下简称 AD)、 Active Directory Federation Service(以下简称 ADFS)以及 Internet Information Services(以下简称 IIS)。
  • 亚马逊云控制台配置:除了控制台用户的单点登录,我们还要实现使用 IAM 凭证登录 Redshift 以替代原有的用户名密码登录方式。本文将介绍 SAML Identity Provider 的创建以及如何设置 ADFS Claim Role 配合 IAM Role 自动管理 Redshift 数据库账号。
  • 客户端配置:Redshift 提供 ODBC 及 JDBC 驱动,均支持 IAM。本文将介绍两种客户端不同连接方式的安装配置。最后通过一段 Java 代码展示如何使用 IAM 方式连接到 Redshift 数据库。

架构设计

基于 SAML 的联合身份验证原理是相似的。例如 ADFS,PingOne,Okta,Azure AD 等。以 ADFS 为例,如下图所示:

  1. 客户端向 ADFS 服务提出身份鉴权申请用于控制台登录或者 Redshift 数据库登录。
  2. ADFS 服务向 AD 服务确认鉴权。
  3. 客户端收到来自 ADFS 服务的 SAML 鉴权反馈(SAML assertion)。
  4. 客户端将 SAML assertion 提交给亚马逊云平台。AssumeRoleWithSAML API 将被调用生成临时凭证。
  5. 亚马逊云平台把临时凭证反馈给客户端。客户端用临时凭证访问控制台或者 Redshift。

前提条件

  • 一个 Redshift 集群。本文示例中的集群 id 为 cluster-identifier。
  • 在与 Redshift 同一 Virtual Private Cloud(以下简称 VPC)中启动两台 Windows 2022 x64 操作系统的 Elastic Compute Cloud(以下简称 EC2)实例并关闭防火墙。一台用于安装配置 AD 域服务器,另一台用于安装客户端应用程序。
    本文使用的 AMI 在宁夏区,名称为 Windows_Server-2022-English-Full-Base-2024.02.14; AMI ID 为 ami-08e3f0d5f88293425
  • 合理配置安全组,路由及 NACL 等。至少满足以下条件:
    • 正确配置 Redshift 的安全组以允许两台 EC2 访问其 5439 端口
    • 两台 EC2 之间互通
    • 两台 EC2 可访问互联网

方案部署

Windows 服务器配置

本章借助向导及 PowerShell 命令完成 Windows 域、ADFS 等服务的安装配置。除屏幕截图说明之外的步骤均使用默认选项直接点击 Next 即可。PowerShell 工具需以管理员身份运行。由于各服务及 TLS 之间存在依赖,需按以下顺序依次执行。

1. 参考 ipconfig 命令的输出获得当前 IPv4 设置

将其中一台 Windows 的 IP 设置为静态作为 AD 及 ADFS 服务器以便于后续客户端访问

2. PowerShell 运行以下命令添加注册表键以便 .NET Framework 启用 TLS 1.2/TLS 1.3

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727' -Name 'SystemDefaultTlsVersions' -Value 1 -PropertyType dword -Force

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727' -Name 'SchUseStrongCrypto' -Value 1 -PropertyType dword -Force

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Name 'SystemDefaultTlsVersions' -Value 1 -PropertyType dword -Force

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value 1 -PropertyType dword -Force

将服务器重命名为 dc(重启生效)

Rename-Computer -NewName "dc" -Restart

3. 运行以下命令安装 Firefox 浏览器

$firefoxUrl = "https://download.mozilla.org/?product=firefox-latest&os=win64&lang=en-US"
$destination = "$env:TEMP\firefox_installer.exe"
Invoke-WebRequest -Uri $firefoxUrl -OutFile $destination;Start-Process -FilePath "$env:TEMP\firefox_installer.exe" -ArgumentList "/S" -Wait

4. 运行以下一组命令安装 PSPKI,创建自签名并导入 trust store

以下示例中使用了之前配置的服务器 IP 地址 10.0.47.17

Install-Module -Name PSPKI
Import-Module PSPKI
$secure_pw = ConvertTo-SecureString "MyPassword" -AsPlainText -Force

New-SelfSignedCertificateEx -Subject 'CN=dc.adfs.cn' -ProviderName "Microsoft Software Key Storage Provider" -KeyLength 2048 -SignatureAlgorithm sha256 -EKU "Server Authentication", "Client authentication" -KeyUsage "KeyEncipherment,DigitalSignature,KeyCertSign,CRLSign" -SAN "dns:*.adfs.cn","ip:10.0.47.17" -Exportable  -NotAfter (Get-Date).AddYears(100) -Path C:\Users\Administrator\Documents\adfs.cn.pfx -Password $secure_pw
Import-PfxCertificate -Password $secure_pw -CertStoreLocation Cert:\LocalMachine\Root -FilePath C:\Users\Administrator\Documents\adfs.cn.pfx

Import-PfxCertificate -Password $secure_pw -CertStoreLocation Cert:\LocalMachine\My -FilePath C:\Users\Administrator\Documents\adfs.cn.pfx

5. 从 Windows 开始导航栏打开 Server Manager,安装 AD,ADFS

除非有截图说明,向导中的其它步骤均取默认值即可。如图所示, 点击”Add roles and features”开始安装相关组件

Server Roles 选取以下三项:AD,ADFS,IIS

6. 点击“Promote this server to a domain controller”开始配置 AD 域控制器 adfs.cn

AD 配置完成之后会自动重启并以域身份登录。用 cmd 命令行验证

创建用户及组(Windows PowerShell 执行),请注意使用满足 Windows 复杂度要求的密码避免创建用户失败

dsadd user "cn=Bob,cn=Users,dc=adfs,dc=cn" -samid bob -upn bob@adfs.cn -email bob@adfs.cn -fn Bob -ln Wang -display "Bob Wang" -disabled no -empid "dev007" -pwd "MyPassword123("

dsadd group "cn=AWS-Dev, cn=Users, dc=adfs, dc=cn" -members "cn=Bob, cn=Users, dc=adfs, dc=cn"

dsadd group "cn=RSDB-dev, cn=Users, dc=adfs, dc=cn" -members "cn=Bob, cn=Users, dc=adfs, dc=cn"

Add-KdsRootKey -EffectiveTime (Get-Date).AddHours(-10)

7. 为 IIS 启用 https

在 Server Manager 的工具管理器中点击“Internet Information Services (IIS) Manager” 进入 IIS 配置页面。右键点击 “Default Web Site”并在弹窗中点击”Edit Bindings”

Host names 名为 dc.adfs.cn,SSL 证书为前期创建的自签名证书,其它栏位如下图所示

通过 Firefox 浏览器确认 http 以及 https 均可正常访问站点

8. 返回 Server Manager 控制台,点击 ”Configure the federation service on this server.” 开始配置 ADFS

在 PowerShell 中执行以下命令为 ADFS 启用 SignonPage,然后下载元数据文件备用

Set-AdfsProperties -EnableIdpInitiatedSignonPage $true

wget https://dc.adfs.cn/FederationMetadata/2007-06/FederationMetadata.xml -O Documents\FederationMetadata.xml

至此,我们已经完成了 Windows 域、ADFS 等服务的安装。下一章我们将介绍如何使用刚才下载的元数据文件通过亚马逊云控制台创建一个 idP (Identity Provider),并完成 IAM role、claim role 等相关配置。

本篇作者

白国栋

西云数据资深技术支持工程师,拥有超过 15 年的数据库行业经验。曾设计并交付电信、金融、电商等行业大型分布式数据库集群,是亚马逊云科技 RDS Oracle,Aurora,Redshift 等多个领域的专家。擅于深挖客户遇到的各类云上疑难问题,始终追求彻底解决问题的卓越标准。