编程实现基于属性的访问控制模型ABAC 策略管理部分设计思想 创建主体S、客体O、环境E、操作O的集合并写入数据库(文本数据库)。 创建访问控制策略:关于主体属性的规则、客体属性的规则、环境属性的规则的组合,加上操作,如: ct>.其中:p=<SR,OR,ER,op,effect>.其 SR=(sa1^sa2)v sa3 OR =(oa1Voa2)^oa3^o4 ER=(ea1^ea2^ea3)vea4 effect E{permit,deny) 访问控制决策设计思想 ·可信引用监控器启用,接收用户对权限的访问请求,如request=(SA,OA,EA,op), ·进行决策,决策结果为:允许或拒绝。 ·可信引用监控器参照策略库进行决策。 ·关于ABAC的元策略: ·出现冲突时拒绝优先; ·缺乏匹配的策略时默认决策为拒绝。
时间: 2023-06-16 15:07:22 浏览: 99
在实现基于属性的访问控制模型ABAC的策略管理部分时,我们需要设计一个数据库来存储主体S、客体O、环境E、操作O的集合。这个数据库可以使用文本数据库,比如SQLite。
我们可以为每个主体S、客体O、环境E、操作O定义一些属性,例如主体S的属性可以包括角色、部门、所在地等,客体O的属性可以包括类型、所属组织、机密级别等,环境E的属性可以包括时间、地点、网络连接状态等。
对于访问控制策略的设计,我们需要定义关于主体属性的规则、客体属性的规则、环境属性的规则的组合,加上操作。我们可以使用如下格式来表示访问控制策略:
p = <SR, OR, ER, op, effect>
其中,SR表示主体属性规则,OR表示客体属性规则,ER表示环境属性规则,op表示操作,effect表示访问控制效果,可以是permit或deny。
在访问控制决策的设计中,我们可以使用可信引用监控器来接收用户对权限的访问请求,例如request = (SA, OA, EA, op)。然后,可信引用监控器可以参照策略库进行决策,决策结果为允许或拒绝。
在ABAC的元策略中,我们可以定义一些规则来处理特殊情况。例如,当出现冲突时,我们可以定义拒绝优先。当缺乏匹配的策略时,默认决策为拒绝。这些规则可以帮助我们更好地管理访问控制策略,并确保系统的安全性。
相关问题
编程实现基于属性点访问控制模型ABAC,条件:创建主体S,客体O,环境E,操作O的集合并写入数据库,创建访问控制策略,可信应用监控器启用,接收用户对权限的访问请求,进行决策,决策结果为拒绝或运行,出现冲突时拒绝优先,缺乏匹配的策略时默认决策为拒绝
ABAC模型(Attribute-Based Access Control)是一种基于属性的访问控制模型,可以根据主体、客体和环境的属性来进行访问控制决策。下面是一个基于属性点访问控制模型ABAC的Python实现,包括创建主体S、客体O、环境E,操作O的集合并写入数据库,创建访问控制策略,可信应用监控器启用,接收用户对权限的访问请求,进行决策等功能。
首先,我们需要安装一些Python库,包括flask、sqlalchemy和pyyaml,我们可以使用pip install命令进行安装。
```python
pip install flask sqlalchemy pyyaml
```
接下来,我们创建一个名为abac的Python包,并在其中创建如下几个文件:
- database.py:用于创建数据库和表格,以及向表格中添加数据。
- model.py:用于定义主体、客体、环境和操作的模型,以及定义访问策略和请求的模型。
- policy.py:用于创建和管理访问策略。
- decision.py:用于进行访问控制决策,并返回决策结果。
database.py:
```python
from flask_sqlalchemy import SQLAlchemy
from model import Subject, Object, Environment, Operation
db = SQLAlchemy()
def create_database():
db.create_all()
def add_subject(name, attributes):
subject = Subject(name=name, attributes=attributes)
db.session.add(subject)
db.session.commit()
def add_object(name, attributes):
object = Object(name=name, attributes=attributes)
db.session.add(object)
db.session.commit()
def add_environment(name, attributes):
environment = Environment(name=name, attributes=attributes)
db.session.add(environment)
db.session.commit()
def add_operation(name, attributes):
operation = Operation(name=name, attributes=attributes)
db.session.add(operation)
db.session.commit()
```
model.py:
```python
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
db = SQLAlchemy()
class Subject(db.Model):
__tablename__ = 'subjects'
id = Column(Integer, primary_key=True)
name = Column(String(50))
attributes = Column(String(1000))
class Object(db.Model):
__tablename__ = 'objects'
id = Column(Integer, primary_key=True)
name = Column(String(50))
attributes = Column(String(1000))
class Environment(db.Model):
__tablename__ = 'environments'
id = Column(Integer, primary_key=True)
name = Column(String(50))
attributes = Column(String(1000))
class Operation(db.Model):
__tablename__ = 'operations'
id = Column(Integer, primary_key=True)
name = Column(String(50))
attributes = Column(String(1000))
class Policy(db.Model):
__tablename__ = 'policies'
id = Column(Integer, primary_key=True)
subject_id = Column(Integer, ForeignKey('subjects.id'))
object_id = Column(Integer, ForeignKey('objects.id'))
environment_id = Column(Integer, ForeignKey('environments.id'))
operation_id = Column(Integer, ForeignKey('operations.id'))
effect = Column(String(10))
subject = relationship("Subject")
object = relationship("Object")
environment = relationship("Environment")
operation = relationship("Operation")
class Request():
def __init__(self, subject_attributes, object_attributes, environment_attributes, operation_attributes):
self.subject_attributes = subject_attributes
self.object_attributes = object_attributes
self.environment_attributes = environment_attributes
self.operation_attributes = operation_attributes
```
policy.py:
```python
import yaml
from model import Policy, Request, Subject, Object, Environment, Operation
from sqlalchemy import or_
def create_policy(subject_name, object_name, environment_name, operation_name, effect):
policy = Policy(subject=Subject.query.filter_by(name=subject_name).first(),
object=Object.query.filter_by(name=object_name).first(),
environment=Environment.query.filter_by(name=environment_name).first(),
operation=Operation.query.filter_by(name=operation_name).first(),
effect=effect)
db.session.add(policy)
db.session.commit()
def load_policies(file_path):
with open(file_path, 'r') as f:
policies = yaml.load(f, Loader=yaml.FullLoader)
for policy in policies:
create_policy(policy['subject'], policy['object'], policy['environment'], policy['operation'], policy['effect'])
def check_request(request):
policies = Policy.query.filter_by(subject_id=request.subject_attributes['id'],
object_id=request.object_attributes['id'],
operation_id=request.operation_attributes['id']).all()
for policy in policies:
if eval(policy.environment.attributes + '\n' + policy.subject.attributes + '\n' + policy.object.attributes):
return policy.effect
return 'deny'
```
decision.py:
```python
from model import Request
from policy import check_request
def access_control(subject_attributes, object_attributes, environment_attributes, operation_attributes):
request = Request(subject_attributes, object_attributes, environment_attributes, operation_attributes)
return check_request(request)
```
最后,我们编写一个简单的Flask应用程序,用于创建数据库、添加主体、客体、环境和操作,以及对访问请求进行访问控制决策。在启动应用程序之前,请确保已经创建了数据库,并且已经添加了主体、客体、环境和操作。
```python
from flask import Flask, request, jsonify
from database import create_database, add_subject, add_object, add_environment, add_operation
from model import Subject, Object, Environment, Operation
from decision import access_control
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///abac.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
create_database()
add_subject('Alice', '{"role": "admin", "department": "finance"}')
add_subject('Bob', '{"role": "user", "department": "sales"}')
add_object('file', '{"type": "confidential", "owner": "Alice"}')
add_object('database', '{"type": "public", "owner": "Bob"}')
add_environment('time', '{"hour": 9}')
add_operation('read', '{"type": "read"}')
add_operation('write', '{"type": "write"}')
@app.route('/access_control', methods=['POST'])
def access_control_endpoint():
subject_attributes = request.json['subject_attributes']
object_attributes = request.json['object_attributes']
environment_attributes = request.json['environment_attributes']
operation_attributes = request.json['operation_attributes']
result = access_control(subject_attributes, object_attributes, environment_attributes, operation_attributes)
return jsonify({'result': result})
if __name__ == '__main__':
app.run(debug=True)
```
现在,我们可以使用POST请求调用/access_control端点,并传递主体、客体、环境和操作的属性,以获取访问控制决策结果。
利用python编程实现基于属性的访问控制模型ABAC包括:主体S,客体O,环境E,操作O的集合并写入数据库,主体客体环境属性各有10个,每一个策略中主体,客体环境相关的规则由3-5个属性的布尔表达式组成(随机生成),策略个数共有10000个(正授权5000个,负授权5000个)随机生成,随机生成10000进行决策,记录决策结果。策略库是文本数据库,请求也是文本。
好的,我可以帮你回答这个问题。首先,你需要安装 Python 和相关的数据库模块,比如 SQLite3。然后,你可以创建一个 Python 脚本来实现这个基于属性的访问控制模型 ABAC。
以下是代码示例:
```python
import sqlite3
import random
# 定义主体、客体、环境属性
subjects = ['subject1', 'subject2', 'subject3', 'subject4', 'subject5', 'subject6', 'subject7', 'subject8', 'subject9', 'subject10']
objects = ['object1', 'object2', 'object3', 'object4', 'object5', 'object6', 'object7', 'object8', 'object9', 'object10']
environments = ['environment1', 'environment2', 'environment3', 'environment4', 'environment5', 'environment6', 'environment7', 'environment8', 'environment9', 'environment10']
# 定义策略库
policies = []
for i in range(10000):
policy = {}
policy['name'] = 'policy' + str(i)
policy['subject'] = {}
for j in range(random.randint(3, 5)):
attribute = random.choice(subjects)
value = random.choice([True, False])
policy['subject'][attribute] = value
policy['object'] = {}
for j in range(random.randint(3, 5)):
attribute = random.choice(objects)
value = random.choice([True, False])
policy['object'][attribute] = value
policy['environment'] = {}
for j in range(random.randint(3, 5)):
attribute = random.choice(environments)
value = random.choice([True, False])
policy['environment'][attribute] = value
policy['authorized'] = bool(i < 5000)
policies.append(policy)
# 将策略库写入数据库
conn = sqlite3.connect('policies.db')
c = conn.cursor()
c.execute('CREATE TABLE policies (name TEXT, subject TEXT, object TEXT, environment TEXT, authorized INTEGER)')
for policy in policies:
subject = str(policy['subject']).replace("'", '"')
obj = str(policy['object']).replace("'", '"')
env = str(policy['environment']).replace("'", '"')
authorized = 1 if policy['authorized'] else 0
c.execute(f"INSERT INTO policies VALUES ('{policy['name']}', '{subject}', '{obj}', '{env}', {authorized})")
conn.commit()
# 生成请求并进行决策
decisions = []
for i in range(10000):
request = {}
request['subject'] = {}
for j in range(len(subjects)):
request['subject'][subjects[j]] = bool(random.getrandbits(1))
request['object'] = {}
for j in range(len(objects)):
request['object'][objects[j]] = bool(random.getrandbits(1))
request['environment'] = {}
for j in range(len(environments)):
request['environment'][environments[j]] = bool(random.getrandbits(1))
query = "SELECT authorized FROM policies WHERE "
for attribute, value in request['subject'].items():
query += f"subject LIKE '%{attribute}:{value}%' AND "
for attribute, value in request['object'].items():
query += f"object LIKE '%{attribute}:{value}%' AND "
for attribute, value in request['environment'].items():
query += f"environment LIKE '%{attribute}:{value}%' AND "
query = query[:-5]
c.execute(query)
result = c.fetchone()
decision = True if result and result[0] == 1 else False
decisions.append(decision)
# 关闭数据库连接
conn.close()
# 输出决策结果
print(decisions)
```
这段代码会生成一个包含 10000 个请求的列表,其中每个请求都包括主体、客体和环境的属性。然后,它会从策略库中查找与请求匹配的策略,并根据策略中的授权信息做出决策。最后,它会输出一个包含 10000 个决策结果的列表。
请注意,这段代码只是一个示例,你需要根据自己的需求进行修改和完善。同时,你需要在自己的电脑上安装 Python 和 SQLite3,并且创建一个名为 policies.db 的数据库文件。
阅读全文
相关推荐










