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中 要搞定这个事儿,得按部就班来,总共分四步:
先在 IDM 服务器上创建好用户和组
确保 Keystone 服务有 IDM 的 CA 证书
这个证书很重要,相当于一个“通行证”,用来验证身份,不然 Keystone 和 IDM 之间没法通信。 修改 Keystone 配置,支持特定域名
这一步是让 Keystone 知道怎么和 IDM 对接,得把域名配置好,不然会找不到对方。 在 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 | +------------------------------------------------------------------+------------+