问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用saml2.0和adfs实施api与cli访问联合控制

发布网友 发布时间:2022-04-24 01:25

我来回答

1个回答

热心网友 时间:2022-04-12 11:42

AWS支持使用SAML(安全断言标记语言) 2.0进行身份联合。使用SAML,你可以配置你的AWS账户与你的身份提供商(IdP)整合。一旦配置,你组织的身份提供商就会对你的联合用户进行验证和授权,然后联合用户可以使用单点登录方法登录到AWS管理控制台。这不仅可以使你的用户免于记住另一个用户名和密码,也是简化了管理员的身份管理过程。当你的联合用户想访问AWS管理控制台,这种方法是有效的。但是当他们想使用AWS CLI或以程序方式调用AWS API时,将会怎么样呢?

在本文中,我将向你展示如何对你的用户实施联合的API与CLI访问。本帖中提供的举例使用了AWS Python SDK工具和一些附加的客户端侧的集成代码。如果你有用户需要这种访问控制,实施该方案可以使你对这些用户的管理轻松自如。
让我们从快速地了解我们的目标开始。

janedoe@Ubuntu64:/tmp$ ./samlapi.py
Username: AD\janedoe
Password: ****************

Please choose the role you would like to assume:
[ 0 ]: arn:aws:iam::012345678987:role/ADFS-Administrators
[ 1 ]: arn:aws:iam::012345678987:role/ADFS-Operators
Selection: 1

---------------------------------------------------------------
Your new access key pair has been stored in the aws configuration
file /home/janedoe/.aws/credentials under the saml profile.
Note that it will expire at 2015-05-26T17:16:20Z.
After this time you may safely rerun this script to refresh your
access key pair.
To use this credential call the aws cli with the --profile option
(e.g. aws --profile saml ec2 describe-instances).
---------------------------------------------------------------

Simple API example listing all s3 buckets:
[<Bucket: mybucket1>, <Bucket: mybucket2>, <Bucket: mybucket3>,
<Bucket: mybucket4>, <Bucket: mybucket5>]

从上面的输出结果中我们清楚地看到了什么?
1. 系统提示联合用户输入Active Directory(动态目录)证书。这些证书用来与配置的IdP进行比较以对用户进行验证和授权。
2. 系统检查返回的SAML断言,确定用户被授权承担的IAM(身份及访问管理)角色。用户选择了她期望的角色后,系统使用AWS STS(安全令牌服务)提取临时的安全证书。
3. 系统自动地将这些证书写入她本地的AWS证书文件,她可以开始发出AWS API或CLI调用指令。
4. 得到该样例,为你的组织对样例进行定制后,你就可以在保持AWS IAM服务提供的控制的同时,使用组织的证书来提高你的AWS API和CLI界面的能力和自动化程度。
本帖将会集中讲述如何使用微软动态目录联合服务(AD FS)。但是如果你正在使用其他供应商的同类产品,请不要感到失望因为基本的组件应该可以与其他常见的IdP配合运转的。
为了能够紧跟本帖的讲述,你必须已经:
入门
1. 使用你的组织证书将AD FS正确地与你的AWS账户进行了集成,以便能够访问控制台。如果你需要设置说明,请参考 Enabling Federation to AWS using Windows Active Directory, ADFS, and SAML 2.0。
2. 已在本地工作站安装了新版本(2.36或更新)的AWS Python SDK工具。
3. 获取了最小限度的AWS证书文件(例如:~/.aws/credentials),并将文件中的如下内容调整到你首选的区域和输出格式。
重要提示:AWS访问密钥对并没有在上面的结构中配置因为最初的AWS STS调用是由值得信任的IdP返回的SAML断言进行验证的。所有后续的API/CLI调用都是由包含在AWS STS令牌中的密钥对进行验证的。想要获取更多信息,请参考 Giving AWS Console Access to Federated Users Using SAML
首先,你需要安装不属于Python核心发行版的两个模块,具体说,就是beautifulsoup4和requests-ntlm。有若干种方法可以安装着两个模块,但是包含在Python 2.7.9或更新版本中的pip工具,使模块安装变得很容易。你只需运行如下两个命令即可:

[default]
output = json
region = us-west-2
aws_access_key_id =
aws_secret_access_key =

首先运行下面的命令:

<u>pip install beautifulsoup4</u>

然后运行下面的命令:

pip install requests-ntlm
你应该会得到一些与如下截图类似的输出结果:

AWS联合过程利用IdP发起的登录方法。在最后的准备步骤中,你需要确定具体的被用来引发登录的URL。以基本的IdP引发登录的URL为起点(该URL就是你用来联合访问SAML依赖各方的URL,SAML依赖各方包括AWS管理控制台)。在本例中,我使用的是AD FS 2.0。在该版本中,URL的格式为ofhttps://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx。如果我将该URL输入浏览器的地址栏,我将会看到一个网站选择页面,

为了构造你所需的URL,将原来的IdP引发登录URL与查询字符串?loginToRp=urn:amazon:webservices连接。构造好的URL应呈现的形式是ofhttps://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices。保存该URL因为在后面的叙述中它将被称为idpentryurl变量。如果你将这个串联的URL输出浏览器的地址栏,你应该仍然可以实现AD FS IdP引发登录过程。但是,你绕过了网站选择页面,在验证完演练所需的URL后直接进入AWS管理控制台。如果感兴趣的话,你可以访问Microsoft’s website去查看关于查询字符串的文档。
重要提示:务必密切注意URL中主机名称的大写。AD FS在验证过程中会使用主机名称,任何在大小写方面的不匹配都会导致验证失败。
检查代码
既然你已经浏览了上面“入门”部分的步骤,你可以开始组合控制联合API与CLI访问的集成代码了。我将会详细地解释这一过程以便你可以跟随我的节奏。首先,让我们进行一些基本的导入和变量设置。

#!/usr/bin/python

import sys
import boto.sts
import boto.s3
import requests
import getpass
import ConfigParser
import base64
import xml.etree.ElementTree as ET
from bs4 import BeautifulSoup
from os.path import expanser
from urlparse import urlparse, urlunparse
from requests_ntlm import HttpNtlmAuth

##########################################################################
# Variables

# region: The default AWS region that this script will connect
# to for all API calls
region = 'us-west-2'

# output format: The AWS CLI output format that will be configured in the
# saml profile (affects subsequent CLI calls)
outputformat = 'json'

# awsconfigfile: The file where this script will store the temp
# credentials under the saml profile
awsconfigfile = '/.aws/credentials'

# SSL certificate verification: Whether or not strict certificate
# verification is done, False should only be used for dev/test
sslverification = True

# idpentryurl: The initial URL that starts the authentication process.
idpentryurl = 'https://<fqdn>/adfs/ls/IdpInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices'

##########################################################################

将上述代码中的变量调整为针对你的具体的区域(如us-west-2,us-east-1等等)和格式喜好(例如json,文本,或表格),然后插入本帖中上一部分变量idpentryurl的值。
基本环境搭建起来后,提示用户,从标准输入中检索用户的证书。在本帖的后面我将会讨论我们是如何支持其他的证书形式的。

# Get the federated credentials from the user
print "Username:",
username = raw_input()
password = getpass.getpass()
print ''

位于第一行打印语句“Username”后面的逗号可能看起来像是一个缺陷,实际上它是Python为了防止第一行打印语句添加换行符而使用的小技巧。你也将会注意到getpass()这一方法的使用,这一方法是为了防止密码被显示在输出结果中。
下一步,我们使用Python请求模块组合验证信息,用公式表示向IdP发送的HTTPS请求,正如下面的片段所示。假设验证成功,AD FS返回的响应消息会包含SAML断言。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 如何让视频从后面开始播放? 株洲汽车抵押不押车贷款 靠谱 蝉的学名是什么呀? 蝉是什么季节叫的? 蝉是什么意思 浴室里的镜子上面有好多水垢要怎么去除? 蝉的寓意是什么? 如何去除镜子上的水垢 蝉是怎么来的..它属于什么类型的动物?为什么会叫 蝉是什么,有什么特点? 蝉是什么科目 你认为“蝉”是一种怎么的动物,从它身上你受到了什么启发? 蝉是动物吗 卫生间的镜子都是水渍,怎么能祛除干净不留水渍啊? 蝉是什么动物 购买机票时说无免费行李托运是怎么回事?不是经济舱都有吗? 订机票页面上面显示无免费行李托运额是什么意思? 无免费托运行李、是什么意思? 无免费托运行李额可以办理托运吗 什么叫无免费托运行李 柜机空调中的风扇应该向哪个方向运行? 来看看这几种分区格式是什么系统采用的分区格式?? 菠萝蜜芽接几天可以解绑,视频说20天左右可是本人是庭院嫁接不可能全都照视频做 海信柜机空调内机风扇转速慢而且还嗡嗡作响咋回事? 株洲市二手车贷款还清如何解除抵押? 菠萝蜜酵素怎么做视频? 空调柜机做风扇会不会跳故障? windows Server 2008各版本有何区别 水视频1,种菠萝蜜种子 mac safari当前打开的网页,怎么可以在ipad或iphone上面同步打开? 丢的部首是什么 再查几画 ios13首,爆炸人群,又同区的吗 空调柜机内机风扇周围的泡沫配件叫什么? 活动目录在云环境中扮演什么样的角色 丢的笔顺 电影《桥》插曲《啊!朋友再见》歌词 什么叫木菠萝? windows server 2003 sp2 和windows server 2003 r2的区别 丢的部首是什么,是丿还是去? 问问大家,苹果手机safari浏览器收藏了很多网址,最近我要换手机了,怎么把转到另一个苹果手机上?