SP initiated方式
Openstack和Shibboleth是被广泛使用的一套开源联邦身份认证解决方案,提供了强大的单点登录能力,将用户连接到企业内外的各种应用服务。本章介绍通过Openstack Client和ShibbolethECP Client获取联邦认证Token的方法。
流程图
SP initiated联邦认证的流程如下图所示。
步骤说明
- Client调用公有云系统提供的“通过SP initiated方式获取联邦token”接口。
- 公有云系统根据URL中的用户及IdP信息查找Metadata文件,发送SAML Request,请求经过中间媒介Client。
- Client对SAML Request进行重新封装后转发SAML Request给IdP。
- 用户输入用户名和密码完成身份认证。
- 用户认证成功后,IdP构建携带用户身份信息的断言发送SAML Response,请求经过中间媒介Client。
- Client对SAML Response进行重新封装后转发SAML Response给公有云。
- 公有云对断言进行校验和认证,并根据用户在身份提供商配置的身份转换规则生成临时访问凭证。
- 用户根据分配的权限访问公有云资源。
Openstack Client
统一命令行客户端工具的安装需要使用root权限,以下配置Openstack Client的操作只需要普通用户权限。
接口调用操作应该在一个安全的网络环境中进行(在VPN或者在租户的云服务器中),如果在不安全的网络环境中,可能会受到中间人攻击。
- 使用文本编辑器创建环境变量文件,在文件中设置用户名、密码、区域、SAML协议版本、IAM地址和端口等信息。参数说明如表1所示。
示例如下:
export OS_IDENTITY_API_VERSION=3
export OS_AUTH_TYPE=v3samlpassword
export OS_AUTH_URL=https://iam.cn-north-1.myhuaweicloud.com:443/v3
export OS_IDENTITY_PROVIDER=idpid
export OS_PROTOCOL=saml
export OS_IDENTITY_PROVIDER_URL=https://idp.example.com/idp/profile/SAML2/SOAP/ECP
export OS_USERNAME=username
export OS_PASSWORD=userpassword
export OS_DOMAIN_NAME=example-domain-name
表1 环境变量文件参数说明 参数名称
说明
OS_IDENTITY_API_VERSION
认证接口版本,固定值为“3”。
OS_AUTH_TYPE
认证类型,固定值为v3samlpassword。
OS_AUTH_URL
格式为“https://IAM地址:端口号/接口版本”。
- 端口号:固定值为“443”。
- 接口版本:固定值为“v3”。
OS_IDENTITY_PROVIDER
用户在本系统创建的身份提供商的名称。例如:Publiccloud-Shibboleth。
OS_DOMAIN_NAME
待认证的租户名称。
OS_PROTOCOL
SAML协议版本,固定值为“saml”。
OS_IDENTITY_PROVIDER_URL
Identity Provider处理通过客户端代理机制(ECP)发起的认证请求的地址。
OS_USERNAME
用户在Identity Provide认证时使用的用户名。
OS_PASSWORD
用户在Identity Provide认证时使用的密码。
- 执行如下命令,设置环境变量。
source keystonerc
- 执行如下命令,获取token。
openstack token issue
>>openstack token issue command: token issue -> openstackclient.identity.v3.token.IssueToken (auth=True) Using auth plugin: v3samlpassword +----------------------------------------------------------------------------------------------------------- | Field | Value | expires | 2018-04-16T03:46:51+0000 | id | MIIDbQYJKoZIhvcNAQcCoIIDXjXXX... | user_id | 9B7CJy5ME14f0fQKhb6HJVQdpXXX...
回显信息中id为获取到的联邦认证token
Shibboleth ECP Client
- 在Shibboleth IdP v3中配置metadata-providers.xml文件,并将metadata.xml文件放置在对应路径下。
<MetadataProvider id="LocalMetadata1"xsi:type="FilesystemMetadataProvider" metadataFile="C:\Program Files (x86)\Shibboleth\IdP\metadata\web_metadata.xml"/> <MetadataProvider id="LocalMetadata2"xsi:type="FilesystemMetadataProvider" metadataFile="C:\Program Files (x86)\Shibboleth\IdP\metadata\api_metadata.xml"/>
- MetadataProvider id:下载的SP系统的元数据文件名称。
- metadataFile:SP的元数据文件在企业IdP系统中放置的路径。
- 在Shibboleth IdP v3中配置attribute-filter.xml文件。
<afp:AttributeFilterPolicy id="example1"> <afp:PolicyRequirementRule xsi:type="basic:AttributeRequesterString" value="https://auth.example.com/" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="uid"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="mail"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> </afp:AttributeFilterPolicy> <afp:AttributeFilterPolicy id="example2"> <afp:PolicyRequirementRule xsi:type="basic:AttributeRequesterString" value="https://iam.{region_id}.example.com" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="uid"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="mail"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> </afp:AttributeFilterPolicy>
AttributeFilterPolicy id:下载的SP系统元数据文件名称。
value:SP系统元数据文件中的EntityID。
- 在ecp.py脚本中配置企业IdP系统的终端节点地址。
# mapping from user friendly names or tags to IdP ECP enpoints IDP_ENDPOINTS = { "idp1": "https://idp.example.com/idp/profile/SAML2/SOAP/ECP" }
- 执行ecp.py脚本获取联邦认证token。
>>python ecp.py Usage: ecp.py [options] IdP_tag target_url login >>python ecp.py -d idp1 https://iam.{region_id}.example.com/v3/OS-FEDERATION/identity_providers/idp_example/protocols/saml/auth {username} X-Subject-Token: MIIDbQYJKoZIhvcNAQcCoIIDXXX...
X-Subject-Token为获取到联邦认证token。