更新时间:2022-09-21 GMT+08:00

SP initiated方式

Openstack和Shibboleth是被广泛使用的一套开源联邦身份认证解决方案,提供了强大的单点登录能力,将用户连接到企业内外的各种应用服务。本章介绍通过Openstack Client和ShibbolethECP Client获取联邦认证Token的方法。

流程图

SP initiated联邦认证的流程如下图所示。

图1 流程图(SP initiated方式)

步骤说明

  1. Client调用公有云系统提供的“通过SP initiated方式获取联邦token”接口。
  2. 公有云系统根据URL中的用户及IdP信息查找Metadata文件,发送SAML Request,请求经过中间媒介Client。
  3. Client对SAML Request进行重新封装后转发SAML Request给IdP。
  4. 用户输入用户名和密码完成身份认证。
  5. 用户认证成功后,IdP构建携带用户身份信息的断言发送SAML Response,请求经过中间媒介Client。
  6. Client对SAML Response进行重新封装后转发SAML Response给公有云。
  7. 公有云对断言进行校验和认证,并根据用户在身份提供商配置的身份转换规则生成临时访问凭证。
  8. 用户根据分配的权限访问公有云资源。

Openstack Client

统一命令行客户端工具的安装需要使用root权限,以下配置Openstack Client的操作只需要普通用户权限。

接口调用操作应该在一个安全的网络环境中进行(在VPN或者在租户的云服务器中),如果在不安全的网络环境中,可能会受到中间人攻击。

  1. 使用文本编辑器创建环境变量文件,在文件中设置用户名、密码、区域、SAML协议版本、IAM地址和端口等信息。参数说明如表1所示。

    示例如下:

    export OS_IDENTITY_API_VERSION=3

    export OS_AUTH_TYPE=v3samlpassword

    export OS_AUTH_URL=https://example: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认证时使用的密码。

  2. 执行如下命令,设置环境变量。

    source keystonerc

  3. 执行如下命令,获取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

  1. 在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系统中放置的路径。

  2. 在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。

  3. 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"
    }

  4. 执行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。