【问题标题】:how to implement attribute base access control in python based web application?如何在基于 Python 的 Web 应用程序中实现基于属性的访问控制?
【发布时间】:2020-09-11 02:29:46
【问题描述】:

我有一个用 python(django REST 框架)编写的 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!  

【问题讨论】:

标签: python django rest xacml abac


【解决方案1】:

我没有使用 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 上查看 list。

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 2021-05-05
    • 2020-12-12
    • 2013-10-31
    • 2012-05-04
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多