一、简介
Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。
Keystone提供3A(Account, Authentication, Authoriz
ation)服务,
无论是dashboard还是client API都需要先通过keystone的认证后才可以获取Openstack服务列表。
Keystone 中主要涉及到如下几个概念:
1、用户(user):顾名思义就是使用服务的用户,可以是人、服务或者是系统,只要是使用了 Openstack 服务的对象都可以称为用户。
2、租户(tenant):租户,可以理解为一个人、项目或者组织拥有的资源的合集。在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源。Keystone V3中将 tenant 改称为了Project。
3、角色(role):角色,用于分配操作的权限。角色可以被指定给用户,使得该用户获得角色对应的操作权限
4、令牌(token):指的是一串比特值或者字符串,用来作为访问资源的记号。Token 中含有可访问资源的范围和有效时间。
服务目录部件(Service Catalog)提供了一套REST API服务端点列表并以此作为决策参考,主要包含以下几个概念:
1、服务(service):一个OpenStack服务,例如Nova、Swift、Glance或Keystone。一个服务可以拥有一个或多个端点,用户可以通过它与OpenStack的服务或资源进行交互。
2、端点(endpoint):一个可以通过网络访问的地址(例如一个URL),代表了OpenStack服务的API入口。端点也可以分组为模板,每个模板代表一组可用的OpenStack服务,这些服务是跨区域(regions)可用的,例如将多个Swift Proxy Server分别配置为不同的域(regionOne、regionTwo等)。
3、模板(Template):一个端点集合,代表一组可用的OpenStack服务端点。
二、认证流程:
1.用户(user)提供自己的用户名称及用户身份凭证(Crenditial,如密码);
2.keystone验证用户(user)的身份(Crenditial);
3.认证成功后,keystone会给用户分配一个令牌(token),用户在访问其他Openstack服务时,仅需亮出令牌即可。
下图是从官网截取的具体认证流程图,以供参考:
![keystone.png wKioL1bcSluh6dLnAADv_C7lkLo852.png]()
三、安装和配置
1、首先数据库授权:
|
1
2
3
4
5
|
> CREATE DATABASE keystone;
> GRANT ALL PRIVILEGES ON keystone.* TO
'keystone'
@
'localhost'
IDENTIFIED BY
'mypasswd'
;
> GRANT ALL PRIVILEGES ON keystone.* TO
'keystone'
@
'%'
IDENTIFIED BY
'mypasswd'
;
> EXIT
|
2、用openssl生成一个随机数值作为用做后面的token:
|
1
2
|
$ openssl
rand
-hex 10
ba48c69ef1612f3b8569
|
3、安装
4、配置
修改配置文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
>>>>
/etc/keystone/keystone
.conf
[DEFAULT]
...
admin_token = ba48c69ef1612f3b8569
verbose = True
[database]
...
connection = mysql:
//keystone
:mypasswd@10.13.25.11
/keystone
[memcache]
...
servers = localhost:11211
[token]
...
provider = keystone.token.providers.uuid.Provider
driver = keystone.token.persistence.backends.memcache.Token
[revoke]
...
driver = keystone.contrib.revoke.backends.sql.Revoke
|
Populate the Identity service database:
配置Apache服务:
|
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
|
Listen 5000
Listen 35357
<VirtualHost *:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias /
/var/www/cgi-bin/keystone/main
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LogLevel info
ErrorLogFormat
"%{cu}t %M"
ErrorLog
/var/log/httpd/keystone-error
.log
CustomLog
/var/log/httpd/keystone-access
.log combined
<
/VirtualHost
>
<VirtualHost *:35357>
WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-admin
WSGIScriptAlias /
/var/www/cgi-bin/keystone/admin
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LogLevel info
ErrorLogFormat
"%{cu}t %M"
ErrorLog
/var/log/httpd/keystone-error
.log
CustomLog
/var/log/httpd/keystone-access
.log combined
<
/VirtualHost
>
|
|
1
2
3
4
5
6
7
8
|
import
os
from keystone.server
import
wsgi as wsgi_server
name = os.path.
basename
(__file__)
application = wsgi_server.initialize_application(name)
|
配置authentication token:
配置后端服务器(endpoint)的URL,这里可以写ip地址:
创建service entity 和API endpoint
|
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
|
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Identity |
| enabled | True |
|
id
| 8e052bba87e84bb1b3857b82720d8c01 |
| name | keystone |
|
type
| identity |
+-------------+----------------------------------+
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| adminurl | http:
//10
.13.25.11:35357
/v2
.0 |
|
id
| 0be7d1ed3e0d45a9aad465b65f6df6f0 |
| internalurl | http:
//10
.13.25.11:5000
/v2
.0 |
| publicurl | http:
//10
.13.25.11:5000
/v2
.0 |
| region | RegionOne |
| service_id | 8e052bba87e84bb1b3857b82720d8c01 |
| service_name | keystone |
| service_type | identity |
+--------------+----------------------------------+
|
四、keystone命令
1、创建租户、用户和角色
2、配置环境变量
|
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
|
export
OS_PROJECT_DOMAIN_ID=default
export
OS_USER_DOMAIN_ID=default
export
OS_PROJECT_NAME=admin
export
OS_TENANT_NAME=admin
export
OS_USERNAME=admin
export
OS_PASSWORD=mypassword
export
OS_AUTH_URL=http:
//10
.13.25.11:35357
/v3
export
PS1=
'[\u@\h \W(admin)]\$ '
export
OS_PROJECT_DOMAIN_ID=default
export
OS_USER_DOMAIN_ID=default
export
OS_PROJECT_NAME=demo
export
OS_TENANT_NAME=demo
export
OS_USERNAME=demo
export
OS_PASSWORD=mypassword
export
OS_AUTH_URL=http:
//10
.13.25.11:5000
/v3
export
PS1=
'[\u@\h \W(demo)]\$ '
|
3、查看命令
4、创建命令
|
1
2
3
4
5
6
7
8
9
10
11
|
--service cinder \
--publicurl http:
//10
.13.25.11:8776
/v1
\
--internalurl http:
//10
.13.25.11:8776
/v1
\
--adminurl http:
//10
.13.25.11:8776
/v1
\
--region regionOne
|
5、删除命令
五、角色的作用
在Openstack中一个user可以同时属于多个tenant,role定义了用户能够shixian的行为
核心:user需要使用role实现加入多个tenant的操作。
案例:
| 将用户加入多个租户操作步骤: 创建tenant: #keystone tenant-create --name tenant1 --enabled true #keystone tenant-create --name tenant2 --enabled true 创建user: #keystone user-create --name user1 --tenant tennat1 --password 123456 --enabled true #keystone user-create --name user2 --tenant tennat2 --password 123456 --enabled true 不创建role,使用user1创建一个虚拟机实例(instance): #nova image-list #nova flavor-list #nova --os-username user1 --os-password 123456 --os-tenant tenant1 boot instance1 --image "65d3f61a-885f-4c06-996f-278431e91339" --flavor m1.tiny 使用user2的身份查看tenant1里面的instance: #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 list 结果为空(因为user2没有对tenant1的操作权限) 创建任意角色(role): #keystone role-create --name role1 使用role1的角色将user2加入到tenant1中: #keystone user-role-add --user user2 --role role1 --tenant tenant1 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 再次使用user2的身份查看tenant1中的instance: #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 list +---------------------------------------------------------------+------------------+--------------+------------------+------------------+--------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------------------------------+--------------------+---------------+----------------+-----------------+---------------------------------+ | 694ddb6a-2b79-4ebc-9986-ef9eb51d71dd | instance1 | SHUTOFF | - | Shutdown | private=192.168.0.12 | +-------------------------------------------------------------+-------------------+-----------------+---------------+-------------------+--------------------------------+ #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 delete instance1 //删除虚拟机实例 |
六、决定角色的核心
决定角色权限的核心:policy.json
七、keystone代码结构
![代码结构.png wKioL1bkBquSAhk9AAAh19rcPV4714.png]()
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1750321,如需转载请自行联系原作者