使用OPA作为客户的烧瓶扩展

Flask-OPA的Python项目详细描述


烧瓶OPA

Build StatuscodecovPyPI Version

简单易用的Flask扩展允许您使用 Open Policy Agent。它允许

  • http api授权
  • 策略强制点(aop在方法上使用decorators)

快速启动

建议您尝试包examples中的应用程序。感谢Makefile,您可以运行演示项目 使用以下命令

 make demo   

它是怎么工作的?

为了更好地理解make demo的作用以及如何在项目中设置flask_opa,请按照 下一步:

  1. 在服务器模式下运行opa

    • 检查latest OPA release并下载它。
    • 将二进制文件放在系统的路径中
    • 允许使用类似chmod 755 ./opa
    • 的命令执行它
    • 使用示例策略在服务器模式下运行opa
    opa run -s -w examples
    
    • -s是在服务器模式下运行它,而不是打开repl
    • -w用于监视数据/策略文件的更改
  2. 指定配置变量

    • OPA_URL在运行的opa服务器中可访问的url,用于评估输入。它包括 政策,例如http://localhost:8181/v1/data/examples/allow

    • OPA_SECURED布尔值指定是否将对应用程序启用opa。

    有关详细信息,请参见rest api reference

  3. 将opa类绑定到烧瓶应用程序

    很容易将烧瓶opa库绑定到应用程序。只需执行以下步骤:

  4. 创建opa实例

    app=Flask(__name__)app.config.from_pyfile('app.cfg')opa=OPA(app,parse_input)

    让我们看看传递给opa类的参数:

    • parse_input(必需)包含返回要由策略计算的输入数据json的方法,例如:
    {"input":{"method":"GET","path":["data","jon"],"user":"paul"}}
    • url(可选)使用特定的url,而不是应用程序配置中指定的OPA_URL
    • allow_function(可选)谓词,用于确定来自opa的响应是否允许(true)或拒绝(false)请求

    如果要在应用程序中强制实施opa安全性,可以创建如下opa实例:

    opa=OPA.secure(app,parse_input,url="http://localhost:8181/v1/data/package_name/allow")

    opa=OPA(app,parse_input,url="http://localhost:8181/v1/data/package_name/allow").secured()

    否则,只有当OPA_SECUREDTrue时,opa才会强制您的安全性。

    如果要使用

    app.logger.setLevel(logging.DEBUG)
  5. 运行烧瓶应用程序。

政策执行点

这个模块提供的特性之一是Policy Enforcement Point,它基本上允许您确保策略 在你申请的任何方法。 出于实际目的,让我们设想一个示例方法,它负责记录与 用户。在这种情况下,我们必须创建不同的输入函数,为某些策略提供有用的信息 将决定是否应将日志发送到远程服务器。假设这样的日志记录方法如下:

deflog_remotely(content):# Imagine a code to log this remotelyapp.logger.info("Logged remotely: %s",content)

为了修饰它,我们将使用OPA实例作为函数(可调用模式)创建一个PEP装饰器。 这些参数与用于保护应用程序的参数几乎相同。结果实例将修饰 我们感兴趣的功能:

defvalidate_logging_input_function(*arg,**kwargs):return{"input":{"user":request.headers.get("Authorization",""),"content":arg[0]}}secure_logging=app.opa("Logging PEP",app.config["OPA_URL_LOGGING"],validate_logging_input_function)@secure_loggingdeflog_remotely(content):# Imagine a code to log content remotelyapp.logger.info("Logged remotely: %s",content)

正如您可能已经注意到的,添加PEP真正需要的新功能是一个新的输入函数。这个 函数可以提供比为整个应用程序创建的OPA实例使用的输入更通用的输入: 示例它提供与用户请求相关的数据,以及由修饰函数的参数提供的数据 好。

阅读examples README了解有关如何运行演示的详细信息。

生成文件

makefile包含您可能需要的多个有用操作。用

 make help

状态

预发行版或beta版:该项目已经经历了多轮的积极开发,目标是 稳定的租赁版本,但还没有。

发展道路:积极(2018年10月31日)

作者

埃利埃·埃尔南德斯·加贝

链接

许可证

这个项目是在麻省理工学院的许可下授权的-请参阅LICENSE.md文件了解详细信息。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java很难找到时间复杂性   性能如何查看我的Java进程现在正在做什么?   即使添加了jar文件,eclipse也无法编译java项目?   java JOOQ强制类型将POSTGRES的BigInteger转换为BigDecimal   具有适当复数的Java国际化(i18n)   Java:修复内存泄漏   Java主类实例访问   java在片段中被压回运行主活动中的函数   java在没有ant的情况下从控制台构建eclipse项目   java有可能不升级到JDK 9吗?   每个文件的java增量   服务器和客户端的tcp客户端数量因Java NIO而异   java如何膨胀合并   有没有工具可以检查我在Java中使用的包中的方法?   java限制google使用改型将查询自动完成放在一个国家   java如何按值而不是位置将项目添加到ADTSorted列表   java我想更改单击的任何按钮的大小   java为什么我们可以在类加载之前使用新操作符   继承,子类,使用超级打印。Java中的print()