当前位置: 首页 > news >正文

中国区 AWS 控制台集成 ADFS 登录

前言

本文将使用一台 Windows Server 2019 服务器实现自建 AD + ADFS 环境集成到中国区 AWS 控制台进行单点登录.
参考文档: https://aws.amazon.com/cn/blogs/china/adfs-bjs/

配置 AD

生产环境建议先给本地连接设置静态 IP 地址, 不设置也没事儿, 后面配置功能的时候会有 Warning 提示, 测试环境忽略不碍事. 管理员身份打开 PowerShell 执行下面命令:

# 重命名主机名 (自动重启)
Rename-Computer -NewName "ADFS" -Restart# 添加 AD 功能
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools# 创建新的林和名为 alian.com 的域 (需要设置 SafeMode 恢复密码, 自动重启)
Install-ADDSForest -DomainName alian.com -InstallDNS

创建 AD 账号

# 创建新的 OU
New-ADOrganizationalUnit -Name "AWS" -Path "DC=alian,DC=com"# 创建组
New-ADGroup -Name "AWS-Admin" -Path "OU=AWS,DC=alian,DC=com" -GroupScope Universal
New-ADGroup -Name "AWS-ReadOnly" -Path "OU=AWS,DC=alian,DC=com" -GroupScope Universal# 创建用户
New-ADUser -Name "awsadmin" -DisplayName "AWS Administartor" -SamAccountName "awsadmin" -EmailAddress "awdadmin@alian.com" -UserPrincipalName "awsadmin@alian.com" -Path "OU=AWS,DC=alian,DC=com" -AccountPassword (ConvertTo-SecureString "Password123#" -AsPlainText -Force) -ChangePasswordAtLogon $false -Enabled $true -PasswordNeverExpires $true# 将用户添加到组
Add-ADGroupMember -Identity "CN=AWS-Admin,OU=AWS,DC=alian,DC=com" -Members "CN=awsadmin,OU=AWS,DC=alian,DC=com"

New-ADUser 文档: https://learn.microsoft.com/en-us/powershell/module/activedirectory/new-aduser?view=windowsserver2022-ps#examples
Add-ADGroupMember 命令中需要传入包含 OU 信息的完整路径

ADFS 基础配置

# 安装 ADFS 和 IIS 功能
Install-WindowsFeature -Name ADFS-Federation,Web-Server -IncludeManagementTools# 创建自签名证书
New-SelfSignedCertificate -DnsName "adfs.alian.com" -CertStoreLocation "Cert:\LocalMachine\My"# 创建 ADFS Farm
$cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object { $_.Subject -match "adfs.alian.com" }
Install-AdfsFarm -CertificateThumbprint $cert.Thumbprint -FederationServiceName "adfs.alian.com" -ServiceAccountCredential (Get-Credential -Credential alian\administrator)# 添加 DNS 解析
$ip = (Get-DnsServerResourceRecord -ZoneName "alian.com" -Name $env:COMPUTERNAME).RecordData.IPv4Address.IPAddressToString
Add-DnsServerResourceRecord -Name "adfs" -ZoneName "alian.com" -A -IPv4Address $ip

安装 Firefox 或 Chrome 浏览器, 访问 https://adfs.alian.com/FederationMetadata/2007-06/FederationMetadata.xml 下载 XML 文件备用.

AWS IAM 配置

打开 IAM 控制台 > Identity providers > Add provider > Provider type: SAML, 起个名字, 打开上一步下载好的 Metadata XML 文件, 保存
在这里插入图片描述
保存后, 复制 ARN 信息备用.
在这里插入图片描述
再打开 Roles > Create role > Trust entity type 选择 “SAML 2.0 federation”, 下面的 provider 选择上一步创建好的项目, 选择 “Allow programmatic and Amazon Web Services Management Console access” 允许联合登录访问控制台
在这里插入图片描述
选择托管策略 AdministratorAccess, Role name 输入 ADFS-Admin, Review 一下创建. 注意这里给 Role 起的名称前缀 ADFS- 将会用在后续做信任转换匹配.
在这里插入图片描述
复制 Role ARN 后面备用
在这里插入图片描述

ADFS 进阶配置

# 添加 Relying Party Trust (信赖方信任)
Add-AdfsRelyingPartyTrust -Name "AWS Console" -MetadataURL "https://signin.amazonaws.cn/static/saml-metadata.xml" -AccessControlPolicyName "Permit everyone"# 存入变量
$rp = Get-AdfsRelyingPartyTrust -Name "AWS Console"

接下来是重点也是最难搞的一步, 就是配置转换规则, 将 SAML 中解析出来的内容映射到 AWS IAM 可以匹配的 Role. 官方文档里面用的是 GUI 一条一条添加的, 实例规则代码还有一些纰漏, 不如继续用 PowerShell 搞. 注意替换 $rule 中 ARN 和前面 IAM 中的信息保持一致.

$rule = @'
@RuleTemplate = "MapClaims"
@RuleName = "NameId"
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]=> issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = c.Value, ValueType = c.ValueType, Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent");@RuleTemplate = "LdapClaims"
@RuleName = "RoleSessionName"
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]=> issue(store = "Active Directory", types = ("https://aws.amazon.com/SAML/Attributes/RoleSessionName"), query = ";mail;{0}", param = c.Value);@RuleName = "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);@RuleName = "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::123123123123:saml-provider/alian.com-adfs,arn:aws-cn:iam::123123123123:role/ADFS-"));
'@Set-AdfsRelyingPartyTrust -TargetRelyingParty $rp -IssuanceTransformRules $rule# 开启 SingonPage 否则会出现后面无法登录的错误
Set-AdfsProperties -EnableIdpInitiatedSignonPage $true# 重启 ADFS 服务
Restart-Service adfssrv

测试访问

使用 Firefox 访问 https://adfs.alian.com/adfs/ls/IdpInitiatedSignOn.aspx
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

填坑

如果没有执行前面Set-AdfsProperties -EnableIdpInitiatedSignonPage $true 登录后会报错:

    Activity ID: 9c0aa720-9776-4b96-0700-0080000000fbError details: MSIS7012: An error occurred while processing the request. Contact your administrator for details.Node name: 7440faec-1a4f-4023-b34c-caf6be8fada7Error time: Wed, 22 May 2024 14:18:13 GMTCookie: enabledUser agent string: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0

在这里插入图片描述

# 检查 ADFS 属性, 默认并没有开启 SingonPage
Get-AdfsProperties | Select-Object -Property EnableIdpInitiatedSignonPage# 打开
Set-AdfsProperties -EnableIdpInitiatedSignonPage $true

相关文章:

  • List Control控件绑定变量
  • React暴露组件的方法给全局作用域调用
  • 【Linux】Linux的安装
  • Gitee的原理及应用详解(一)
  • 医疗科技:UWB模块为智能医疗设备带来的变革
  • Vue3实战笔记(45)—VUE3封装一些echarts常用的组件,附源码
  • 【DZ模板】克米设计APP手机版本地化+完美使用
  • Atlas 200I DK A2安装MindSpore Ascend版本
  • Yolov9调用COCOAPI生成APs,APm,APl
  • 每日OJ题_剑指offer斐波那契数列篇
  • 奇舞周刊第529期:万字长文入门前端全球化
  • STM32F1之OV7725摄像头
  • Golang | Leetcode Golang题解之第112题路径总和
  • 医院门诊互联电子病历|基于SSM+vue的医院门诊互联电子病历管理信息系统的设计与实现(源码+数据库+文档)
  • 存在重复元素 II[简单]
  • 【347天】每日项目总结系列085(2018.01.18)
  • ES学习笔记(12)--Symbol
  • git 常用命令
  • JS函数式编程 数组部分风格 ES6版
  • k个最大的数及变种小结
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • tab.js分享及浏览器兼容性问题汇总
  • underscore源码剖析之整体架构
  • vue 配置sass、scss全局变量
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vue全家桶实现一个Web App
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 鱼骨图 - 如何绘制?
  • ​secrets --- 生成管理密码的安全随机数​
  • ​什么是bug?bug的源头在哪里?
  • #### go map 底层结构 ####
  • #FPGA(基础知识)
  • #微信小程序:微信小程序常见的配置传值
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.13) SiK无线电高级配置(五)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (33)STM32——485实验笔记
  • (7)svelte 教程: Props(属性)
  • (arch)linux 转换文件编码格式
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)大型网站架构演变和知识体系
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [2016.7 test.5] T1
  • [BUG] Authentication Error
  • [HDU] 1054 Strategic Game 入门树形DP
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • [Linux] PXE批量装机
  • [Notice] 朋友们,blog更新http://jiang-hongfei.spaces.live.com
  • [one_demo_10]递归解决汉诺塔问题