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验证对应的操作权限,只有通过,才能进行下一步操作。
对红字的解释:
- Endpoint:相当于一个网络上可访问的网址,通常是一个URL(URL:统一资源定位符,互联网上标准资源的地址)。每个服务相应位置记录。
- Token限定时间:临时凭证,有效期是24个小时。
Token
通俗的讲,token 是用户的一种凭证,需拿正确的用户名/密码向 Keystone 申请才能得到。如果用户每次都采用用户名/密码访问 OpenStack API,容易泄露用户信息,带来安全隐患。所以 OpenStack 要求用户访问其 API 前,必须先获取 token,然后用 token 作为用户凭据访问 OpenStack API。
注释:API:用来接收和发送请求的接口(个人理解)
详情登陆:什么是API,说人话!-CSDN博客
Keystone四种认证方式:UUID、PKI、PKIZ、Fernet
- UUID
源码分析:长度固定为32byte的随机字符串。
缺陷:每次请求都要经过Keystone进行验证,大大增幅Keystone工作量,影响性能。
- 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颁发的证书。
- PKIZ
原理:和PKI基本一致,只是在使用base64url encoding进行编码的基础上,又使用压缩机制,长度上减小了一半,并且Token使用PKIZ_开头。
缺陷:同PKI
- 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. projectscoped token:针对一个project的token,它包含service catalog,a set of roles,和那个project的详细信息
2. domainscoped token:针对一个domain的token,它具有有限的使用场景,只用于domain层面的操作。与projectscoped相比,它只具有优先的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.请求认证令牌