1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

Keystone概述

嘿,你知道 OpenStack 的身份服务(Keystone)有多厉害吗?它简直就是整个 OpenStack 的“门神”,负责搞定身份验证、权限分配、策略管理,还有各种令牌的发放。简单来说,它就是确保大家都能安全地用系统,同时还能按照角色分配权限,让整个系统井井有条。

身份服务的 API 是可以配置的,还分了公共和内部流量,这样就能更灵活地管理访问。要是有多个控制器节点,还能用 Pacemaker 和虚拟 IP 地址来保证 API 的高可用,不用担心服务中断。

用户想用 OpenStack 的服务,得先通过身份验证,还得有合适的角色才能参与项目。这个项目(以前叫租户)就是一堆资源的集合,比如网络、镜像、服务器、安全组之类的。项目是按照开发需求来设计的,可以代表客户、账户或者任何组织单元。在最新的 v3 版本里,项目还可以有子项目,子项目会从父项目那里继承角色和配额,超级方便。

RHOSP(红帽 OpenStack 平台)支持好多身份验证方法。最简单的就是用本地数据库里的用户名和密码来验证。不过在大公司里,RHOSP 还可以对接外部的身份验证系统,比如 Active Directory、红帽 IdM 或者 LDAP 服务器,这样就能直接用公司现有的账号体系,方便又安全!

作用域概念

在 OpenStack 里,有这么一帮“角色”:

  • Domain(域):你可以把它想象成一个大“家族”,里面可以包含好多项目和用户,是整个系统里最大的一个分类单位。比如一个公司就是一个 Domain,里面可以有各种不同的项目组。

  • Project(项目):这是 Domain 里的“小分队”,用来组织和管理资源的。比如一个开发团队正在做一个新应用,他们就会有一个专属的 Project,里面会有自己的网络、服务器、镜像等各种资源。

  • 子 Project(子项目):这就是 Project 的“小弟”,是从父 Project 里派生出来的。子 Project 可以从父 Project 继承权限和配额,比如一个大项目里分出一个小模块,就可以用子 Project 来管理。

  • Group(组):这个是用户的“小团体”,用来批量管理用户权限的。比如一个开发团队里的所有成员都可以被放到一个 Group 里,然后给这个 Group 分配权限,这样里面的每个人就都有相同的权限了。

  • User(用户):这就是具体的人啦,比如你、我、他,每个用户都有自己的账号和密码,用来登录系统,然后根据分配的权限去操作资源。

简单来说,Domain 是最大的“家族”,Project 是里面的“小分队”,子 Project 是“小分队”里的“小弟”,Group 是用户的“小团体”,而 User 就是具体操作系统的“人”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
                 +--------------------+
| OpenStack      |
+--------------------+
|
+-----------------------------------------+
| |
+------------------+ +------------------+
| Domain 1 | | Domain 2 |
+------------------+ +------------------+
| |
+------------------+ +------------------+
| Project 1 | | Project 3 |
+------------------+ +------------------+
| Project 2 | | Project 4 |
+------------------+ +------------------+
| |
+------------------+ +------------------+
| Group A | | Group C |
+------------------+ +------------------+
| Group B | | Group D |
+------------------+ +------------------+
| |
+------------------+ +------------------+
| User A | | User C |
+------------------+ +------------------+
| User B | | User D |
+------------------+ +------------------+

安装红帽 IDM

红帽 IdM(身份管理)就像是一个超级强大的“工具箱”,把 LDAP、Kerberos、DNS 和 PKI 这些协议都整合在一起,专门给企业里的 Linux 客户端提供身份服务。它就像是一个“瑞士军刀”,啥功能都有!

这个 IdM 其实是红帽从开源的 FreeIPA 项目优化过来的,还加上了官方支持。FreeIPA 本身就很厉害,它用了很多大家都知道的 Linux 管理组件,比如 PAM(用来管理用户登录)、BIND DNS(用来解析域名)、MIT Kerberos(用来做身份验证)和 Dogtag PKI(用来管理证书)。这些组件都和 389 LDAP Directory Server(一个核心的目录服务)集成在一起,让整个系统运行得又快又稳。

简单来说,红帽 IdM 就是一个“全能选手”,把各种身份管理的功能都打包在一起,让企业用起来很方便,而且特别靠谱!

1
2
dnf install freeipa-server-dns -y
ipa-server-install --setup-dns --auto-reverse --mkhomedir

安装过程比较简单,具体可以参加我下面这个文章

IDM高可用部署文章

集成IDM到OpenStack中

要搞定这个事儿,得按部就班来,总共分四步:

  1. 先在 IDM 服务器上创建好用户和组

    • 这是基础,得先准备好,不然后面没法用。
  2. 确保 Keystone 服务有 IDM 的 CA 证书

    • 这个证书很重要,相当于一个“通行证”,用来验证身份,不然 Keystone 和 IDM 之间没法通信。
  3. 修改 Keystone 配置,支持特定域名

    • 这一步是让 Keystone 知道怎么和 IDM 对接,得把域名配置好,不然会找不到对方。
  4. 在 Keystone 启用多域支持

    • 这样就能让 Keystone 管理多个域,方便后续的用户和权限管理。

按照这四步来,就能把 IDM 和 OpenStack 集成起来啦!

先在workstation上打一下lab,摧毁现有Example域的配置

1
lab identity-domain start

创建用户和组

kinit的密码是RedHat123^

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@utility ~]# kinit admin
Password for admin@LAB.EXAMPLE.NET:
[root@utility ~]# echo lxhpassword | ipa user-add lxh --first=OpenStack --last=lixiaohui --password
----------------
Added user "lxh"
----------------
User login: lxh
First name: OpenStack
Last name: lixiaohui
Full name: OpenStack lixiaohui
Display name: OpenStack lixiaohui
Initials: Ol
Home directory: /home/lxh
GECOS: OpenStack lixiaohui
Login shell: /bin/sh
Principal name: lxh@LAB.EXAMPLE.NET
Principal alias: lxh@LAB.EXAMPLE.NET
User password expiration: 20240331084046Z
Email address: lxh@lab.example.net
UID: 365000043
GID: 365000043
Password: True
Member of groups: ipausers
Kerberos keys available: True

创建OpenStack组,并将用户加入到组

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@utility ~]# ipa group-add openstack
-----------------------
Added group "openstack"
-----------------------
Group name: openstack
GID: 365000044
[root@utility ~]# ipa group-add-member openstack --users=lxh
Group name: openstack
GID: 365000044
Member users: lxh
-------------------------
Number of members added 1
-------------------------
1
2
3
4
5
6
7
[root@utility ~]# ipa group-show openstack --all
dn: cn=openstack,cn=groups,cn=accounts,dc=lab,dc=example,dc=net
Group name: openstack
GID: 365000044
Member users: lxh
ipauniqueid: 9a3ff6c4-a881-11ee-b76d-52540000fadc
objectclass: top, groupofnames, nestedgroup, ipausergroup, ipaobject, posixgroup

安装CA证书

登录到keystone所在的controller0,然后把CA证书拷贝到controller上

1
2
3
4
5
6
7
8
[root@controller0 ~]# scp root@utility:/etc/ipa/ca.crt /root/
The authenticity of host 'utility (172.25.250.220)' can't be established.
ECDSA key fingerprint is SHA256:1H687jfusVXYAUzAuByFfx1U/lB4VS+6h04wRhXhmZU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'utility,172.25.250.220' (ECDSA) to the list of known hosts.
Password:
ca.crt 100% 1651 2.6MB/s 00:00
[root@controller0 ~]#

将证书转为PEM格式

1
[root@controller0 ~]# openssl x509 -in ca.crt -out idm_ca.pem -outform PEM

将证书拷贝到根信任列表并信任此CA

1
2
[root@controller0 ~]# cp idm_ca.pem /etc/pki/ca-trust/source/anchors/
[root@controller0 ~]# update-ca-trust extract

为了让系统在用户登录时能够通过 LDAP(轻量级目录访问协议)来验证用户身份,执行一下命令:

1
[root@controller0 ~]# setsebool -P authlogin_nsswitch_use_ldap=on

配置适当的权限

这里的42425是容器中的keystone用户id

1
2
3
4
5
6
7
[root@controller0 ~]# mkdir /var/lib/config-data/puppet-generated/keystone/etc/keystone/domains/
[root@controller0 ~]# podman exec -it keystone /bin/bash
()[root@controller0 /]# grep 42425 /etc/passwd
keystone:x:42425:42425::/var/lib/keystone:/usr/sbin/nologin
()[root@controller0 /]# exit
exit
[root@controller0 ~]# chown -R 42425:42425 /var/lib/config-data/puppet-generated/keystone/etc/keystone/domains/

keystone 容器中启⽤多域配置

开启多域支持,指定多域配置文件路径,将指定sql来存储和管理角色分配

1
2
3
4
[root@controller0 ~]# cd /var/lib/config-data/puppet-generated/keystone/etc/keystone/
[root@controller0 keystone]# crudini --set keystone.conf identity domain_specific_drivers_enabled true
[root@controller0 keystone]# crudini --set keystone.conf identity domain_config_dir /etc/keystone/domains
[root@controller0 keystone]# crudini --set keystone.conf assignment driver sql

创建出特定域的配置文件

不用担心,考试中,会提供keystone的配置文件样例,我们只需要注意这里的user和password和证书路径就行

这些域⾝份验证配置⽂件的⽂件名必须符合 keystone.DOMAIN.conf 格式,其中DOMAIN 是域的名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cat > domains/keystone.Example.conf <<-EOF
[ldap]
url = ldaps://utility.lab.example.com
user = uid=lxh,cn=users,cn=accounts,dc=lab,dc=example,dc=net
password = lxhpassword
user_tree_dn = cn=users,cn=accounts,dc=lab,dc=example,dc=net
user_objectclass = inetUser
user_id_attribute = uid
user_name_attribute = uid
user_mail_attribute = mail
user_pass_attribute =
user_allow_create = False
user_allow_update = False
user_allow_delete = False
group_objectclass = groupofnames
group_tree_dn = cn=groups,cn=accounts,dc=lab,dc=example,dc=net
group_id_attribute = cn
group_name_attribute = cn
group_allow_create = False
group_allow_update = False
group_allow_delete = False
use_tls = False
query_scope = sub
chase_referrals = false
tls_cacertfile = /etc/pki/ca-trust/source/anchors/idm_ca.pem
[identity]
driver = ldap
EOF
1
[root@controller0 keystone]# chown 42425:42425 -R domains/

重启容器生效配置

推荐使用systemctl管理,非要使用podman管理也不是不行,只是有时候可能会导致systemctl服务异常,建议用systemctl

1
[root@controller0 ~]# systemctl restart tripleo_keystone

dashboard中启用多域名支持

确保文件中包含以下两行

1
2
3
4
[root@controller0 keystone]# cd /var/lib/config-data/puppet-generated/horizon/etc/openstack-dashboard/
[root@controller0 openstack-dashboard]# vim local_settings
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'

重启容器生效以上配置

1
[root@controller0 ~]# systemctl restart tripleo_horizon

创建测试域

这里的域名要注意和配置文件中的名称保持一致,包括大小写什么的,而且如果无法userlist可以试试用podman restart keystone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
(undercloud) [stack@director ~]$ source overcloudrc
(overcloud) [stack@director ~]$ openstack domain list
+----------------------------------+------------+---------+--------------------+
| ID | Name | Enabled | Description |
+----------------------------------+------------+---------+--------------------+
| 1e9c34fd067a4c88a14959ce575aeb45 | heat_stack | True | |
| default | Default | True | The default domain |
+----------------------------------+------------+---------+--------------------+
(overcloud) [stack@director ~]$ openstack domain create Example
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| enabled | True |
| id | d8de20f9ca8242739cdb99860857fbae |
| name | Example |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
(overcloud) [stack@director ~]$ openstack user list --domain Example
+------------------------------------------------------------------+------------+
| ID | Name |
+------------------------------------------------------------------+------------+
| d4c1be0784dd81f091a22446f65cec8dd7639c183ddad16c6854caea38ebe003 | admin |
| 16d15e2d8d61c94e12bd6df5c28475c3f44c330680b06ad6df8d26b5da34f767 | architect1 |
| f8d38b17e3cf6f14d320a0074beea8c65c2074627276f1454cf18f72c9f901e2 | architect2 |
| dcad4d79d957b682545e36f7b53b0b85d413e1d11d3a5a0ab804987c73ce4d7c | architect3 |
| f149ccc0b2de39ffd35f969c44b4885630da0f2ddb2526ac29b1ffbd7b63a5c8 | architect4 |
| 4df7bbabc1a5409e35639b291dea723a1ce5dd622425d802658692aed3dacd7b | architect5 |
| 8b3d00e1d6ba05645fa66eb668dfa6d0e322465f48f47e15779a251eed515b38 | architect6 |
| 947cd30e90148b30e9b29f036aea0acbc73ddb13df406ed880c8df9749edb970 | architect7 |
| 2b8a3d49fcc2e9bb241867325e3ff8ab679be7600d699a365852a1f836eee877 | architect8 |
| 9497f55a848562c77011277466735c81dc0b970fac052868d77cd6304f3e66d0 | architect9 |
| 553c86846df02194d961883e015175341c2bd97f243b9b3707b2150e27f2d8d8 | developer1 |
| 7700fc93c6193081ca6a1d03945ca08b92ad5205174696e2c8936d3bdbf62175 | developer2 |
| 357fd08835ce3fd72f452baa16ff30ab50d3df89b39515fda406808c6ee704bb | developer3 |
| 7a01e68ab1a5269dd3ecc0310028298f3c05ef3cf039cb0790891b9269c13309 | developer4 |
| 38e30324089fce5f29c34c83b0dab8148249c67e57f50fc0920411a852b7842c | developer5 |
| 9de510cb622ba78e3f7b48aa3749d7a6828118d013c288b8d2224f45f988b398 | developer6 |
| 27d496574c7f91fed6f8daa1f75bb5a8a134e0ce673648545e82014171d22db5 | developer7 |
| c40fe1a170b384d315197d33a86fbda4eecc445afd4e98306ca6ae5c2c632db6 | developer8 |
| 2e8616cf247f30920cb702506e6a48335dd2d263d88854dadf978c57b98504c9 | developer9 |
| d5efdbab2b9e7068339f96e0d25048f93f28c4a9eba7083d0a0509a3038eba0c | operator1 |
| 996f64edb812e8efc67d83ee481b4d1a5831a90596ed618fb3786ba2077ebc22 | operator2 |
| e7ebe54acbbf4a1e00f34af7162ec818b620fe33f4a01bb1b33e74bb9364e29c | operator3 |
| a7a724871b2886b80cb027283a9715bacf36793a016ce5b81ddcab3e8b8d2b5c | operator4 |
| f0b04b7f34d50a40a778570222525f1d06da80603149536c27300d195f7f440b | operator5 |
| 5f2dc40ae6f977f9baa49127c7744bbecdc81530836fd1b57c3e95e5807fbb6f | operator6 |
| b9a5b749bedbb1adcd99ad66dc8e55b663ff3964d1dd8fe2a78b51d2318c12a6 | operator7 |
| f9c24fcd3f354bb3f089dd5c97708ef1725fd92d6e0a4a0744b69e3c1c8a3c4c | operator8 |
| ce687226b82563cfe349a15c15f28b0eee955370600739da5a97358d48b52290 | operator9 |
| 0650858bdef9aa4523e96c7224d50f33add555dc3e9c7ee827d86dd377ce249e | lxh |
+------------------------------------------------------------------+------------+