配置 keystone 映射

联合身份验证功能可用于在您的联合属性映射将用户路由到这些资源之前创建项目、组、角色和域。如果您通过单独的机制管理项目、组、角色和域的创建,则无需使用联合身份验证。

federated_identities:
  - domain: default
    project: fedproject
    group: fedgroup
    role: member
  1. project:联合身份验证用户具有访问权限的项目。如果项目尚不存在,请在名为 domain 的域中创建它。

  2. group:联合身份验证用户所属的 keystone 组。如果组尚不存在,请在名为 domain 的域中创建它。

  3. role:联合身份验证用户在该项目使用的角色。如果角色尚不存在,请创建它。

  4. domainproject 所在的域,以及您分配角色的域。如果域尚不存在,请创建它。这应该是域的 ID。

Ansible 实现以下 OpenStack CLI 命令的等效功能

# if the domain does not already exist
openstack domain create Default

# if the group does not already exist
openstack group create fedgroup --domain Default

# if the role does not already exist
openstack role create member

# if the project does not already exist
openstack project create --domain default fedproject

# map the role to the project and user group in the domain
openstack role add --project fedproject --group fedgroup member

要扩展,只需向列表中添加更多条目即可。例如

federated_identities:
  - domain: default
    project: fedproject
    group: fedgroup
    role: member
  - domain: default
    project: fedproject2
    group: fedgroup2
    role: member

Keystone 联合身份验证属性映射

属性映射添加一组规则,以将联合身份验证属性映射到 keystone 用户和组。IdP 为每个协议指定一个映射。

通过 IdP 和协议的不同组合多次使用映射对象。

有关映射引擎的工作方式、模式和各种规则示例的详细信息,请参阅 keystone 开发人员文档

例如,针对 ADFS IdP 的 SP 属性映射配置

mapping:
  name: adfs-IdP-mapping
  rules:
    - remote:
        - type: upn
      local:
        - group:
            name: fedgroup
            domain:
              name: Default
        - user:
            name: '{0}'
attributes:
  - name: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn'
    id: upn

对于 SP,需要为每个 IdP 设置映射。这告诉 SP 如何解释从 IdP 提供给 SP 的属性。

在此示例中,IdP 发布 upn 属性。由于这不在标准的 Shibboleth 属性映射中(请参阅 keystone 容器中的 /etc/shibboleth/attribute-map.xml),因此 IdP 的配置通过 attributes 字典进行额外的映射。

mapping 字典是 YAML 表示形式,类似于 Ansible 上传的 keystone 映射属性。上述映射在 keystone 中产生以下结果。

root@aio1_keystone_container-783aa4c0:~# openstack mapping list
+------------------+
| ID               |
+------------------+
| adfs-IdP-mapping |
+------------------+

root@aio1_keystone_container-783aa4c0:~# openstack mapping show adfs-IdP-mapping
+-------+---------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value                                                                                                                                 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------+
| id    | adfs-IdP-mapping                                                                                                                      |
| rules | [{"remote": [{"type": "upn"}], "local": [{"group": {"domain": {"name": "Default"}, "name": "fedgroup"}}, {"user": {"name": "{0}"}}]}] |
+-------+---------------------------------------------------------------------------------------------------------------------------------------+

root@aio1_keystone_container-783aa4c0:~# openstack mapping show adfs-IdP-mapping | awk -F\| '/rules/ {print $3}' | python -mjson.tool
[
    {
        "remote": [
            {
                "type": "upn"
            }
        ],
        "local": [
            {
                "group": {
                    "domain": {
                        "name": "Default"
                    },
                    "name": "fedgroup"
                }
            },
            {
                "user": {
                    "name": "{0}"
                }
            }
        ]
    }
]

上述映射规则的解释是,由 IdP 身份验证的任何联合身份验证用户都映射到 keystone 中的 ephemeral 用户。该用户是名为 fedgroup 的组的成员。这位于名为 Default 的域中。由于我们指定了域,因此 keystone 后端中的用户分配将与映射中进行的分配一起查找。用户 ID 和名称(联合身份验证对这两个属性使用相同的值)对于所有 OpenStack 服务都是 upn 的值。