ABAC(Attribute-Based Access Control)即基于属性的访问控制,是一种较为灵活和细粒度的访问控制模型。下面为你详细介绍 ABAC 模型:
核心概念
- 主体(Subject):发起访问请求的实体,像用户、进程等。主体具备多种属性,例如用户的角色、部门、职位等。
- 客体(Object):被访问的资源,例如文件、数据库记录、网络服务等。客体也有属性,比如文件的类型、机密等级等。
- 环境(Environment):访问发生时的环境条件,像时间、地点、网络状况等。
- 属性(Attribute):描述主体、客体和环境的特征信息,是 ABAC 模型的关键要素。属性能够是静态的,也可以是动态的。
- 策略(Policy):依据主体、客体和环境的属性来定义访问规则,确定是否准许访问。策略可以用自然语言、策略描述语言或者代码来表达。
工作原理
- 属性收集:在访问请求发起时,系统收集主体、客体和环境的属性信息。
- 策略评估:系统把收集到的属性信息与预先定义的策略进行比对,评估是否满足访问条件。
- 访问决策:依据策略评估的结果,系统做出访问决策,即准许或者拒绝访问请求。
示例策略
和他们了假设存在如下属性和策略:
主体属性:用户角色(管理员、普通用户)
客体属性:文件机密等级(公开、内部、机密)
环境属性:访问时间(工作日 9:00 - 18:00)
策略可以定义为:“仅当用户角色为管理员,且文件机密等级为机密,
同时访问时间处于工作日 9:00 - 18:00 时,才允许访问该文件。”
优势
- 灵活性:可以依据各种属性灵活定义访问策略,适应不同的业务需求。
- 细粒度控制:能够实现对资源的细粒度访问控制,精确到单个用户、单个资源。
- 动态性:可以根据实时的属性信息动态调整访问策略,提高安全性。
劣势
- 复杂性:属性和策略的管理较为复杂,需要专业的知识和工具。
- 性能开销:策略评估需要收集和处理大量的属性信息,可能会带来一定的性能开销
示例
// 定义主体、客体和环境属性
const subject = {
role: "管理员"
};
const object = {
classification: "机密"
};
const environment = {
time: "2025-04-11 10:00"
};
// 定义策略
function policy(subject, object, environment) {
// 检查主体角色
if (subject.role!== "管理员") {
return false;
}
// 检查客体机密等级
if (object.classification!== "机密") {
return false;
}
// 检查访问时间
const accessTime = new Date(environment.time.replace(' ', 'T'));
const weekday = accessTime.getDay();
const hour = accessTime.getHours();
if (weekday === 0 || weekday === 6 || hour < 9 || hour >= 18) {
return false;
}
return true;
}
// 进行访问决策
if (policy(subject, object, environment)) {
console.log("访问被允许");
} else {
console.log("访问被拒绝");
}