一、简介

  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服务时,仅需亮出令牌即可。

  下图是从官网截取的具体认证流程图,以供参考:

wKioL1bcSluh6dLnAADv_C7lkLo852.png

三、安装和配置

1、首先数据库授权:

# 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:

$ openssl rand -hex 10
ba48c69ef1612f3b8569

3、安装

# yum install openstack-keystone httpd mod_wsgi python-openstackclient memcached python-memcached
# systemctl enable memcached.service
# systemctl start memcached.service

4、配置

修改配置文件:

>>>> /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:

# su -s /bin/sh -c "keystone-manage db_sync" keystone


配置Apache服务:

# vim /etc/httpd/conf/httpd.conf
ServerName controller
# 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>
# 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)
# 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:

# export OS_TOKEN=ba48c69ef1612f3b8569

配置后端服务器(endpoint)的URL,这里可以写ip地址:

# export OS_URL=http://controller:35357/v2.0

创建service entity 和API endpoint

# 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、创建租户、用户和角色

# 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、配置环境变量

# openstack --os-auth-url http://10.13.25.11:35357 --os-project-name admin --os-username admin --os-auth-type password token issue
# 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、查看命令

# keystone user-list
# keystone tenant-list
# keystone role-list
# keystone user-role-list
# keystone service-list
# keystone endpoint-list

4、创建命令

# 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、删除命令

# 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 p_w_picpath-list

#nova flavor-list

#nova --os-username user1 --os-password 123456 --os-tenant tenant1 boot instance1 

--p_w_picpath "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

#cat /etc/keystone/policy.json
#cat /etc/neutron/policy.json
#cat /etc/glance/policy.json
#cat /etc/cinder/policy.json

七、keystone代码结构

wKioL1bkBquSAhk9AAAh19rcPV4714.png