OpenStack之keystone(用户认证)

Keystone(认证)

Keystone 概述

1)管理用户及其权限

2)维护OpenStack Services 的 Endpoint

3)Authentication(认证)和 Authorization(授权)

keystone的名词概念

1.User(用户或服务)

指代任何使用OpenStack的实体,可以是真正的用户,其他系统或者服务。就是说只要是访问openstack service 的对象都可以称为User

2.Credentials(确认身份的凭证)

是User用来证明自己身份的信息,可以是:

  1)用户名/密码

  2)Token(有时限)

  3)API Key(秘钥)

  4)其他高级方式

3.Authentication(认证过程)

是Keystone验证User身份的过程。User访问OpenStack时向Keystone提交用户名和密码形式的Credentials,Keystone验证通过后会给User签发一个Token作为后续访问的Credential(证书).

4.Token (临时身份证明)

是由数字和字母组成的字符串,User成功Authentication 后由Keystone分配给User。

  1)Token 用做访问 Service 的 Credential

  2) Service 会通过 Keystone 验证 Token 的有效性

  3)Token 的有效期默认是24小时

5.project (一个人或服务所拥有的资源集合。不同的Project之间的资源进行隔离)

用于将OpenStack 的资源(计算、存储和网络)进行分组和隔离。根据OpenStack服务的对象不同,Project 可以是一个客户(公有云,也叫租户)、部门或者项目组(私有云) 。

  1)资源的所有权是属于 Project的,而不是 User。

  2)在 OpenStack 的界面和文档中,Tenant/Project/Account这几个术语是通用的,但长期看会倾向使用Project

  3)每个User(包括admin)必须挂在Project里才能访问该Project 的资源。

  4)一个User可以属于多个 Project。

  5)admin相当于root用户,具有最高权限。

6.Service(Keystone提供的服务)

  包括Compute(Nova)、Block Storage(Cinder)、Object Storage(Swift)、Image Service(Glance)、Networking Service(Neutron)等。每个Service都会提供若干个Endpoint,User通过Endpoint 访问资源和执行操作。

7.Endpoint (用来访问openstack service的地址)

是一个网络上可访问的地址,通常是一个URL。Service通过Endpoint告知自己的API。Keystone 负责管理和维护每个Service的Endpoint。

8.Role  角色(VIP)

 1)Authentication(认证) 解决的是“你是谁”的问题

 2)Authorization(鉴权) 解决的是“你能干什么”的问题

Keystone是借助Role来实现Authorization的,Keystone定义Role,可以为User分配一个或多个Role。Service通过各自的/etc/***/policy.json对Role进行访问控制,决定每个Role能做什么事情

9.OpenStack默认配置只区分admin 和非admin。如果需要对特定的Role进行授权,可以修改policy.json.

10.openstack 适用于全局,可管理和查看各类信息。(有很多命令需要自己研究)

11.keystone-manage 用于启动keystone模块数据、初始化数据库、生成SSL相关的证书和私钥。

Keystone 认证管理

图示:

叙述:首先,User向Keystone提供自己的凭证(凭证里面有自己的用户名和密码),之后Keystone会从数据库里读取数据,对User这个凭证进行验证,若通过,会向User返回Token和Endpoint。该Token限定了用户在限定时间内被访问的Endpoint和资源。此时如果用户利用Nova创建虚拟机服务,Nova会把用户提供的Token发送给Keystone再次验证,Keystone会根据Token判断User是否拥有执行创建虚拟机操作的权限,若验证通过,Nova会向其提供相对应的服务,之后,向Glance和Neutron分别发送用户Token,同时分别请求镜像和网络资源,同上,Glance和Neutron会把用户提供的Token发送给Keystone再次验证,判断User是否拥有对应操作的执行权限,通过后,再提供相应的操作。最后虚拟机创建完成,Nova把相关信息反馈给用户。

总结:用户每进行一步操作,只要用到某种服务,该服务必先通过用户的Token向Keystone验证对应的操作权限,只有通过,才能进行下一步操作。

对红字的解释:

  1. Endpoint:相当于一个网络上可访问的网址,通常是一个URL(URL:统一资源定位符,互联网上标准资源的地址)。每个服务相应位置记录。
  2. Token限定时间:临时凭证,有效期是24个小时。

Token

通俗的讲,token 是用户的一种凭证,需拿正确的用户名/密码向 Keystone 申请才能得到。如果用户每次都采用用户名/密码访问 OpenStack API,容易泄露用户信息,带来安全隐患。所以 OpenStack 要求用户访问其 API 前,必须先获取 token,然后用 token 作为用户凭据访问 OpenStack API。

注释:API:用来接收和发送请求的接口(个人理解)

详情登陆:什么是API,说人话!-CSDN博客

Keystone四种认证方式:UUID、PKI、PKIZ、Fernet

  1. UUID

源码分析:长度固定为32byte的随机字符串。

缺陷:每次请求都要经过Keystone进行验证,大大增幅Keystone工作量,影响性能。

  1. PKI

原理:在keystone初始化时,keystone生成了CA的公钥CA.pem和私钥CA.key,同时keystone产生了自己的公钥keystone.pub和私钥keystone.key,然后将keystone.pub进行CA的签名,生成keystone.pem。

当用户拿着用户名/密码去keystone认证后,keystone将用户的基本信息通过keystone.key进行加密,并将密文作为token返还给用户。当用户拿着token发送请求时(例如访问Nova),Nova拿到用户token时,通过事先拿到keystone的证书keystone.pem(这一过程只需要进行一次)进行解密,获取用户信息。

对于用户的token,还需进行token的合法时间,以及token还是否存在进行判断。所以当Nova每一次拿到token后还需向keystone询问一次token的失败列表,检查token是否失效。这一过程对于keystone的负载还是相当轻的,所以PKI还是有效解决了keystone性能瓶颈的问题。

总之,OpenStack服务中的每一个API Endpoint都有一份keystone签发的证书,失效列表和根证书。API不用在直接去keystone认证token是否合法,只需要根据keystone的证书和失效列表就可以确定token是否合法。但是这里还是会每次都需要请求keystone去获取失效列表。

缺陷:长度负载重,一般不推荐在生产中部署,还需要一个受信任的CA颁发的证书。

  1. PKIZ

原理:和PKI基本一致,只是在使用base64url encoding进行编码的基础上,又使用压缩机制,长度上减小了一半,并且Token使用PKIZ_开头。

缺陷:同PKI

  1. Fernet

起源:当集群运行较长一段时间后,访问其 API 会变得奇慢无比,究其原因在于 Keystone 数据库存储了大量的 token 导致性能太差,解决的办法是经常清理 token。

特点:采用对称加密库(加密密钥和解密密钥相同) 加密 token,不需要存储于数据库,带来了一定的性能提升。采用 Key Rotation 更换密钥,从而提高安全性。

fernet不需要后端持久化操作(采用 Key Rotation定期更换密钥,只要Keystone具有访问这些key的权限,更新后的token就不需要在keystone数据库中存储,缓解了数据库负载压力),并且token的认证,使用的是密钥进行解密,能够直接得出token Data的信息,从而进行token的过期认证。

缺陷:使用对称加密,安全性低。

Domain

Domain=project+user(+group)

Group=user×n    (n表示数量)

Project:IT基础设施资源的集合,如虚拟机,卷,镜像等

同一个domain中,元素的名称唯一,不同domain间,名称可以重复。

参数相关简介:

Group的主要目的是为了方便分配role,如果给group分配了一个role,那么group里的所有user都拥有了这个role。

Role名称必须唯一,相当于角色。policy.json文件根据role的名称所指定的允许进行的操作。

Token是针对不同scope认证状态,这里的scope是指project和domain,因此一共有三种scoped token:

1. project­scoped token:针对一个project的token,它包含service catalog,a set of roles,和那个project的详细信息

2. domain­scoped token:针对一个domain的token,它具有有限的使用场景,只用于domain层面的操作。与project­scoped相比,它只具有优先的sevice catalog

3. unscoped token:当既不指定project也不指定domai为scope,同时user也没有default project时获得的token,这是一种特殊的token。

安装和配置keystone

一、在base节点上配置

1.登录base节点并创建数据库

2.授予数据库用户keystone访问keystone数据库的权限

3.查看创建好的数据库keystone

二、在ctrl节点上配置

1.安装软件包

# yum install openstack-keystone httpd mod_wsgi –y 

#yum install python-openstackclient

2.编辑/etc/keystone/keystone.conf 文件并完成下列操作:

A.备份keyston.conf

B.去掉keystone配置文件中的注释行

C.在[database]小节,配置数据库访问;在[token]小节,配置使用 Fernet 技术提供令牌

3.初始化身份服务数据库

# su -s /bin/sh -c “keystone-manage db_sync” keystone 

4.初始化 Fernet key 仓库

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone 

# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone 

5.引导身份服务,创建管理员。

# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ 
--bootstrap-admin-url http://ctrl.xdj.com:35357/v3/ \ 
--bootstrap-internal-url http://ctrl.xdj.com:5000/v3/ \ 
--bootstrap-public-url http://ctrl.xdj.com:5000/v3/ \ 
--bootstrap-region-id RegionOne 

三、配置 Apache HTTP 服务

1.编辑/etc/httpd/conf/httpd.conf 文件并配置 ServerName 配置项

2.创建到文件/usr/share/keystone/wsgi-keystone.conf 的链接:

Ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ 

四、配置环境变量

1.配置管理账号

# 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://ctrl.xdj.com:35357/v3

# export OS_IDENTITY_API_VERSION=3 

2.配置 ADMIN_PASS 为 keystone-manage bootstrap 命令中使用的密码 
创建域,项目,用户和角色 。

身份服务:身份服务为每一个 OpenStack 服务提供认证服务。认证服务使用一个 domain(域),projects(项目(tenants(租户))),users(用户)和roles(角色)的组合。

在 openstack 环境中创建一个包含其他服务唯一账号的 service 项目,创建 service 项目:

# openstack project create –domain default –description “Service Project” service 

3.配置 ADMIN_PASS 为 keystone-manage bootstrap 命令中使用的密码 
创建域,项目,用户和角色 
身份服务为每一个 OpenStack 服务提供认证服务。认证服务使用一个 domain(域),projects(项目(tenants(租户))),users(用户)和roles(角色)的组合。 
在 openstack 环境中创建一个包含其他服务唯一账号的 service 项目,创建 service 项目:

 
4. 创建 demo 项目:

5.创建 demo 用户:

6.创建 user 角色

7.添加 user 角色到 demo 项目和用户

五、验证操作 
在安装其他服务前,验证身份服务是否正常。 
1. 由于安全的原因,关闭临时认证令牌机制编辑/etc/keystone/keystone-paste.ini 文件并移除[pipeline:public_api], [pipeline:admin_api], 和[pipeline:api_v3]小节的 admin_token_auth 项。 

 2.删除临时环境变量

3.使用 admin 用户,请求认证令牌,密码ADMIN_PASS

4.使用 demo 用户,请求认证令牌:,密码DEMO_PASS

六、创建 OpenStack 客户端环境脚本 
 
1. 编辑 admin-openrc 文件,并添加下列内容,替换 ADMIN_PASS 为身份服务中 admin 用户的密码。 

2.编辑 demo-openrc 文件,并添加下列内容:替换 DEMO_PASS 为身份服务中 demo 用户的密码。

3.请求认证令牌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525140.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L-2:插松枝(Python)

作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的: 每人手边有一只小盒子,初始状态为空。每人面前有用不完的松枝干和一个推送…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点,因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

ROS2动作通信的实现

文章目录 1.动作通信的概念及应用场景1.1 概念1.2 应用场景 2.准备工作3.动作通信的实现3.1 动作通信接口消息3.2 服务端实现3.3 客户端实现3.4 编译及运行 1.动作通信的概念及应用场景 1.1 概念 动作通信适用于长时间运行的任务。就结构而言动作通信由目标、反馈和结果三部分…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大,高校内的党员统计及发展管理工作面临较大的压力,高校信息化建设的不断优化发展也进一步促进了系统平台的应用,借助系统平台可以实现更加高效便捷的党员信息…

给定时间求这是本年的第几天

之前我在编写个代码的时候是把它用大量的if逻辑判断语句&#xff0c;我并没有把是闰年这个条件选择出来&#xff0c;只是依据一般的想法—— #include <stdio.h> #define M 13 int main() {/********** Begin **********/int days[M] {0,31,28,31,30,31,30,31,31,30,3…

transformer--使用transformer构建语言模型

什么是语言模型? 以一个符合语言规律的序列为输入&#xff0c;模型将利用序列间关系等特征&#xff0c;输出一个在所有词汇上的概率分布.这样的模型称为语言模型. # 语言模型的训练语料一般来自于文章&#xff0c;对应的源文本和目标文本形如: src1"Ican do",tgt1…

抖音短视频素材哪里找,推荐五个好用的抖音素材网站

不知道你有没有想过一个问题&#xff0c;为什么别人都能找到那种高质量的视频素材&#xff0c;画质特别高清&#xff0c;甚至是4K的内容&#xff0c;而你需要视频素材却不知道去哪里找&#xff1f;网上有各种参差不齐的网站&#xff0c;变着法的想掏空你那本不富裕的腰包。今天…

消息队MQ

文章描述 &#xff1a;&#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; 消息队列MQ_rabbitMQ搭建 ⏱️ 创作时间&#xff1a;2024年03月9日 ———————————————…

GIS之深度学习08:安装GPU环境下的pytorch

环境&#xff1a; cuda&#xff1a;12.1.1 cudnn&#xff1a;12.x pytorch&#xff1a;2.2.0 torchvision&#xff1a;0.17.0 Python&#xff1a;3.8 操作系统&#xff1a;win &#xff08;本文安装一半才发现pytorch与cuda未对应&#xff0c;重新安装了cuda后才开始的&a…

中探:事件循环相关内容(因为不仅仅是初步认识,但也不至于是深入探讨,所以命名为“中探”)

下面内容写于 2022 年&#xff0c;文本描述过多&#xff0c;可能不适合有经验的人看。新的文章在 个人网站 中。 对了&#xff0c;说到事件循环&#xff0c;怎么可以离开这个最知名的视频呢&#xff01;视频是英文的&#xff0c;但即使你听不懂&#xff0c;单纯看他的操作&…

微信小程序如何实现下拉刷新

1.首先在你需要实现下拉刷新页面的json文件中写入"enablePullDownRefresh": true。 2.在js文件的onPullDownRefresh() 事件中实现下拉刷新。 实现代码 onPullDownRefresh() {console.log(开始下拉刷新)wx.showNavigationBarLoading()//在标题栏中显示加载图标this.d…

【网络原理】使用Java基于UDP实现简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;DatagramSocket&#x1f338;DatagramPacket&#x1f338;InetSocketAddress &#x1f333;回显客户端与服务器&#x1f338;建立回显服务器&#x1f338;回显客户端 ⭕总结 我们用Java实现UDP数据报套接字编程&#xff0c;需要借用以下…