Keystore

Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务访问规则和服务令牌功能的组件。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理

整体架构和功能

1.基本功能

keystone 作为 openstack 的 Identity Service(身份识别服务),提供了用户信息管理和完成各个模块认证服务

用户信息管理:user/tenant 基本信息,tenant 管理

认证服务:登录认证,各个组件 API 的权限控制

2.架构

既然 keystone 为各个模块提供认证服务,所以各个模块与 keystone 都有所交互。其中登录认证体现在用户访问各个组件的 API 时,调用了 WSGI 框架的 authtoken filter,该 filter 最调用 keystoneclient ,最终通过 keystone 验证 token,完成对用户的登录认证。如果认证失败,用户将不能访问该 API

3.基本概述

  1. User

    可简单的理解为用户,用户携带信物(token)能够访问 openstack 各服务和资源

  2. Tenant

    即租户,早期版本又称为 project,它是各个服务中的一些可以访问的资源集合,用户访问租户的资源前,必须与该租户关联,并且指定该用户在该租户下的角色

  3. Role

    即角色,可以理解为 VIP 等级,用户的 Role 越高,在 openstack 中能访问的服务和资源就更多

  4. Service

    即服务,如 Nova 提供云计算的服务,Glance 提供镜像管理服务,Swift 提供对象存储服务,heat 提供资源编排服务,ceilometer 则是提供告警计费服务,cinder 提供块存储服务

  5. Endpoint

    则为具体化 Service。Endpoint 翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务, 则必须知道他的 endpoint,而 endpoint 一般为 url; Endpoint 的 url 具有三种权限。public url 可以被全局访问,private url 只能被局域网访问,admin url 被从常规的访问中分离

  6. Token

    即是信物、令牌,用户通过用户名和密码获取在某个租户下的 token,通过 token,可以实现单点登录

  7. Creaentials

    简单的理解为用户和密码

4.访问流程

以创建一个虚拟机(server)为例

  1. 用户 Alice 通过自己的户名和密码向 keystone 申请 token,keystone 认证用户名和密码后,返回 token1

  2. Alice 通过 token1 发送 keystone 查询他所拥有的租户,keystone 验证 token1 成功后,返回 Alice 的所有 Tenant

  3. Alice 选择一个租户,通过用户名和密码申请 token,keystone 认证用 户名、密码、tenant 后,返回 token2 (若知道tenant的值,可以无视一、二步(两步为查询token))

  4. Alice 通过 token2 发送创建 server 的请求,keystone 验证 token2(包括该 token 是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到 nova, 最终创建虚拟机

 

 使用命令之前运行环境变量

[root@openstack ~]# source /etc/keystone/admin-openrc.sh 

 

用户管理user

查看用户列表

[root@openstack ~]# openstack user list
+----------------------------------+-------------------+
| ID                               | Name              |
+----------------------------------+-------------------+
| 0f8782af6a654d77b587e25a32f91f28 | cinder            |
| 1ab30f77400448eba6b2d47e55084540 | demo              |
| 2550fa93b1fe4cb582f1f46353b836d8 | ceilometer        |
| 2d2a345336184b1ebbdf022f710084e8 | neutron           |
| 48b816f9db9541b4bd9ca49ad453574c | glance            |
| 765a16c99d7d42a4b69ff941f7791b54 | aodh              |
| 788efa329f324b91a431ad56cd7b9a14 | nova              |
| 7ecae98d16d54483b964c9c2548fd7bc | swift             |
| 962612a3e7784df38d0c98fea1f30320 | heat              |
| 9ee4731c00c24f659b8790be6b77bc8a | admin             |
| d6fdd1e5e1a348e0b6c5b8c7f33ba5fa | placement         |
| d957a578fed2452ab91bc651f2f1fb97 | heat_domain_admin |
| e91070fa751e49689963b566db999bee | gnocchi           |
+----------------------------------+-------------------+

 

创建用户

[root@openstack ~]# openstack user create --password 000000 --domain demo testuser

 

查看用户详细信息

[root@openstack ~]# openstack user show testuser
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 0fd68b47435a4559b0bc42cd64e8cb87 |
| enabled             | True                             |
| id                  | 529fbe41b72b4ec591e1c1367b6dd1d6 |
| name                | testuser                         |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

 

更新用户 

[root@openstack ~]# openstack user set --name myuser testuser

 

删除用户

[root@openstack ~]# openstack user delete myuser

 

租户管理project

查看租户列表

[root@openstack ~]# openstack project list
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 0dd87985eb314fed828e6888aed4880d | demo    |
| 55b50cbb4dd4459b873cb15a8b03db43 | admin   |
| a184a157399043c2a40abc52df0459a2 | service |
+----------------------------------+---------+

 

创建租户

[root@openstack ~]# openstack project create --domain demo myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| enabled     | True                             |
| id          | 28b94326849643388b4585264b57d72d |
| is_domain   | False                            |
| name        | myproject                        |
| parent_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| tags        | []                               |
+-------------+----------------------------------+

 

查看租户详细信息

[root@openstack ~]# openstack project show myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| enabled     | True                             |
| id          | 28b94326849643388b4585264b57d72d |
| is_domain   | False                            |
| name        | myproject                        |
| parent_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| tags        | []                               |
+-------------+----------------------------------+

 

更新租户

[root@openstack ~]# openstack project set --disable myproject
[root@openstack ~]# openstack project show myproject 
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| enabled     | False                            |
| id          | 28b94326849643388b4585264b57d72d |
| is_domain   | False                            |
| name        | myproject                        |
| parent_id   | 0fd68b47435a4559b0bc42cd64e8cb87 |
| tags        | []                               |
+-------------+----------------------------------+

 

删除租户

[root@openstack ~]# openstack project delete myproject

 

角色管理role

 查看角色列表

[root@openstack ~]# openstack role list
+----------------------------------+------------------+
| ID                               | Name             |
+----------------------------------+------------------+
| 5cf334e099bb45eeb8221a8d52fbc20b | user             |
| 86894f5ec5b94c578612f8573b1654fd | admin            |
| accbaf32c27c405fbdc00403e9d3b47f | heat_stack_user  |
| bd9a0f5370ae499cbb0745e915145db8 | heat_stack_owner |
| efdb4ab19c764c9783735686cb2206fb | ResellerAdmin    |
+----------------------------------+------------------+

 

创建角色

[root@openstack ~]# openstack role create testrole
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 8eaff88610454febb7fbc89c251acd18 |
| name      | testrole                         |
+-----------+----------------------------------+

 

查看角色的详细信息

[root@openstack ~]# openstack role show testrole
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 8eaff88610454febb7fbc89c251acd18 |
| name      | testrole                         |
+-----------+----------------------------------+

 

授权角色

[root@openstack ~]# openstack role add --project myproject --user testuser testrole

 

撤回授权

[root@openstack ~]# openstack role remove --project myproject --user testuser testrole

 

删除角色

[root@openstack ~]# openstack role delete testrole

 

域管理domain

查看域名列表

[root@openstack ~]# openstack domain list
+----------------------------------+------+---------+--------------------------+
| ID                               | Name | Enabled | Description              |
+----------------------------------+------+---------+--------------------------+
| 0fd68b47435a4559b0bc42cd64e8cb87 | demo | True    | Default Domain           |
| 5be750028f0c4928a361ffe09734098f | heat | True    | Stack projects and users |
+----------------------------------+------+---------+--------------------------+

 

创建域名

[root@openstack ~]# openstack domain create test
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| enabled     | True                             |
| id          | 33a649321a7a4b37818f20fdd151c5f1 |
| name        | test                             |
| tags        | []                               |
+-------------+----------------------------------+

 

查看域名详细信息

[root@openstack ~]# openstack domain show test
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| enabled     | True                             |
| id          | 33a649321a7a4b37818f20fdd151c5f1 |
| name        | test                             |
| tags        | []                               |
+-------------+----------------------------------+

 

更新域名

[root@openstack ~]# openstack domain set --disable test
[root@openstack ~]# openstack domain show test         
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| enabled     | False                            |
| id          | 33a649321a7a4b37818f20fdd151c5f1 |
| name        | test                             |
| tags        | []                               |
+-------------+----------------------------------+

 

删除域名

[root@openstack ~]# openstack domain delete test

 

服务管理service

查看服务列表

[root@openstack ~]# openstack service list
+----------------------------------+------------+----------------+
| ID                               | Name       | Type           |
+----------------------------------+------------+----------------+
| 0180c4415e9441d081d4cd32c0c4653a | heat       | orchestration  |
| 3a062312dd734acc9accdf6d49018351 | aodh       | alarming       |
| 5358ad058dfc43bcacaa1c757a200554 | nova       | compute        |
| 56f5bf25e1c4402bbfbadc011ad89cf8 | cinderv3   | volumev3       |
| 63e09469c88a442cab182bbb42a22c56 | keystone   | identity       |
| 650c870db0c746c5821680fe3c71d38e | placement  | placement      |
| 715da9d8156543c5909a1a5cca0f82f2 | heat-cfn   | cloudformation |
| 769f82493c8e4412a88c1d54cb83b181 | cinderv2   | volumev2       |
| 9b82d36a3df948e2921aec3d26022dc5 | gnocchi    | metric         |
| b4b4ce6e93ef44fd9827b9da61962d63 | ceilometer | metering       |
| bc348aa7e16045ea9d5b9e4ee92777dc | neutron    | network        |
| c7758f0593c746718ed9ac4c69dfec80 | cinder     | volume         |
| da90ae15a2c448ebb72542880713b453 | glance     | image          |
| dc1b0ef593ae45c993fb69cff54c3037 | swift      | object-store   |
+----------------------------------+------------+----------------+

 

创建服务

[root@openstack ~]# openstack service create test
+---------+----------------------------------+
| Field   | Value                            |
+---------+----------------------------------+
| enabled | True                             |
| id      | 647b4240f53c4cbc8abed5d695543d95 |
| name    |                                  |
| type    | test                             |
+---------+----------------------------------+

 

删除服务

[root@openstack ~]# openstack service delete test

 

创建服务入口

openstack endpoint create --region region_name service_id interface url

  

创建nova-compute入口

# openstack endpoint create --region myregion 5358ad058dfc43bcacaa1c757a200554 admin http://172.25.253.5:8774/v2
​
# openstack endpoint create --region myregion 5358ad058dfc43bcacaa1c757a200554 initernal http://172.25.253.5:8774/v2
​
# openstack endpoint create --region myregion 5358ad058dfc43bcacaa1c757a200554 public http://172.25.253.5:8774/v2

 

创建nova-volume入口

# openstack endpoint create --region myregion 08ebebcbcbf64e4f9012b13db94e83e2 admin http://172.25.253.5:8776/v1
​
# openstack endpoint create --region myregion 08ebebcbcbf64e4f9012b13db94e83e2 initernal http://172.25.253.5:8776/v1
​
# openstack endpoint create --region myregion 08ebebcbcbf64e4f9012b13db94e83e2 public http://172.25.253.5:8776/v1

 

Keystone权限

使用自行搭建的OpenStack私有云平台,修改普通用户权限,使普通用户不能对镜像进行创建和删除操作

 

openstack 提速

清理过期的token使openstack提速

有时候你会发现使用 Horizon 创建或查询数据的速度变慢了,或者 mysql 占用 CPU 过高,亦或是备份数据库尤其是备份 keystone 数据库时耗时太长,这时候你就要考虑清理 keystone 数据库中的 token 表了

Keystone 默认使用 SQL 数据库存储 token,在 keystone.conf 可以看到相关信息(# vim /etc/keystone/keystone.conf token) token 默认有效期为 1 天

token 的存放还有两个选择

  • keystone.token.backends.memcache:内存数据库

  • keystone.token.backends.kvs:二元组(键对)

使用 memcache 虽然速度加快,但耗内存。使用键对速度相对较慢。所以最好的选择还是使用关系数据库,例如 mysql

 

  • 清理过期的token

# keystone-manage token_flush   

 

加入到 crontab 里,根据需要运行就可以了,例如每周运行一次

0 1 * * 7 keystone-manage token_flush

 

鉴于 PKI 过于庞大,不仅对 Keystone,对 Horizon 上的 HTTP 的负载也会加大,所以在私有云环境下我们完全可以用 UUID 来代替默认的 PKI

# vim /etc/keystone/keystone.conf
[signing]
# Deprecated in favor of provider in the [token] section
# Allowed values are PKI or UUID
token_format = UUID
​
# systemctl restart openstack-keystone.service

 

user api

openstack 所有的命令都是通过 WSGI 进行扩展,用 http 请求来完成。用户 PUT/POST 请求数据给相应的 nova endpoint, nova 处理请求,reponse 相关的数据

user 关联的 endpoint 可以用以下命令取得

# openstack endpoint list
+----------------------------------+-----------+--------------+----------------+---------+-----------+---------------------------------------------+
| ID                               | Region    | Service Name | Service Type   | Enabled | Interface | URL                                         |
+----------------------------------+-----------+--------------+----------------+---------+-----------+---------------------------------------------+
| 417121e01da84191acce4c2c64189cfe | RegionOne | keystone     | identity       | True    | internal  | http://openstack:5000/v3                    |
| a10f5833f89c45e4939c76e239c4ac56 | RegionOne | keystone     | identity       | True    | admin     | http://openstack:5000/v3                   |
| df768633f7f04842bf76be785a475e21 | RegionOne | keystone     | identity       | True    | public    | http://openstack:5000/v3                    |
+----------------------------------+-----------+--------------+----------------+---------+-----------+---------------------------------------------+
 

 

user token 可以以下命令获得

curl -X POST http://openstack:5000/v3/tokens -d '{"auth":{"passwordCredentials":{"username": "myadmin", "password":"000000"}}}' -H  "Content-type: application/json" 

 

获取 Keystone token

调用python-keystoneclient

发一个简单的 cURL 发送请求

# curl -d '{"auth": {"tenantName": "demo", "passwordCredentials": {"username": "demo", "password": "password"}}}' -H "Content-type: application/json" http://localhost:5000/v2.0/tokens
*tenantName 是作用域名*
返回值:
{
"access": {
    "token": {
        "issued_at": "2014-02-10T00:40:20.909222",
        "expires": "2014-02-11T00:40:20Z",
        "id": "MIIDjwYJKoZIhvcNAQcCoIIDgDC",
        "tenant": {
            "description": null,
            "enabled": true,
            "id": "8cdca733159c4bf6a622b9bb25a73ad6",
            "name": "demo"
            }
        },
    "serviceCatalog": [],
    "user": {
        "username": "demo",
        "roles_links": [],
        "id": "d5cf3796f7c04a468b5282555110ba5d",
        "roles": [
            {
            "name": "member"
            }
        ],
        "name": "demo"
    },
    "metadata": {
        "is_admin": 0,
        "roles": [
        "a790ff829b0e4bc29d5ca4bbc58d48f1"
        ]
    }
    }
}
 

 

调用 Requests 库

from__future__ importprint_function
importrequests
importjson
if__name__ =="__main__":
json_payload={
    "auth": {
        "tenantName":"demo",
        "passwordCredentials": {
            "username":"demo",
            "password":"password"
        }
    }
}
headers={'content-type':'application/json','accept':'application/json'}
response=requests.post(url='http://localhost:5000/v2.0/tokens',
data=json.dumps(json_payload),
headers=headers)
ifresponse.status_code ==requests.codes.ok:
print(response.json())
else:
print('Something went wrong!')

 

 

 

posted @ 2021-12-06 20:48  衡衡酱  阅读(605)  评论(0)    收藏  举报
Live2D