繁体   English   中英

如何在基于python的Web应用程序中实现属性基础访问控制?

[英]how to implement attribute base access control in python based web application?

我有一个用 python(django REST framework)编写的 web 应用程序,现在我想在我的 web 应用程序上实现基于属性的访问控制(ABAC)进行授权,我如何在这个应用程序上实现 ABAC 策略(我可以使用 XACML 策略吗(如何使用在 python web 应用程序上实现 xacml )或者有没有其他方法可以在 python 上编写 ABAC 策略以及如何在我的 web 应用程序上实现)我可以使用 py-ABAC 以及如何使用它吗?

import vakt
from vakt.rules import Eq, Any, StartsWith, And, Greater, Less

policy = vakt.Policy(
    123456,
    actions=[Eq('fork'), Eq('clone')],
    resources=[StartsWith('repos/Google', ci=True)],
    subjects=[{'name': Any(), 'stars': And(Greater(50), Less(999))}],
    effect=vakt.ALLOW_ACCESS,
    context={'referer': Eq('https://github.com')},
    description="""
    Allow to fork or clone any Google repository for
    users that have > 50 and < 999 stars and came from Github
    """
)
storage = vakt.MemoryStorage()
storage.add(policy)
guard = vakt.Guard(storage, vakt.RulesChecker())

inq = vakt.Inquiry(action='fork',
                   resource='repos/google/tensorflow',
                   subject={'name': 'larry', 'stars': 80},
                   context={'referer': 'https://github.com'})

assert guard.is_allowed(inq)
Or if you prefer Amazon IAM Policies style:

import vakt
from vakt.rules import CIDR

policy = vakt.Policy(
    123457,
    effect=vakt.ALLOW_ACCESS,
    subjects=[r'<[a-zA-Z]+ M[a-z]+>'],
    resources=['library:books:<.+>', 'office:magazines:<.+>'],
    actions=['<read|get>'],
    context={
        'ip': CIDR('192.168.0.0/24'),
    },
    description="""
    Allow all readers of the book library whose surnames start with M get and read any book or magazine,
    but only when they connect from local library's computer
    """,
)
storage = vakt.MemoryStorage()
storage.add(policy)
guard = vakt.Guard(storage, vakt.RegexChecker())

inq = vakt.Inquiry(action='read',
                   resource='library:books:Hobbit',
                   subject='Jim Morrison',
                   context={'ip': '192.168.0.220'})

assert guard.is_allowed(inq)

Thanks in advance!  

我没有使用 Py-ABAC 的经验,但通常 XACML 是用 XACML(一种基于 XML 的语言)编写的,或者使用 GUI 或编译成 XACML 的语言(如 ALFA)编写。

然后,您的 Python Web 应用程序将使用 REST 或 SOAP(最好是 REST)调用策略决策点 (PDP)。 您可以使用像请求这样的 HTTP 库。

示例 JSON:

{"Request":{"AccessSubject":
{"Attribute":
[ {"AttributeId":"user.name","Value":"alice"} ]
},
"Resource":
{"Attribute":
[ {"AttributeId":"resource.objectType","Value":"insurance claim"} ]
},
"Action":
{"Attribute":
[ {"AttributeId":"action-id","Value":"view"}]
}
}
}

我是否提到过(至少对我而言)制作自己的授权引擎 (PDP) 并不完全可取? 有的产品已经实现了外部化授权......

使用开源产品,如 WSO2 或 AuthzForce,或购买 Axiomatics 之类的产品(完全披露:我曾经在这里工作)。

有关 XACML 实现的完整列表,您可以在 Wikipedia 上查看此列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM