OpenStack Keystone

Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。

它有两个功能:

(1)用户管理:验证用户身份信息合法性
(2)服务目录管理:提供各个服务目录的(Service Catalog:包括service和endpoint)服务,无论任何服务或者客户访问openstack都要访问keystone获取服务列表,以及每个服务的endpoint

Keystone基本概念介绍

1.user:User即用户,指的是使用openstack service的用户,可以是人,服务,系统,就是说只要是访问openstack service 的对象都可以称为User

2.Credentials:是用于确认用户身份的凭证。说白了就是“信物”,可以是:

openstack keystone重置 openstack的keystone_User


(1):用户名和密码

(2):用户名跟API Kye(秘钥)              #(1)(2)用户第一次确认身份的方法

(3):一个keystone分配的身份的token           #(3)用户已经确认身份后的方法 (token是有时间限制的)

3.Auhentication

    (1):用户身份验证的过程。keystone服务通过检查用户的Credentials来确定用户的身份

    (2):第一次验证身份是使用用户名与密码或者用户名与API Key的形式。当用户的Credentials被验证后,keystone会给用户分配一个Authentication token 供该用户的后续请求操作(返回的token中就包含User的Role列表)
    
4.Token

    (1):是一串数字字符串,当用户访问资源时需要使用的东西,在keystone中主要是引入令牌机制来保护用户对资源的访问,同时引入PKI、PKIZ、fernet、UUID其中一个随机加密产生一串数字,对令牌加以保护

5.Role

    (1):本身是一堆ACL集合,主要用于权限的划分。

    (2):可以给User指定Role,是user获得role对应的操作权限。

    (3):系统默认使用管理Role的角色 管理员用户:admin 普通用户:member(老版本) user(新版本)

    (5):user验证的时候必须带有Project。老版本叫(Tenant)

6.Policy

    (1):对于keystone service 来说,Policy就是一个JSON文件,rpm安装默认是在/etc/keyston/policy.json。通过配置这个文件,keystone实现了对User基于Role的权限管理(User <– Role(ACL) <–Policy)

    (2):Policy就是用来控制User对Project(tenant)中资源的操作权限
7.Project(Tenant)

    (1):Project(Tenant)是一个人或服务所拥有的资源集合。不同的Project之间资源是隔离的,资源可以设置配额

    (2):Project(Tenant)中可以有多个User,每一个User会根据权限的划分来使用Project(Tenant)中的资源

    (3):User在使用Project(Tenant)的资源前,必须要与这个Project关联,并且制定User在Project下的Role,一个assignment(关联) 即:Project-User-Role
    
8.Service 

    即服务,如Nova,Glace,等各个组件

9.Endpoint:

    (1):用来通过访问和定位某个openstack service的地址,通常是一个URL

    (2):不同的region有不同的Endpoint

    (3):任何服务都访问openstack service中的资源时,都要访问keystone

    (4):Endpoint分为三类:

      1.admin url —>管理员用户使用 Port:35357

      2.internal url —>openstack内部组件间互相通信 Port:5000 (组件之间通信基于Restful api)

      3.public url —> 其他用户访问地址 Port:5000

10.Service与Endpoint关系

    (1):在openstack中,每一个service中都有三种Endpoint:Admin、Public、Internal(创建完service后需要为其创建API Endpoint)

    (2):Admin使用者为管理员,能够修改User Project(Tenant)

    (3):public使用者为客户端,使用者在外网管理自己云服务器

    (4):internal使用者为内部组件间相互调用

    (5):三种Endpoint在网络上开放的权限也不同,Admin通常只能对内网开放,public通常可以对外网开放,internal只能对有安装openstack服务的机器开放

11.V3版本更新

    1.Tenant更改为Project

    2.添加了Domain(对系统资源进行限额)

    3.添加了Group (组的概念为了更好的管理用户,例如linux下对组授权,其组下面的用户也有了相应的权限)

    4.member更改为user

将上面各个部分结合起来。

    比如说,某公司年会组织跟团去旅游(公司相当于一个group,公司的员工相当于User)。到了晚上要住店,首先要先到前台登记(前台就相当于Keystone),对前台(keystone)来说,你要住店要拿出你的证明(对keystone来说就是要证明你是你)。

    怎么办?拿出身份证,这里的身份证就相当于Credentials(用户名和密码),前台(keystone)会进行验证你的身份信息(Authentication),验证成功后,前台(Keystone)会给你一个房卡(Token),并且有不同的房卡(比如:普通卡,会员卡,白金卡等),不同的卡有不同的权限(Role),并且拿到房卡后,前台(keystone)会给你一个导航图(Endpoint)让你找到你的房间。并且一个酒店不光会有住宿服务,可能还有别的服务(service),像餐饮,娱乐,按摩等等,比如说要去吃饭,不知道路线怎么走,看一下导航图(endpoint)就知道了,到餐饮部门(service)会有三个路线(Endpoint)可以走。为什么会有三个,领导层通道 –> 走后门(admin),内部员工通道 –>(internal),客人通道 –>(public)。知道如何去,也有了权限(Token/Role)到了餐饮部门,当你点餐的时候,会让你刷上你的会员卡(这个步骤就是service像keystone确认你有没有权限),验证成功后,你就可以点餐吃饭。

工作流程。

openstack keystone重置 openstack的keystone_User_02


这样就很好理解了。

以上参考:

下面安装和配置 Identity service(身份服务)keystone

安装和配置 Identity service(身份服务)keystone
本章节介绍在 Controller node(管理节点)安装和配置身份服务。
先决条件
在安装配置 OpenStack 身份服务前,你必须创建一个数据库和管理员令牌。
1. 创建数据库,并完成下列操作
A. 使用数据库命令行客户端,以 root 身份登录数据库服务器

# mysql -u root -p123

openstack keystone重置 openstack的keystone_User_03


B. 创建 keystone 数据库

MariaDB [(none)]> CREATE DATABASE keystone;

openstack keystone重置 openstack的keystone_openstack_04


C. 授予数据库用户 keystone 访问 keystone 数据库的权限。

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO ‘keystone’@’localhost’ IDENTIFIED BY ‘123’;MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO ‘keystone’@’%’ IDENTIFIED BY ‘123’;

openstack keystone重置 openstack的keystone_API_05


openstack keystone重置 openstack的keystone_Endpoint_06


替换 123 为一个合适的密码。

安装并配置组件
1. 安装软件包

# yum install openstack-keystone httpd mod_wsgi –y

openstack keystone重置 openstack的keystone_Endpoint_07


openstack keystone重置 openstack的keystone_API_08

  1. 编辑/etc/keystone/keystone.conf 文件并完成下列操作:
    注:
    默认配置文件在各发行版本中可能不同。你可能需要添加这些部分和选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(…)表示默认的配置选项你应该保留。
    A. 在[database]小节,配置数据库访问:

[database]

# …

connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

openstack keystone重置 openstack的keystone_Endpoint_09


注:替换 KEYSTONE_DBPASS 为合适的密码。

B. 在[token]小节,配置使用 Fernet 技术提供令牌。

[token]

# …

provider = fernet

openstack keystone重置 openstack的keystone_User_10


3. 初始化身份服务数据库:# su -s /bin/sh -c “keystone-manage db_sync” keystone

openstack keystone重置 openstack的keystone_Endpoint_11


4. 初始化 Fernet key 仓库:# keystone-manage fernet_setup –keystone-user keystone –keystone-group keystone

# keystone-manage credential_setup –keystone-user keystone –keystone-group keystone

openstack keystone重置 openstack的keystone_User_12


5. 引导身份服务,创建管理员。# keystone-manage bootstrap –bootstrap-password 123 \

–bootstrap-admin-url http://controller:35357/v3/ \

–bootstrap-internal-url http://controller:5000/v3/ \

–bootstrap-public-url http://controller:5000/v3/ \

–bootstrap-region-id RegionOne

openstack keystone重置 openstack的keystone_openstack_13


替换 ADMIN_PASS 为合适的密码。

配置 Apache HTTP 服务

1. 编辑/etc/httpd/conf/httpd.conf 文件并配置 ServerName 配置项

为管理节点的主机名:

ServerName controller

openstack keystone重置 openstack的keystone_Endpoint_14


2. 创建到文件/usr/share/keystone/wsgi-keystone.conf 的链接:# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

openstack keystone重置 openstack的keystone_openstack_15


完成安装

1. 启动 Apache HTTP 服务并设置开机自动启动:

# systemctl enable httpd.service

# systemctl start httpd.service

openstack keystone重置 openstack的keystone_openstack_16


2. 配置管理账号

# 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://controller:35357/v3

# export OS_IDENTITY_API_VERSION=3

openstack keystone重置 openstack的keystone_API_17


配置 ADMIN_PASS 为 keystone-manage bootstrap 命令中使用的密码

创建域,项目,用户和角色

身份服务为每一个 OpenStack 服务提供认证服务。认证服务使用一个 domain(域),projects(项目(tenants(租户))),users(用户)和roles(角色)的组合。

1. 在 openstack 环境中创建一个包含其他服务唯一账号的 service 项目,创建 service 项目:# openstack project create –domain default –description “Service Project” service

openstack keystone重置 openstack的keystone_Endpoint_18


2. 日常(非管理员)任务一般使用一个非特权项目和用户。在本手册中,创建 demo 项目和用户:

A. 创建 demo 项目:# openstack project create –domain default –description “Demo Project” demo

openstack keystone重置 openstack的keystone_openstack_19

B. 创建 demo 用户:

# openstack user create –domain default –password-prompt demo

openstack keystone重置 openstack的keystone_User_20


C. 创建 user 角色:# openstack role create user

openstack keystone重置 openstack的keystone_API_21


D. 添加 user 角色到 demo 项目和用户:# openstack role add –project demo –user demo user

openstack keystone重置 openstack的keystone_User_22


验证操作

在安装其他服务前,验证身份服务是否正常。

1. 由于安全的原因,关闭临时认证令牌机制。

编辑/etc/keystone/keystone-paste.ini 文件并移除[pipeline:public_api], [pipeline:admin_api], 和[pipeline:api_v3]小节的 admin_token_auth 项。

openstack keystone重置 openstack的keystone_Endpoint_23


2. 删除临时环境变量 OS_AUTH_URL 和 OS_PASSWORD:# unset OS_AUTH_URL OS_PASSWORD

openstack keystone重置 openstack的keystone_openstack_24


3. 使用 admin 用户,请求认证令牌# openstack –os-auth-url http://controller:35357/v3 –os-project-domain-name default –os-user-domain-name default –os-project-name admin –os-username admin token issue

openstack keystone重置 openstack的keystone_openstack_25


4. 使用 demo 用户,请求认证令牌:# openstack –os-auth-url http://controller:5000/v3 –os-project-domain-name default –os-user-domain-name default –os-project-name demo –os-username demo token issue

openstack keystone重置 openstack的keystone_User_26


创建 OpenStack 客户端环境脚本

为 admin 和 demo 项目和用户创建客户端环境脚本。本手册后续部分将使用这些脚本加载用户凭据。

1. 编辑 admin-openrc 文件,并添加下列内容:export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=ADMIN_PASS

export OS_AUTH_URL=http://controller:35357/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

openstack keystone重置 openstack的keystone_Endpoint_27


替换 ADMIN_PASS 为身份服务中 admin 用户的密码。

2. 编辑 demo-openrc 文件,并添加下列内容:export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default 
 export OS_PROJECT_NAME=demo 
 export OS_USERNAME=demo 
 export OS_PASSWORD=DEMO_PASS 
 export OS_AUTH_URL=http://controller:5000/v3 
 export OS_IDENTITY_API_VERSION=3 
 export OS_IMAGE_API_VERSION=2

openstack keystone重置 openstack的keystone_User_28


替换 DEMO_PASS 为身份服务中 demo 用户的密码。

使用脚本

1. 加载 admin-openrc 文件用来填充身份服务中 admin 项目和用户的

用户凭据到环境变量:

# . admin-openrc

  1. 请求认证令牌

# openstack token issue

openstack keystone重置 openstack的keystone_openstack_29


中间可能会出现一些错误,比如说:

1.Missing value auth-url required for auth plugin password 
 2.The request you have made requires authentication. (HTTP 401) (Request-ID: req-fa28c870-79e5-48f3-aa72-a7b25057d157)