亚马逊AWS官方博客

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

亚马逊云控制台配置

上一章我们已经配置了 AD 域及 ADFS 服务,在域中添加了用户 bob 并将他设置为组 AWS-Dev 和 RSDB-dev 的成员。本章将使用之前导出的 ADFS 元数据文件 FederationMetadata.xml 创建一个 idP(Identity Provider),然后创建名为 ADFS-Dev 的 IAM Role 并附加 Redshift 和 RDS 两个服务的控制台浏览权限以及 Redshift 数据库的访问权限。ADFS 将把域组 AWS-Dev 映射到名为 ADFS-Dev 的 IAM Role;把域组 RSDB=dev 映射为数据库组 dev。本章也包含了 Claim role 的相关配置,这样可以比较两者是如何协同工作的。

1. 使用前期下载的配置文件 xml 创建名为 adfs-saml 的 idP

控制台路径:Identity and Access Management (IAM)->Identity providers->Add provider

2. 创建用于访问 Redshift 的策略 adfs-redshift

控制台路径:Identity and Access Management (IAM) -> Policies -> Create policy -> JSON

[adfs-redshift]

以下示例中,Redshift 集群名称为 cluster-identifer。数据库名为 mydb,123456789101 为账号 ID。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws-cn:redshift:cn-northwest-1:123456789101:dbname:cluster-identifier/mydb",
                "arn:aws-cn:redshift:cn-northwest-1:123456789101:dbuser:cluster-identifier/${redshift:DbUser}",
                "arn:aws-cn:redshift:cn-northwest-1:123456789101:cluster:cluster-identifier"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "redshift:CreateClusterUser",
            "Resource": "arn:aws-cn:redshift:cn-northwest-1:123456789101:dbuser:cluster-identifier/${redshift:DbUser}"
        },
        {
            "Effect": "Allow",
            "Action": "redshift:JoinGroup",
            "Resource": "arn:aws-cn:redshift:cn-northwest-1:123456789101:dbgroup:cluster-identifier/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "redshift:DescribeClusters",
                "iam:ListRoles"
            ],
            "Resource": "*"
        }
    ]
}

3. 创建名为 ADFS-Dev 的 IAM Role

控制台路径:Identity and Access Management (IAM) -> Roles -> Create role -> SAML 2.0 federation

[ADFS-Dev]

我们允许控制台访问以及代码访问,因此选择 Allow programmatic and Amazon Web Services Management Console access,并且附加将刚才创建的策略 adfs-redshift 和系统内置策略 AmazonRedshiftReadOnlyAccess,AmazonRDSReadOnlyAccess

4. 回到 Windows 域服务器,在 PowerShell 中执行以下命令下载 SAML 元数据备用

wget https://signin.amazonaws.cn/static/saml-metadata.xml -O Documents\saml-metadata.xml
dir .\Documents\saml-metadata.xml

Directory: C:\Users\Administrator\Documents

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         3/14/2024   1:27 PM           5674 saml-metadata.xml

5. 在 Server Manager 的工具管理器中点击“AD FS Management”为 ADFS 服务添加 Relying Party Trust

6. 添加 Claim Role

Relying Party Trust 向导完成之后自动进入添加 Claim Role 向导。我们将在此创建 6 条转换规则。IAM Role 与 ADFS Claim Role 配合完成身份认证,最终决定用户在控制台或者 Redshift 数据库所拥有的权限。本例中对控制台将有 Redshift 和 RDS 服务的只读权限;而数据库中的权限将从组 dev 继承。

6 条规则均借助向导中的模板完成,相关选项及截图如下:

  • Transform an Incoming Claim -> [Name ID] -> Windows account name -> Name ID -> Persistent Identifier -> Pass through all claim values -> Finish
  • Send LDAP Attributes as Claim -> [RoleSessionName] -> Active Directory ->

E-Mail-Addresses -> [https://aws.amazon.com/SAML/Attributes/RoleSessionName]

Employee-ID -> [https://redshift.amazon.com/SAML/Attributes/DbUser]

-> Finish

  • Send Claim Using a Custom Rule -> [Get AD Groups] ->
    c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => add(store = "Active Directory", types = ("http://temp/variable"), query = ";tokenGroups;{0}", param = c.Value);
  • Send Claim Using a Custom Rule -> [DbGroups] ->
    c:[Type == "http://temp/variable", Value =~ "(?i)^RSDB-"]
     => issue(Type = "https://redshift.amazon.com/SAML/Attributes/DbGroups", Value = RegExReplace(c.Value, "RSDB-", ""));
    
  • Send Claim Using a Custom Rule -> [Roles] ->
    c:[Type == "http://temp/variable", Value =~ "(?i)^AWS-"] => issue(Type = "https://aws.amazon.com/SAML/Attributes/Role", Value = RegExReplace(c.Value, "AWS-", "arn:aws-cn:iam::123456789101:saml-provider/adfs-saml,arn:aws-cn:iam::123456789101:role/ADFS-"));

    请注意替换账号 ID,示例中为 123456789101

  • Send Claim Using a Custom Rule -> [AutoCreate] ->
    => issue(Type = "https://redshift.amazon.com/SAML/Attributes/AutoCreate", Value = "true");

7. 在 AD 域服务器的 Firefox 浏览器中验证控制台登录

https://dc.adfs.cn/adfs/ls/IdpInitiatedSignOn.aspx

可以看到,bob 通过 IAM Role ADFS-Dev 登录到控制台,完整的用户名称为 ADFS-Dev/bob@adfs.cn,并且可以浏览 Redshift 集群及 RDS 实例及其监控指标。

至此,我们已经完成了服务器端的所有安装配置。下一章将介绍 ODBC 以及 JDBC 常用工具的配置。最后通过一段代码展示如何在 java 中设置这些属性实现免用户连接 Redshift。

本篇作者

白国栋

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