openstack(四)Keystone
一、简介
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服务时,仅需亮出令牌即可。
下图是从官网截取的具体认证流程图,以供参考:
三、安装和配置
1、首先数据库授权:
|
1
2
3
4
5
|
# mysql -u root -p
> 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、安装
|
1
2
3
|
# yum install openstack-keystone httpd mod_wsgi python-openstackclient memcached python-memcached
# systemctl enable memcached.service
# systemctl start memcached.service
|
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
# 注意该信息,admin_token参数是用来访问Keystone服务的,即Keystone服务的Token。我们用刚才生成的随机数替换。客户端可以使用该Token访问Keystone服务、查看信息、创建其他服务等
verbose = True
# 启用verbose logging,方便troubleshooting
[database]
...
connection = mysql:
//keystone
:mypasswd@10.13.25.11
/keystone
# 此处为数据库参数,指定数据库文件的存放位置,其中10.13.25.11为数据库地址,第一个keystone为用户名,mypasswd为访问密码,第二个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:
|
1
|
# su -s /bin/sh -c "keystone-manage db_sync" keystone
|
配置Apache服务:
|
1
2
|
# vim /etc/httpd/conf/httpd.conf
ServerName controller
|
|
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
|
# vim /etc/httpd/conf.d/wsgi-keystone.conf
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
|
# mkdir -p /var/www/cgi-bin/keystone
# vim /var/www/cgi-bin/keystone/{main,admin}
import
os
from keystone.server
import
wsgi as wsgi_server
name = os.path.
basename
(__file__)
application = wsgi_server.initialize_application(name)
|
|
1
2
3
4
|
# chown -R keystone:keystone /var/www/cgi-bin/keystone
# chmod 755 /var/www/cgi-bin/keystone/*
# systemctl enable httpd.service
# systemctl start httpd.service
|
配置authentication token:
|
1
|
# export OS_TOKEN=ba48c69ef1612f3b8569
|
配置后端服务器(endpoint)的URL,这里可以写ip地址:
|
1
|
# export OS_URL=http://controller:35357/v2.0
|
创建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
|
# openstack service create --name keystone --description "OpenStack Identity" identity
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Identity |
| enabled | True |
|
id
| 8e052bba87e84bb1b3857b82720d8c01 |
| name | keystone |
|
type
| identity |
+-------------+----------------------------------+
# openstack service show keystone //也可以用这条命令查看
# openstack endpoint create --publicurl http://10.13.25.11:5000/v2.0 --internalurl http://10.13.25.11:5000/v2.0 --adminurl http://10.13.25.11:35357/v2.0 --region RegionOne 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、创建租户、用户和角色
|
1
2
3
4
5
6
7
8
9
10
|
# openstack project create --description "Admin Project" admin //创建管理租户
# openstack user create --password-prompt admin //创建管理员用户
# openstack role create admin //创建管理员角色
# openstack role add --project admin --user admin admin //赋予管理员角色
# openstack project create --description "Service Project" service //给service创建租户
# openstack project create --description "Demo Project" demo //给demo创建租户
# openstack user create --password-prompt demo //创建用户
# openstack role create user //创建角色
# openstack role add --project demo --user demo user //给租户和用户添加角色
# unset OS_TOKEN OS_URL //Unset 临时 OS_TOKEN 和OS_URL 环境变量
|
2、配置环境变量
|
1
|
# openstack --os-auth-url http://10.13.25.11:35357 --os-project-name admin --os-username admin --os-auth-type password token issue
|
|
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
|
# vim /root/admin-openrc.sh
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)]\$ '
# vim /root/demo-openrc.sh
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)]\$ '
# cd /root
# source admin-openrc.sh
# openstack token issue
|
3、查看命令
|
1
2
3
4
5
6
|
# keystone user-list
# keystone tenant-list
# keystone role-list
# keystone user-role-list
# keystone service-list
# keystone endpoint-list
|
4、创建命令
|
1
2
3
4
5
6
7
8
9
10
11
|
# keystone tenant-create --name tenant1 --description A test Tenant --enabled true
# keystone user-create --name user1 --tenanet tenant1 --pass 123456 --email test@gmail.com --enabled true
# keystone role-create --name role1
# keystone user-role-add --user user1 --role role1 --tenant tenant1
# keystone service-create --name cinder --type volume --description Cinder Service
# keystone endpoint-create \
--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、删除命令
|
1
2
3
4
5
6
|
# keystone tenant-delete <tenant>
# usage: keystone user-delete <user>
# keystone user-role-remove --user <user> --role <role> [--tenant <tenant>]
# keystone role-delete <role>
# keystone service-delete <service>
# keystone endpoint-delete <endpoint-id>
|
五、角色的作用
在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
|
1
2
3
4
|
#cat /etc/keystone/policy.json
#cat /etc/neutron/policy.json
#cat /etc/glance/policy.json
#cat /etc/cinder/policy.json
|
七、keystone代码结构
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1750321,如需转载请自行联系原作者

