亚马逊AWS官方博客

AWS中国区配置PingIdentity身份集成实现Redshift数据库群集单点登录

无疑使用单点登录 (SSO)访问组织中的多种应用程序能够提升用户体验 。 如果您负责为 Amazon Redshift 启用 SSO,则可以使用 ADFS、PingIdentity、Okta、Azure AD 或其他基于 SAML 浏览器的身份提供程序设置 SSO 身份验证。

这篇文章向您展示了如何将 PingOne 设置为您的 IdP。包含以下步骤:

  1. 配置IdP(PingOne)用户组和用户 – PingOne集成Microsoft AD获取用户组和用户
  2. 配置IdP(PingOne)应用程序 – 创建PingOne应用程序,在应用程序中指定使用的AWS IAM Role,并指定使用该Role的用户组,用户使用该Role可以访问Redshift群集
  3. 配置 IAM SAML 联合认证 – 通过在 PingOne IdP 和 AWS 之间建立信任关系,设置允许 PingOne 访问 Amazon Redshift 的角色
  4. 创建Amazon Redshift DBGroups配置权限 – 在 Amazon Redshift 数据库中创建DBGroups 并授权这些DBGroups访问的schemas和 tables。
  5. 测试单点登录 – 使用Workbench客户端工具进行SSO登录测试并进行权限验证

解决方案概览

联合身份验证的流程以及步骤如下所示:

  1. 用户使用 workbench 客户端登录
  2. IdP(PingOne) 读取Microsoft AD里的用户名和密码进行身份验证,
  3. IDP认证通过返回 SAML 断言
  4. 客户端使用 AWS SDK调用 AWS Security Token Service (AWS STS) 以使用 SAML 代入角色(assume Role)
  5. AWS STS 返回临时 AWS 凭证
  6. 客户端使用临时 AWS 凭证访问Redshift

联合身份单点登录流程图

配置步骤

前提

(1)配置之前如果没有组织内没有购买PingOne服务你需要访问

https://www.pingidentity.com/en/trials/p14e-trial.html 注册免费账户

(2)Microsoft AD需要访问互联网权限 需要在AD服务器上安装PingOne AD 连接器用于访问PingOne服务

Microsoft AD域中创建用户组和用户

登录AD创建用户和用户组并把用户加入相应的用户组

例如:创建四个用户 readonly01 readonly02 readwrite01 readwrite02 创建两个用户组 readonly readwrite 将用户 readonly01 readonly02加入用户组readonly 将用户readwrite01 readwrite02用户加入用户组readwrite

注意:添加用户时为用户配置邮箱地址

用户组成员:

配置PingOne连接Microsoft AD

1. 登录PingOne管理Portal https://admin.pingone.com/web-portal/login

2. 导航栏中点击“setup”,选择”Identity Repository“点击“Connect to an Identiy Repositry”

3. 选择“Active Directory”作为认证源

4. 按照提示步骤进行操作,完成AD认证集成

AD Connector安装步骤可参考链接

5. 配置完成

6. 导航至 user 可以查看到PingOne已经同步Microsoft AD用户组

配置IdP(PingOne)应用程序

这一步骤需要创建PingOne应用程序,以便用户组成员可以访问AWS Redshift,由于有两个用户组,我们需要创建两个应用程序

1. 登录PingOne管理界面,导航至Application栏

2. 在“My Application”栏选择SAML

3. 选择“Add Application”

4. 选择“New SAML Application”

5. 输入Application 名称 比如: AmazonRedshiftReadOnly

6. 继续下一步

7. 在“Application Configuration”配置界面配置参数如下:

参数名称
Assertion Consumer Service (ACS) http://localhost:7890/redshift/
Entity ID urn:amazon:webservices
Signing Sign Assertion
Signing Algorithm RSA_SHA256

8. 点击下一步

9. 在“SSO Attribute Mapping”配置界面输入以下

Application Attribute Identity Bridge As Literal
https://thinkwithwp.com/SAML/Attributes/Role
arn:aws-cn:iam
::<AWSAccount>:role/pingreadonlyrole,arn:aws-cn:iam
:: <AWSAccount>:saml-provider/pingreadonlyprov

pingreadonlyrole是接下来我们在AWS上创建的IAM角色名称

pingreadonlyprov 是接下来我们在AWS上创建的IDP名称,我们会将PingOne上的SAML Metadata文件下载下来导入到AWS IAM IDP中

True
https://thinkwithwp.com/SAML/Attributes/RoleSessionName
https://redshift.amazon.com/SAML/Attributes/AutoCreate True

10. 在”Group Access”界面选择 AD用户组 readonly

11. 点击下一步

12. 查看配置界面 下载 SAML Metadata文件到本地,下一步骤会导入到AWS IDP中

13. 记录 Initial Single Sign-On(SSO) URL,配置Workbench JDBC连接信息是需要该参数

14. 点击完成

15. 重复上述步骤创建第二个应用程序AmazonRedshiftReadWrite,需要调整以下两部分的参数:

  • SSO Attribute mapping:

https://thinkwithwp.com/SAML/Attributes/Role 参数的值更改为

arn:aws-cn:iam:::role/pingreadwriterole,arn:aws-cn:iam:::saml-provider/pingreadwriteprov

  • Group Access选择AD用户组 readwrite

16. 配置完成后拥有两个应用程序

配置 IAM SAML 联合认证

创建IAM SAML IdP

要配置 IAM SAML,需要创建 IAM IdP 以及角色和策略。

配置步骤如下:

1. 登录AWS Console,选择IAM服务导航至Access management下的Identity Provider

2. 选择 Add Provider,

3. 类型为 SAML,

4. 名称输入 pingreadonlyprov(该名称与PingOne SSO Attribute Mapping中参数https://thinkwithwp.com/SAML/Attributes/Role输入的值一致)

5. Metadata文件 选择PingOne 应用程序AmazonRedshiftReadOnly下载的XML文件

6. 重复上述步骤创建第二个IdP (Metadata文件选择PingOne 应用程序AmazonRedshiftReadWrite 的XML文件)

7. 创建完成后可以看到有两个IdP Provider

创建IAM Role 和 Policy

我们使用IAM Role来控制用户组访问Redshift 数据库的权限。通过配置IAM Role并为该Role绑定策略的方式来限制不同的用户组对Redshift数据库的访问。该Role允许用户通过IdP来访问Redshift群集。

创建IAM Role之前我们需要创建IAM Policy该Policy允许用户拥有joingroup权限

1. AWS IAM服务配置界面选择policy

2. 选择创建Policy

3. 选择JSON,创建两个 pingreadonlypolicy和 pingreadwritepolicy

  • 替换<cluster>为组织中的Redshift cluster名称
  • 替换<dbname>为组织中的Redshift dbname

两个policy的配置不同之处是在JoinGroup的Resource。

“JoinGroup”: pingreadonlypolicy 允许用户加入 Redshift  readonly 组

“JoinGroup”: pingreadwritepolicy 允许用户加入 Redshift readwrite 组

用户访问Redshift 数据库并自动加入Redshift DBGroup只在会话存活期内有效,该策略中并未包含创建DbGroup的权限,因为创建DBGroups并赋予DBgroup相应的权限需要手动在Redshift数据库中完成。

以下代码展示pingreadonlypolicy内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": [
                "arn:aws-cn:redshift:*:*:cluster:<cluster>",
                "arn:aws-cn:redshift:*:*:dbname:<cluster>/<dbname>",
                "arn:aws-cn:redshift:*:*:dbuser:<cluster>/${redshift:DbUser}"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:${redshift:DbUser}"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "redshift:CreateClusterUser",
            "Resource": [
                "arn:aws-cn:redshift:*:*:dbname:<cluster>/<dbname>",
                "arn:aws-cn:redshift:*:*:dbuser:<cluster>/${redshift:DbUser}"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "redshift:JoinGroup",
            "Resource": "arn:aws-cn:redshift:*:*:dbgroup:<cluster>/readonly"
        }
    ]
}

4. 配置完成后可以查看到刚刚创建的Policy

5. 在IAM Console界面选择 Roles

6. 创建Role

7. Type选择 SAML 2.0 federation.

8. SAML provider 选择上述步骤中创建的IdP

9. 选择 Allow programmatic access only.

10. Attribute: SAML:aud.

11. Value输入http://localhost:7890/redshift/.

12. 为第一个Role选择pingreadonlypolicy 第二个Role选择pingreadwritepolicy

13. 为该Role输入名称(pingreadonlyrole 和pingreadwriterole)

14. 创建两个Role显示如下

创建Amazon Redshift DBGroups配置权限

该步骤将在Redshift 数据库中创建DbGroups,该DbGroups的名称需要与IAM Policy中Joingroup的名称保持一致,然后需要赋予DbGroup对Redshift数据库中的shemale以及Table相应的权限,你无需创建DbUser,因为DbUser在通过PingOne SSO登录Redshift后自动加入相应的DbGroup.

  1. 使用admin账户通过Workbench登录Redshift 群集
  2. 使用如下命令创建DbGroups并赋予Group相应的Schema以及Table权限
CREATE SCHEMA finance;
CREATE TABLE IF NOT EXISTS finance.revenue
(
account INTEGER ENCODE az64,
customer VARCHAR(20) ENCODE lzo,
salesamt NUMERIC(18,0) ENCODE az64
)DISTSTYLE AUTO;
CREATE GROUP readonly;
CREATE GROUP readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA finance
GRANT SELECT on TABLES to GROUP readonly;
GRANT USAGE on SCHEMA finance to GROUP readonly;
GRANT SELECT on ALL TABLES in SCHEMA finance to GROUP readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA finance
GRANT ALL on TABLES to GROUP readwrite;
GRANT USAGE on SCHEMA finance to GROUP readwrite;
GRANT ALL on ALL TABLES in SCHEMA finance to GROUP readwrite;
INSERT INTO finance.revenue values 
(101, 'ABC Company', 12000),
(102, 'Tech Logistics', 175400),
(103, 'XYZ Industry', 24355),
(104, 'The tax experts', 186577);

测试单点登录

该步骤将使用Microsoft AD用户使用Workbench SQL Client通过PingOne SSO登录访问Redshift数据库进行操作。

1. 配置Workbench SQL 客户端

如果安装Workbench SQL客户端的服务器未安装JDBC Driver可通过以下链接进行下载安装。 下载链接

2. 创建Connection Profile(该测试将测试ReadWrite权限)

URL: jdbc:redshift:iam://<cluster endpoint>

3. 选择 Extended Properties,输入SSO相关参数

Property Value
login_url https://sso.connect.PingOne.com/sso/sp/initsso?saasid=
plugin_name com.amazon.redshift.plugin.BrowserSamlCredentialsProvider
listen_port 7890
idp_response_timeout 60
DbGroups readwrite

login_url输入PingOne Application Initial Single Sign-On(SSO) URL

4. 点击OK

5. connection Profile界面点击OK按钮

6. 浏览器将会打开PingOne登录界面 输入AD账户用户名以及密码

7. 登录成功

8. 运行select命令:select * from current_user

9. 运行insert命令

INSERT INTO finance.revenue values 
(1111111111, 'ABCDE Company', 12000);

其它补充:

  1. 通过SSO登录的AD用户会永久保存在Redshift 数据用户列表中,但是无法通过本地登录,原因是该用户名为AD用户与IAM Role集成后的联合用户,生成的是临时Credentials并非保存在Redshift数据库用户配置中。参考链接
  2. 该文档在测试步骤中的extended properties指定了参数DbGroups,该参数也可以通过配置PingOne Application SSO Attribute Mapping的参数 https://redshift.amazon.com/SAML/Attributes/DbGroups进行指定

总结:

在这篇博文中,我向您介绍了如何配置和使用 PingOne 作为您的 IdP 并为 Amazon Redshift 集群启用联合 SSO 的部署指南。 您可以按照这些步骤为您的组织设置联合 SSO,并根据读/写权限或业务功能管理访问权限,并将 PingOne IdP 中定义的组成员身份传递到您的 Amazon Redshift 集群中。

本篇作者

侯聪

AWS 专业服务团队云运维咨询顾问,专注于云上运维以及优化方案的咨询与实施。多年从事云基础架构设计交付工作,对虚拟化,SDN,容器,自动化运维等技术领域有深入的研究和热情。

银硕

AWS 专业服务团队云运维咨询顾问,对云上服务建设运维、 DevOps迁移改造等项目交付有丰富的经验。负责企业级客户的云架构设计、云上自动化运维、容器化平台设计咨询等,对云原生技术有深入的研究和热情。