背景:我正在尝试通过 ADFS 在本地 AD 和 AWS 之间设置单点登录。我无法访问我们的 ADFS 实例,而且我对 ADFS 确实不太了解,所以我只能猜测解决方案。幸运的是,我认为我已经接近目标了,只需解决一个声明规则转换问题,然后我相信一切都会正常进行。
问题:我遇到的问题是,我需要使用声明规则语言(我对此也没有太多经验)将 AD 组转换为 AWS 角色,但我提出的规则无法正常工作。
我尝试过的:我已经让 AD 组填充临时/变量类型,并传递到管道中的下一步,即颁发令牌。我需要解析的 AD 组的格式是:AWS#AWS_AccountName#AWS_RoleName#AWS_AccountNumber(即 AWS#Sandbox#SecurityAuditor#1234567890)。
我需要使用此组名中的 AWS_RoleName 和 AWS_AccountNumber 来生成要传递给 AWS 的 arn。我尝试使用 RegExReplace 通过以下规则执行此操作:c:[Type=="http://temp/variable", Value=~"(?i)(^AWS)#([-_a-z0-9]+)#([-_a-z0-9]+)#([-_a-z0-9]+)"] => issue(Type="https://aws.amazon.com/SAML/Attributes/Role", Value=RegExReplace(c.Value, "(?i)(^AWS)#([-_a-z0-9]+)#([-_a-z0-9]+)#([-a-z0-9]+)”,“arn:aws:iam:$4:saml-provider/ADFS,arn:aws:iam:$4:role/AWSReservedSSO$3))
我的想法是使用 $ 来填写获取访问权限所需的 AWS 角色名。但是我认为这行不通,因为我刚刚读到 RegExReplace 用第三个参数生成的字符串替换源字符串中的所有 RegEx 匹配项。
有人能指出这个索赔规则的缺陷吗?或者可以制定更好的规则来获得期望的结果吗?
先感谢您
答案1
好吧,出于某种原因,我的 $index 构造不起作用。当我在正则表达式中用命名变量替换它们时,它开始正常工作。所以我更新后的声明规则如下所示:
c:[Type=="http://temp/variable",
Value=~"(?i)(^AWS)#([-_a-z0-9]+)#([-_a-z0-9]+)#([-_a-z0-9]+)"] =>
issue(Type="https://aws.amazon.com/SAML/Attributes/Role",
Value=RegExReplace(c.Value,
"(?i)(^AWS)#(?<accountname>[-_a-z0-9]+)#(?<role>[-_a-z0-9]+)#(?<accountnumber>[-a-z0-9]+)",
"arn:aws:iam:${accountnumber}:saml-provider/ADFS,arn:aws:iam:${accountnumber}:role/${role}))