openstack nova 基础知识——policy

【openstack】Nova中的policy Nova中的policy 本博客欢迎转发,但请保留原作者信息!内容系本人学习、研究和总结,如有雷同,实属荣幸! 任何对外暴露接口的系统,都必须有分权分域以及认证鉴权的功能。在openstack中,keystone组件用来对用户进行认证,说白了就是看用户是否是系统的合法用户,而policy机制则主要看用户的操作是否满足特定的条件,比如一些接口是特权接口(仅限管理员使用),普通用户不允许调 阅读详情

终于到了可以总结的时候了,policy本身的实现机制并不难,对我来说,难就难在python语法上,policy用到了很多高级的语法,逻辑性比较复杂,要理清其中的关系,还是要费一番功夫的。为此,还总结了另一篇blog,介绍了一下policy中用到的较为经典的语法。


1. 首先还是先来了解一下什么是policy,它是用来做什么的


在openstack的用户管理中,有三个概念:Users, Tenants, Roles。简单来说,policy就是用来控制某一个User在某个Tenant中的权限的。这个User能执行什么操作,不能执行什么操作,就是通过policy机制来实现的。直观的看,policy就是一个json文件,位于/etc/[SERVICE_CODENAME]/policy.json中,每一个服务都有一个对应的policy.json文件,通过配置这个文件,实现了对User的权限管理。

另外就是还有一个角色(role)的概念,这个概念肯定都很熟悉了,是权限的集合,可以将role赋予某个user,使这个user拥有相应的权限,方便用户权限管理。policy.json文件可以在role的级别配置,不过默认的配置的角色只有admin,如果需要配置其他的角色,需要自己创建,然后在policy.json中进行配置。

接下来,看一下policy.json长什么样子:

{
"context_is_admin":  "role:admin",
"admin_or_owner":  "is_admin:True or project_id:%(project_id)s",
"default": "rule:admin_or_owner",
"compute:create": "role:admin",
"compute:create:attach_network": "",
"compute:create:attach_volume": "",
"compute:create:forced_host": "is_admin:True",
"compute:get_all": "",
......
}

policy.json有两种写法,一种是每一行写成列表形式的,另一种就是上面的例子,是写成字符串形式的,这里只说后面一种情况。

每一行可以分为两部分:冒号前面的叫做action,即用户执行的操作,冒号后面的叫rule,即用来根据当前的上下文(context),来判断前面的action是否能够由当前的user执行。policy做的主要工作,就是来解析这个rule的,要把这个字符串的rule,解析成相应的对象,在外部调用policy进行权限认证的时候,根据action映射到相应的rule对象,然后由这个对象判断是否能够执行这个action。

但是如上面的例子,像context_is_admin,admin_or_owner这样的action,怎么看都不像action,它们的确不是action,后面会讲到是怎么回事。


2. 如何实现

这部分功能的实现主要在nova/openstack/common/policy.py模块中实现,首先还是先来看看这个模块的整体结构图:


首先就是那个Rules类,它继承自dict,也就是说Rules是一个字典类型的,它的对象就是保存解析之后的policy.json文件得到的数据的,key保存的是action,value保存的是解析rule得到的对象。这个Rules对象被创建后,会赋值给模块中的_rules变量。

其次是BaseCheck体系类,它们就对应的是rule字符串解析之后得到的对象,即Rules对象的value保存的就是BaseCheck对象。这个类体系可以分为三类:

1)TrueCheck和FalseCheck:解析他们是最简单的,rule如果是空字符串或者是"@"的话,那么就直接对应的是TrueCheck对象,这个对象的返回值总为True;如果rule是"!"的话,那么就对应FalseCheck对象,总是返回False,如果rule不对应任何对象,那么它就最终对应FalseCheck对象

2)RuleCheck, RoleCheck, HttpCheck, GenericCheck:rule字符串中,冒号左边是"rule"的,都会解析成RuleCheck对象,冒号左边是"role"的都会解析成RoleCheck,冒号左边是"http"的都会解析成RoleCheck对象,如果是其他的情况,那么就对应GenericCheck对象,比如rule为is_admin:True的情况。

3)OrCheck, AndCheck, NotCheck:这些对象对应的是复合的rule,即用逻辑符号连接的几条规则,比如上面例子中的"is_admin:True or project_id:%(project_id)s",它对应的对象为OrCheck类型。上面两种情况的解析都很简单,难的就是这个复合rule的解析,费了一番功夫。上面类图中的ParseState类和ParseStateMeta类就是用来解析复合rule的。

如果不深究每条rule是怎么解析的话,看一个函数就够了,即模块中的_parse_check()函数,从这个函数中,就可以知道每条规则对应哪种对象:

# 真正的解析一个单一的rule,将它由冒号分隔开,得到kind和match,根据kind值,在_check查找对应的Check对象,
# 然后以kind,match为参数,调用Check对象的__call__()返回最终的结果:真或假
def _parse_check(rule):
    """
    Parse a single base check rule into an appropriate Check object.
    """

    # Handle the special checks
    if rule == '!':
        return FalseCheck()
    elif rule == '@':
        return TrueCheck()

    try:
        kind, match = rule.split(':', 1)
    except Exception:
        LOG.exception(_("Failed to understand rule %(rule)s") % locals())
        # If the rule is invalid, we'll fail closed
        return FalseCheck()

    # Find what implements the check
    if kind in _checks:
        return _checks[kind](kind, match)#这里竟然调用的是Check的__init__(),把kind和match赋值给Check中的kind和match
    elif None in _checks:
        return _checks[None](kind, match)
    else:
        LOG.error(_("No handler for matches of kind %s") % kind)
        return FalseCheck()
如果要深究每条rule是如何解析的话,请移步这里:

最后,再来说一下转换成的这些对象有什么用,为什么要费这么大劲转换成对象,直接用字符串的rule来判断不好吗,以及怎么用这些对象去判断用户的操作是否合法?

为什么要将字符串转换成对象?这个理由太好说了,就是为了抽象,抽象是为了方便,是为了以不变应万变,这就是面向对象的好处。比如此处的Check对象,就抽象出了kind和match成员变量,分别对应rule字符串的冒号左边和右边的内容。当用这些对象来判断用户操作是否合法时,是这样来使用的:result = _rules[action](target, creds),因为Rules类被创建后会赋值给_rules变量,所以这里的_rules变量就代表Rules对象,而Rules对象又是一个字典类型的,key是action,value是BaseCheck对象,所以就相当于是直接在调用BaseCheck对象的__call__()方法了,参数分别是target和creds,target是action要操作的目标,creds是当前的上下文环境,再结合Check对象中的kind和match,就可以根据相应的逻辑来判断这个操作是否合法了。举个简单的例子,看RoleCheck是如何来判断的:

@register("role")
class RoleCheck(Check):
    def __call__(self, target, creds):
        """Check that there is a matching role in the cred dict."""
        
        return self.match.lower() in [x.lower() for x in creds['roles']]

比如规则"role:admin",kind为"role",match为"admin",所以RoleCheck就是判断一下admin这个用户是否在creds上下文中,如果在,就返回真,不在返回假。

至于OrCheck等对象判断是否合法则更简单,在他们内部都维护了一个rules列表,存放的是每条单一规则对应的Check对象,在他们的__call__()方法中一个for循环,来判断,OrCheck为一真即真,AndCheck为一假即假。

上面还提到有些action看起来不像action的,的确,那样的规则,一般都会转换成GenericCheck对象,而RuleCheck对象的__call__()在判断用户操作是否合法时,是采用递归的方法来判断的,比如下面的例子:

"compute_extension:accounts": "rule:admin_api", #-->RuleCheck
"admin_api": "is_admin:True", #-->GenericCheck
RuleCheck对象通过递归调用,最终调用了GenericCheck对象的__call__()方法,得出最终的结果。至于,为什么要这样做,我现在还不是很清楚。


3. 如何使用

如何使用上面已经说的差不多了,在外部只要调用nova/policy.py模块中的enforce()即可:

def enforce(context, action, target, do_raise=True):
    init()#读取json文件,解析,并将解析的内容封装成一个Rules对象,然后把这个对象赋值给_rules变量

    credentials = context.to_dict()

    extra = {}
    if do_raise:
        extra.update(exc=exception.PolicyNotAuthorized, action=action)

    return policy.check(action, target, credentials, **extra)
有意思的是每次调用enfore(),都会去重新读取一次policy.json文件,并且重新进行一次解析,所以,对json文件的修改,是起实时作用的,不需要重启任何服务,修改之后,只要调用enfore()就会起作用,这很方便。


4. 测试

说了这么多,不能光说不练啊,这里还是举个创建实例的例子,通过调试的手段,来具体看一下效果。测试的过程如下:
(1)修改程序
在nova/compute/api.py中的_check_create_policies()方法中添加如下几句代码:

print '*'*30
creds=context.to_dict()
print creds['roles']
print '*'*30
raise Exception
即打印出当前上下文中的roles。然后抛出异常,停止。


(2)启动各项服务


(3)修改policy.json文件
将 "compute:create" : "" 这条规则修改为:"compute:create": "role:admin", 即将原来的任何角色的用户都可以创建实例的权限修改为只有admin角色的用户可以创建实例。


(4)创建实例,观看异常

$ source openrc demo demo
$ nova boot --flavor 1 --image 29936f2a-0e05-47e0-8d43-b9d579b107f9 --key-name pubkey-01 instance-01
ERROR: Policy doesn't allow compute:create to be performed. (HTTP 403) (Request-ID: req-bd0cda7e-2207-46af-becb-72a3a3bec598)
看,报出了异常,说policy不允许compute:create被执行,说明修改的规则生效了。

看下日志中输出的当前上下文中的角色:
******************************
[u'Member', u'anotherrole']
******************************

如果使用admin角色的用户创建实例是没有问题的。日志输出如下:
******************************
[u'admin', u'KeystoneAdmin', u'KeystoneServiceAdmin']
******************************



======================over==========================


文章另一地址: http://freedomhui.com/2012/11/openstack-nova-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86-policy/

OpenStack Nova手动部署:从控制平面到计算节点的全链路解析 OpenStack Nova是IaaS层核心计算服务,其本质是一组协同工作的Linux进程构成的分布式控制平面。理解Nova需掌握RPC通信、服务分层(api/scheduler/conductor/compute)与数据流向,而非仅依赖一键脚本。手动部署过程强制暴露底层原理:如nova-conductor隔离数据库访问以提升安全性,nova-scheduler依赖Placement API获取资源提供者(RP)实时状态,而计算节点则深度绑定libvirt、KVM与QEMU。该实践直击云基础设施的认知断层, 阅读详情

相关推荐

OpenStack之Nova分析——创建虚拟机(一)

上篇文章主要介绍了Nova API的启动流程,这篇文章我们来分析一下一个虚拟机的创建产生过程是怎样的。 由前一篇文章的分析,我们知道,处理HTTP请求的核心工作实际上都在底层的Controller对象中定义完成。Resource对象只是在Controller的基础上完成的封装,用来实现数据的序列化和反序列化。Controller类中,处理虚拟机创建请求的方法是create,该方法最终调用了Com

仇晗的专栏 3878

openstack policy机制

一、什么是policy policy策略,是OpenStack用来约束不同等级用户的操作权限,用于自定义权限管理的一种机制。 二、为什么要用policy 1、基于keystone理解policy Keystone中有User(用户)、Project(租户)、role(角色)三个概念,使用基本流程为: 1)创建租户 2)创建用户 3)创建角色 4)给用户和租户赋予角色 赋予角色之后,角色还只是一个空的概念定义,没有实际意义。真正限制用户角色执行具体action操作的,是policy.json.

wuyongpeng的专栏 2768

OpenStack Nova手动安装:从源码编译到生产就绪的完整指南

OpenStack Nova是云平台的核心计算服务,本质是一套强耦合、高依赖的分布式服务集群,而非独立可执行软件。其运行原理依赖Keystone认证、Glance镜像、Neutron网络、Cinder存储及Placement资源调度五大协同组件,技术价值在于提供虚拟机全生命周期管理能力与硬件资源抽象能力。典型应用场景包括信创环境私有云部署、GPU直通定制化云节点、离线可控云平台建设等。本文聚焦Nova服务端的手动安装实践,深入解析Python版本约束(3.9–3.11)、MySQL/PostgreSQL数据

weixin_33829657的博客 559

nodejs 调用openstack api keystone 登录认证 (三):测试获取所有的 images

获取所有的images 列表: function image_server(x_subject_token) { var options = { host: 'xxx.xx.xxx.xx', port: 9292, path: '/v2/images', method: 'GET', headers: ...

shunzi2016的博客 586

Apifox CLI + Claude Skills:将接口自动化测试融入ai

基于 Apifox CLI、Claude Code以及Claude Skills组合,实现自然语言触发接口自动化测试。

wwz_0012的博客 598

一文带你了解SOA接口测试

了解汽车电子行业的人,近几年可能经常见到一个词“SOA”,那SOA具体是什么?作为测试人员应该要测试哪些内容呢?这篇文章就简单给大家介绍一下。SOA(Service Oriented Architecture)是一种面向服务的架构,最早应用于IT行业,虽然行业内对于SOA的定义没有一个统一的描述,但是总体而言,SOA把功能定义成为服务,服务带有明确的可调用接口,并可以通过网络调用。在汽车领域,对于高性能计算平台而言,为了实现域控制器以及区域控制器之间的互联互通和软硬分离、缩短开发周期等优势,也引入了SOA的

怿星科技的博客 7156

Policy doesn't allow compute_extension:simple_tenant_usage:show to be performed. (HTTP 403)

openstack中keystone组建在认证用户的时候出现以上错误信息。 原因:用户名中包含有 ‘.’

韦远科的专栏 3370

RS485/CAN总线防护电路设计:TVS选型与ESD防护实战解析

本文深入解析了RS485与CAN总线防护电路设计中的TVS选型与ESD防护实战技巧。针对工业现场常见的静电放电、浪涌等干扰,文章详细阐述了TVS管关键参数的选择、多级防护体系的构建,并特别强调了在隔离电路设计中地回路处理的重要性,帮助工程师设计出更可靠的通信接口。

metaverse5vr的博客 389

openstack policy 鉴权过程分析

转:http://blog.chinaunix.net/uid-20940095-id-4144300.html 1. openstack 鉴权简单介绍 众所周知,openstack通过keystone用来完成authenticate(认证),真正的鉴权(authorize)是在各个模块分别做的,具体实现为每个模块都有一个policy文件,叫policy.json,里面定义了鉴权用的...

weixin_30756499的博客 467

【Matlab 传感器布局优化】基于群智能算法的wsn覆盖优化研究

本文主要是对同构和异构传感器在指定空间内的布局进行优化,以最大覆盖率为目标,使用了DBO/SCA/WOA/SSA/NOA等启发式算法,在100x100的空间内,对30,100,200个传感器进行优化,得到最优的布局位置和对应覆盖率。

u013367499的博客 1818

无人机飞控传感器全解析:从IMU到光流传感器的实战应用

本文深入解析了无人机飞控系统的核心传感器,从IMU、气压计、磁力计到光流传感器,详细阐述了其工作原理、数据融合策略及常见挑战。结合ICF5、Pixhawk 6C等主流飞控硬件,提供了从传感器校准、滤波器调优到应对室内光流定位、强磁干扰等实战场景的系统性优化指南,帮助开发者突破飞控“黑箱”,实现更稳定、可靠的飞行控制。

weixin_28396629的博客 169

天翼云从业认证(3.2)天翼云存储产品

了解天翼云存储产品,包括对象存储、云硬盘、云硬盘备份、云主机备份和云存储网关的定义、功能、操作以及应用场景;

康雨城 3695

Python时间序列:PaddleTS-时间序列分类

评估的指标采用F1,Precision,Recall,PaddleTS已经基于TSDataset实现了这三个指标的计算,直接调用即可。使用内置的API:get_dataset加载BasicMotions数据集。模型训练完成之后,可以对测试集进行预测并评估。模型保存之后,可以加载模型用于新的数据预测。可以将训练完成的模型保存到指定路径。概率预测 可以返回每个分类的概率。安装paddlets。

斌擎科技 1293

openstack nova 基础知识——policy【转载】

深度好文,值得一看,原文链接如下: http://blog.youkuaiyun.com/hackerain/article/details/8241691 1. 首先还是先来了解一下什么是policy,它是用来做什么的 在openstack的用户管理中,有三个概念:Users, Tenants, Roles。简单来说,policy就是用来控制某一个User在某个Tenant

mathsYouth的专栏 646

【图像去噪】基于梯度为0法实现图像去噪附matlab代码

近几年,徐立提出的 L0 梯度最小化模型在图像平滑领域得到了广泛的应用和发展[11]. 和以往的局部滤波模型不同的是该模型可以全局的估计图像的像素值,因此,L0 梯度最小化模型在处理图像的同时能够很好的保护图像的边缘.​。

qq_59747472的博客 185

Simulink实例--电动汽车充电站与微电网协同运行仿真

​电网负荷剧增:单站1000台车同时充电需150MW功率(超配电网容量30%)​能源孤岛问题:传统充电站仅作为单向负荷,无法参与电网调频​可再生能源消纳:光伏/风电波动导致充电站功率波动±40%​多目标矛盾:充电效率、电网稳定性、设备寿命的协同优化​节能效果:每百万辆车年节电1.8GWh​成本回收:投资回报周期<4年(IRR>25%)​减排效益:每年减少CO₂排放12万吨。

xiaoheshang_123的博客 330

OpenStack Nova手动安装配置实战:控制节点部署详解

Nova是OpenStack计算服务的核心组件,负责虚拟机调度、生命周期管理和资源协调。其工作原理基于REST API接入、消息队列异步通信、数据库状态持久化与多进程协同(api/scheduler/conductor/novncproxy)四大机制。掌握Nova的手动安装与配置,不仅能深入理解云平台底层资源编排逻辑,更能提升私有云运维、高可用加固及故障根因定位能力。典型应用场景包括金融、政务等对稳定性与可审计性要求严苛的生产环境,以及OpenStack二次开发与定制化集成项目。本文聚焦于CentOS 8

weixin_30430169的博客 317

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OpenStack Nova与Keystone信任机制深度解析

OpenStack是典型的分布式云平台,其核心在于服务间安全可信的协作。Nova(计算服务)与Keystone(身份认证服务)的交互并非简单API调用,而是基于PKI、RBAC和Token生命周期管理构建的信任委托体系。理解这一机制,是掌握云平台权限控制、服务发现与安全加固的基础能力。它直接关联token验证失败、401/403错误、服务目录不可达等高频排障场景,广泛应用于高校实训、私有云部署及云原生架构迁移。本文聚焦Keystone配置中Fernet密钥同步、Service Catalog协议一致性、Do

weixin_38166557的博客 398

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OpenStack Nova服务端手动安装与配置指南

OpenStack Nova是云计算平台的核心计算服务,负责虚拟机全生命周期管理。其本质是一套基于Python的分布式服务组件,依赖Keystone认证、MySQL数据库、RabbitMQ消息队列及libvirt虚拟化层。理解Nova服务端(非CLI客户端)的架构原理,对私有云部署、故障排查和安全合规至关重要。技术价值体现在高度可控性、深度定制能力与生产级可调试性,广泛应用于金融、政务、边缘计算等需强审计与内核适配的场景。本文聚焦Nova服务端的手动部署实践,覆盖环境准备、源码安装、配置详解与服务注册全流程

virusswb的专栏 411

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

新增Nova Restful 接口

新增Nova Restful 接口一、自定义接口1.新增controller文件2.新增controller类3.参数校验4.定义controller5.返回结果6.policy二、调试 一、自定义接口 1.新增controller文件 /nova/api/openstack/compute/ 下新增文件,这里以 myext.py 为例,如下图 2.新增controller类 3.参数校验 4...

SuhaZc的博客 860
上一篇: python——metaclass
下一篇: policy机制中经典的python用法
hackerain
博客等级 码龄16年 753粉丝 220原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值