Keystone

  • 一.Keystone的作用和架构
  • 1.1什么是Keystone?
  • 1.2Keystone提供服务注册机制
  • 1.3Keystone架构
  • 二.Keystone服务内容
  • 2.1身份识别(identity)服务
  • 2.2资源管理服务
  • 2.3角色鉴权机制
  • 2.4令牌请求与颁布服务- 范围令牌(scoped token)
  • 2.5服务目录-服务(service )和端点(endpoint)
  • 2.6服务目录-服务(service)和端点(endpoint)
  • 三.Keystone部署
  • 1.创建数据库实例和数据库用户
  • 2.安装、配置keystone、数据库、Apache
  • 1.配置Keystone
  • 2.配置bootstrap身份认证服务
  • 3.配置Apache HTTP服务器
  • 4.配置管理员账户的环境变量


一.Keystone的作用和架构

1.1什么是Keystone?

keystone是OpenStack的核心组件之一,为OpenStack大家族中的其他组件提供统一的身份认证服务,包括身份认证、令牌发放和校验服务列表、定义用户权限等。OpenStack中所有服务的授权和认证都需要经过keystone,因此keystone是OpenStack中第一个需要安装的核心组件。

  • 身份验证域授权,使用户与服务可以正确地访问服务,创建管理资源以及实例
  • Keystone采用策略文件(policy.yaml, 或者policy.ison)来管理权限的规则

1.2Keystone提供服务注册机制

  • 利用服务目录来管理新的服务或对原有服务做变更
  • 服务端点(endpoint)记录服务的restful API url,能够提供服务访问入口

1.3Keystone架构

  • 标准的web服务架构,采用Apache 2作为web容器,同horizon架构类似
  • Openstack其他服务需要向keystone请求令牌(scoped token)才能请求其他服务
  • 身份管理: SQL, LDAP, SAML, Oauthv1.0a,OpenID Connect,多因子身份验证,时间同步口令等等
  • 支持联邦身份识别,和扩展第三方身份识别

二.Keystone服务内容

身份识别(identity)服务-用户和组
资源管理服务-域(domain)和项目(project)
角色设置服务-角色(role), OpenStack采用角色来规定权限
令牌请求与颁布服务-范围令牌(scoped token)
服务、目录和端点管理
策略规则管理-策略(policy)和规则(rule)

2.1身份识别(identity)服务

身份识别服务执行如下功能:

用户管理:追踪用户及其权限。
服务目录:提供可用服务的API endpoint目录。
下面几个概念很重要,是理解Keystone的前提。

User:用户是使用OpenStack云服务的一个人、系统或服务的数字表达。身份识别服务验证要求进行调用的用户传入的请求。用户可以直接分配给特别的租户,就像包含在租户中一样。

Credentials:凭证是只有证明自己身份的用户才知道的数据。在身份识别服务中,凭证可以是用户名和密码、用户和API键或身份识别服务提供的认证令牌。

Authentication:这是用户确认身份的行为。身份识别服务通过验证用户提供的一组凭证来确认传入的请求 。身份识别服务向用户发放一个认证令牌来响应这些凭证,用户在后续请求中提供这个令牌。

Token:令牌是用来访问资源的一个任意文本。每个令牌都有一个范围,描述哪些资源可以访问。令牌可以随时撤回且在有限时间内生效。然而身份识别服务支持基于令牌的认证方式,是为了未来支持额外协议。其首要目的是为了集成服务,不是追求成为一个完整的身份识别存储和管理解决方案。

Tenant:一个用于分组或隔离资源、标识对象的容器。租户可以映射到一个顾客、账户、组织或项目,这取决于服务运营者。

Service:Openstack服务,如Nova、Cinder、Glance等。服务提供一个或多个endpoint,用户可以通过这些endpoint来访问资源和执行操作。

EndPoint:端点是一个可访问的网络地址,通常是一个URL。如果你为模板使用扩展,就可以创建一个endpoint模板,它代表所有跨区域可用的可消费服务的模板。

Role:角色指一个用户承担的个性,使用户能执行一组指定的操作。角色包括一组权力和特权。一个用户承担这个角色就继承了这些权力和特权。一个被分配给用户的令牌包含一组用户拥有的角色列表。用户调用的服务决定他们如何解读一组用户拥有的角色以及每个角色授权访问哪些操作和资源。

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_虚拟机

2.2资源管理服务

资源与组织管理感念

  • 区域(Region):是从数据中心方面来说得概念,某个区域统一管理的数据中心就划分为一一个区域- region
  • 域(domain):是从运营管理层面来说的概念,即某个组织机构或业务单元可以当做一个域- domain。其下的部门可以当做一个项目

管理层级

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_数据库_02

2.3角色鉴权机制

  • OpenStack实现基于角色的访问控制
  • 角色名称可以各自喜好,系统内置有: admin, user, . member_ ,等
  • 用户、组,以及用户相关的属性如项目和域都可以被赋予指定的角色
  • OpenStack的每一个服务都有鉴权处理模块(policy)。 通过在服务应用所在目录中以文件方
    式记录鉴权规则,文件类型有json格式或yaml格式。例如: letc/keystone/policy.yaml,
    /etc/cinder/policy.json,等
  • OpenStack在鉴权时,通过在相应服务的policy,json (或policy.yaml) 查找用户的角色来
    决定该用户是否被授权执行发起的服务操作

2.4令牌请求与颁布服务- 范围令牌(scoped token)

  • 请求令牌:用户或者服务(每个服务都预制了对应的用户)在第一-次请求OpenStack的服务时, 都需要带上用户必
    要信息,如名称,口令,项目、域等信息。,
  • 颁布令牌: OpenStack验证用户的身份后,向该用户或服务颁布范围令牌(简称令牌)。请求端可以缓存本次令牌,
    供后续使用。keystone保存该用户的令牌信息。被请求的服务在收到令牌后,向keystone验证令牌的有效性。
  • 令牌使用:用户带令牌请求某个服务,被请求的服务在收到令牌后,向keystone验证令牌的有效性后,执行该请求
  • 令牌字段:
    expires -失效期,用户每次带令牌访问,都会改变失效期,即延长了失效期
    id-令牌唯一标识号
    project_ d -用户缺省项目标识号
    user
    id -用户标识号
    令牌操作种类:
    issue -请求新的令牌, 如果带令牌,则根据该令牌是否有效,延长或发新
    revoke -作废当前令牌

2.5服务目录-服务(service )和端点(endpoint)

服务目录: keystone实现服务注册功能。服务目录用于发现服务API端点- RESTful的URL。包括两个主要实体对
象service和endpoint
service -记录注册的服务基本信息。记录了keystone, nova, cinder, neutron, glance等基础的服务
endpoint -用于记录服务的API的urI信息

2.6服务目录-服务(service)和端点(endpoint)

  • 端点的属性(properties)
    region -区域标识号
    service - service name or id
    interface - public, internal, admin
    url
    enable
  • 端点操作种类:
    create
    list
    show
    set
    delete

三.Keystone部署

1.创建数据库实例和数据库用户

[root@ct ~]# mysql -u root -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit

2.安装、配置keystone、数据库、Apache

● 安装keystone、httpd、mod_wsgi

1.配置Keystone

mod_wsgi包的作用是让apache能够代理pythone程序的组件;openstack的各个组件,包括API都是用python写的,但访问的是apache,apache会把请求转发给python去处理,这些包只安装在controler节点

[root@ct ~]# yum -y install openstack-keystone httpd mod_wsgi
[root@ct ~]# cp -a /etc/keystone/keystone.conf{,.bak}
[root@ct ~]# grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf

通过pymysql模块访问mysql,指定用户名密码、数据库的域名、数据库名

[root@ct ~]# openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@ct/keystone

指定token的提供者;提供者就是keystone自己本身

[root@ct ~]# openstack-config --set /etc/keystone/keystone.conf token provider fernet
Fernet:一种安全的消息传递格式

初始化认证服务数据库

[root@ct ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

初始化fernet 密钥存储库(以下命令会生成两个密钥,生成的密钥放于/etc/keystone/目录下,用于加密数据)

[root@ct keystone]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@ct keystone]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_API_03

2.配置bootstrap身份认证服务

[root@ct ~]# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
--bootstrap-admin-url http://ct:5000/v3/ \
--bootstrap-internal-url http://ct:5000/v3/ \
--bootstrap-public-url http://ct:5000/v3/ \
--bootstrap-region-id RegionOne

#指定一个区域名称
#此步骤是初始化openstack,会把openstack的admin用户的信息写入到mysql的user表中,以及url等其他信息写入到mysql的相关表中;
#admin-url是管理网(如公有云内部openstack管理网络),用于管理虚拟机的扩容或删除;如果共有网络和管理网是一个网络,则当业务量大时,会造成无法通过openstack的控制端扩容虚拟机,所以需要一个管理网;
#internal-url是内部网络,进行数据传输,如虚拟机访问存储和数据库、zookeeper等中间件,这个网络是不能被外网访问的,只能用于企业内部访问
#public-url是共有网络,可以给用户访问的(如公有云) #但是此环境没有这些网络,则公用同一个网络
#5000端口是keystone提供认证的端口
#需要在haproxy服务器上添加一条listen
#各种网络的url需要指定controler节点的域名,一般是haproxy的vip的域名(高可用模式)

3.配置Apache HTTP服务器

[root@ct ~]# echo “ServerName controller” >> /etc/httpd/conf/httpd.conf
创建配置文件
安装完mod_wsgi包后,会生成 wsgi-keystone.conf 这个文件,文件中配置了虚拟主机及监听了5000端口,mod_wsgi就是python的网关

[root@ct ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

开启服务

[root@ct conf.d]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to/usr/lib/systemd/system/httpd.service.
[root@ct conf.d]# systemctl start httpd

4.配置管理员账户的环境变量

#这些环境变量用于创建角色和项目使用,但是创建角色和项目需要有认证信息,所以通过环境变量声明用户名和密码等认证信息,欺骗openstack已经登录且通过认证,这样就可以创建项目和角色;也就是把admin用户的验证信息通过声明环境变量的方式传递给openstack进行验证,实现针对openstack的非交互式操作

[root@ct ~]# cat >> ~/.bashrc << EOF
export OS_USERNAME=admin          #控制台登陆用户名
export OS_PASSWORD=ADMIN_PASS    #控制台登陆密码
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://ct:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
[root@ct ~]# source ~/.bashrc

通过配置环境变量,可以使用openstack命令进行一些操作

[root@ct ~]# openstack user list

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_数据库_04

创建OpenStack 域、项目、用户和角色
创建一个项目(project),创建在指定的domain(域)中,指定描述信息,project名称为service(可使用openstack domain list 查询)

[root@ct ~]# openstack project create --domain default --description "Service Project" service

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_数据库_05

创建角色

[root@ct ~]# openstack role create user

查看openstack 角色列表

[root@ct ~]# openstack role list

kolla openstack rocky部署 openstack keystone的部署流程有哪些?_bootstrap_06