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

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 560

阿里云百炼平台创建智能体-上传文档

阿里云百炼智能体-上传文档文件

weixin_43930851的博客 1357

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

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

韦远科的专栏 3370

FreeModbus源码详解

本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信; 1:demo.c中三个函数,完成协议栈的准备工作; eMBInit()函数:(mb.c) /*函数功能: *1:实现RTU模式和ASCALL模式的协议栈初始化; *2

2万+

openstack policy 鉴权过程分析

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

weixin_30756499的博客 467

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2500

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

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

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

康雨城 3695

YOLOv8改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新150多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-24。项目介绍在大家购买专栏后,加入学

Limiiiing的博客 1万+

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

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

mathsYouth的专栏 646

Python 爬虫实战:爬取股票数据做 K 线图可视化

摘要:本文介绍基于Python的股票数据爬取与K线图可视化全流程技术方案。通过Requests库抓取东方财富网股票数据,使用Pandas进行清洗处理,并利用mplfinance库实现专业K线图绘制。文章详细讲解了数据爬取接口分析、反爬策略配置、K线图绘制方法(包含基础K线图和带均线的进阶版本),以及核心统计指标计算。该方案可应用于股票价格趋势分析,为投资决策提供数据支持,同时强调了数据使用的合规性和技术优化方向。

2503_91057718的博客 2049

基于YOLOv11的农作物病虫害检测系统设计与实现

我们使用公开的IP102病虫害数据集作为基础,该数据集包含102种病虫害类别,覆盖水稻、小麦、玉米等多种主要农作物。图像数量:75,222张类别数:102图像分辨率:从640×480到4000×3000不等标注格式:PASCAL VOC格式此外,我们还收集了部分田间实际拍摄的图像以增强模型泛化能力。

YOLO 595

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

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

weixin_30430169的博客 317

WINCC7.3破解文件

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

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

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

weixin_38166557的博客 398

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

virusswb的专栏 411

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

新增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、付费专栏及课程。

余额充值