访问控制是信息安全工程师考试(软考中级)的核心考点之一。无论是上午的选择题,还是下午的案例分析,“谁能访问什么资源”(Who can access What)都是安全体系设计的基石。
很多考生对抽象的访问控制模型(如BLP、Biba)感到头疼,其实只要理解了"读"和"写"的规则,配合代码模拟一下,这些模型就变得非常直观。下面我将从模型、策略和真题三个维度,帮你系统梳理这一块内容。
一、 访问控制模型:从DAC到MAC
访问控制模型主要解决"权限如何分配"的问题。考试中常考三种经典模型:
1. 自主访问控制(DAC)
核心逻辑:资源的所有者可以自主决定谁能访问该资源。
典型场景:Windows/Linux的文件权限(chmod/chown)。
优缺点:灵活性好,但安全性低,容易受到特洛伊木马攻击。
2. 强制访问控制(MAC)
核心逻辑:系统强制执行安全策略,用户无法自行改变权限。基于安全标签(如绝密级、机密级)进行判断。
典型场景:军事系统、SELinux。
优缺点:安全性极高,但灵活性差,管理成本高。
重点模型:
- BLP模型:侧重保密性。规则:不向上读,不向下写。
- Biba模型:侧重完整性。规则:不向下读,不向上写。
3. 基于角色的访问控制(RBAC)
核心逻辑:权限分配给角色,用户被分配到角色,用户通过角色获得权限。
典型场景:企业ERP系统、OA系统。
二、 策略实战:用代码模拟BLP模型
BLP模型是考试的重难点。为了帮你彻底搞懂"简单安全属性"(不向上读)和"*-属性"(星号属性,不向下写),我用Python写了一个简单的模拟器。
BLP模型代码模拟
python
复制
class Subject:
"""代表用户/进程"""
def __init__(self, name, clearance):
self.name = name
self.clearance = clearance # 安全级别:L=Low, H=High
class Object:
"""代表文件/资源"""
def __init__(self, name, classification):
self.name = name
self.classification = classification # 密级:L=Low, H=High
class BLP_System:
"""强制访问控制系统(BLP模型)"""
def __init__(self):
self.subjects = []
self.objects = []
# 定义安全级别的层级关系
self.level_map = {'L': 0, 'H': 1}
def check_read(self, subject, object):
"""
简单安全属性:不向上读
主体级别 >= 客体级别 才能读
"""
subject_level = self.level_map[subject.clearance]
object_level = self.level_map[object.classification]
if subject_level >= object_level:
print(f"[+] 读操作允许: {subject.name}({subject.clearance}) 读取 {object.name}({object.classification})")
return True
else:
print(f"[-] 读操作拒绝: {subject.name}({subject.clearance}) 尝试读取 {object.name}({object.classification})")
print(" 原因: 违反 '不向上读' 规则")
return False
def check_write(self, subject, object):
"""
*-属性(星号属性):不向下写
主体级别 <= 客体级别 才能写
"""
subject_level = self.level_map[subject.clearance]
object_level = self.level_map[object.classification]
if subject_level <= object_level:
print(f"[+] 写操作允许: {subject.name}({subject.clearance}) 写入 {object.name}({object.classification})")
return True
else:
print(f"[-] 写操作拒绝: {subject.name}({subject.clearance}) 尝试写入 {object.name}({.object.classification})")
print(" 原因: 违反 '不向下写' 规则")
return False
# 测试 BLP 模型
if __name__ == "__main__":
blp = BLP_System()
# 创建主体:Alice(高级别), Bob(低级别)
alice = Subject("Alice", "H") # High
bob = Subject("Bob", "L") # Low
# 创建客体:SecretFile(高级别), PublicFile(低级别)
secret_doc = Object("SecretFile", "H")
public_doc = Object("PublicFile", "L")
print("=== 场景 1: Bob(L) 试图读取 SecretFile(H) ===")
blp.check_read(bob, secret_doc) # 拒绝:不向上读
print("\n=== 场景 2: Alice(H) 试图读取 PublicFile(L) ===")
blp.check_read(alice, public_doc) # 允许:向下读合法
print("\n=== 场景 3: Alice(H) 试图写入 PublicFile(L) ===")
blp.check_write(alice, public_doc) # 拒绝:不向下写(防止高密级数据泄露到低密级文件)
print("\n=== 场景 4: Bob(L) 试图写入 PublicFile(L) ===")
blp.check_write(bob, public_doc) # 允许:同级写入合法
三、 RBAC模型实战:基于角色的权限管理
RBAC在企业级应用中最为常见。考试可能考察如何设计角色层次或权限继承关系。下面是一个简化的RBAC实现。
python
复制
class User:
def __init__(self, name):
self.name = name
self.roles = set()
def assign_role(self, role):
self.roles.add(role)
class Role:
def __init__(self, name):
self.name = name
self.permissions = set()
def grant_permission(self, permission):
self.permissions.add(permission)
class Permission:
def __init__(self, name):
self.name = name
class RBAC_System:
def __init__(self):
self.users = []
self.roles = []
self.permissions = []
def check_access(self, user, resource):
"""
检查用户是否有访问资源的权限
"""
print(f"\n[?] 检查用户 '{user.name}' 是否有权限 '{resource}'...")
has_permission = False
# 遍历用户的所有角色
for role in user.roles:
if resource in role.permissions:
has_permission = True
print(f" [+] 找到匹配角色: {role.name}")
break
if has_permission:
print(f" [+] 访问允许")
else:
print(f" [-] 访问拒绝")
return has_permission
# 模拟场景
if __name__ == "__main__":
rbac = RBAC_System()
# 1. 定义权限
p_read_db = Permission("READ_DATABASE")
p_write_db = Permission("WRITE_DATABASE")
p_view_log = Permission("VIEW_LOG")
# 2. 定义角色并赋予权限
role_dev = Role("Developer")
role_dev.grant_permission("READ_DATABASE")
role_dev.grant_permission("WRITE_DATABASE")
role_auditor = Role("Auditor")
role_auditor.grant_permission("VIEW_LOG")
role_auditor.grant_permission("READ_DATABASE")
# 3. 创建用户并分配角色
alice = User("Alice")
alice.assign_role(role_dev)
bob = User("Bob")
bob.assign_role(role_auditor)
# 4. 检查权限
rbac.check_access(alice, "WRITE_DATABASE") # 允许
rbac.check_access(bob, "WRITE_DATABASE") # 拒绝
rbac.check_access(bob, "VIEW_LOG") # 允许
四、 典型真题解析
真题 1:BLP模型规则判断
题目:在BLP模型中,若用户的安全级别为"机密",文件的密级为"绝密",则用户( )。
A. 可以读取该文件
B. 可以写入该文件
C. 既不能读也不能写
D. 既能读也能写
解析:
-
读操作:根据"简单安全属性"(不向上读),用户级别(机密) < 文件级别(绝密),所以不能读。
-
写操作:根据"*-属性"(不向下写),用户级别(机密) > 文件级别(绝密)不成立(用户级别低于文件级别),但判断能否写要看用户级别是否 <= 文件级别。这里用户(机密) < 文件(绝密),符合 <= 条件,所以可以写。
- 注:这里需要特别小心,BLP的写规则是"主体 <= 客体"。机密 < 绝密,符合规则,允许写入。这意味着低级别用户可以把数据写入高级别文件,这不会破坏保密性(高级别文件已经更敏感)。
答案:B
真题 2:Biba模型与BLP模型对比
题目:Biba模型与BLP模型的主要区别在于( )。
A. Biba侧重保密性,BLP侧重完整性
B. Biba侧重完整性,BLP侧重保密性
C. Biba支持多级安全,BLP不支持
D. 两者没有区别,只是名称不同
解析:
- BLP:军事起源,解决"不要让机密信息泄露",侧重保密性。
- Biba:解决"不要让数据被低可信源篡改",侧重完整性。规则是"不向下读,不向上写"(防止低完整性数据污染高完整性数据)。
答案:B
真题 3:RBAC优势
题目:在企业信息系统中,采用基于角色的访问控制(RBAC)模型的主要优势不包括( )。
A. 简化权限管理
B. 符合最小特权原则
C. 适合高保密级别的军事系统
D. 便于职责分离
解析:
- A:正确。角色复用,便于管理。
- B:正确。可以给角色分配最小必要权限。
- C:错误。高保密级别军事系统需要更强的控制力(如MAC),RBAC相对灵活自主,不如MAC严格。
- D:正确。可以通过角色设计实现职责分离(如出纳和会计角色互斥)。
答案:C
五、 备考总结
-
模型规则要记牢:
- BLP(保密) :不向上读,不向下写。
- Biba(完整) :不向下读,不向上写。
- 记忆口诀:BLP = BaoMi(保密)。
-
理解优于死记:
像上面提供的代码一样,自己在脑子里过一遍"谁读谁写"的流程,比单纯背文字印象深刻得多。 -
关注下午题:
下午案例分析题常给出一个网络拓扑或系统架构,让你设计访问控制方案。这时候不仅要选模型(如RBAC),还要说明为什么(如便于运维管理、降低出错率)。
访问控制是安全体系的"守门员",拿下这一块,你的备考之路就走稳了一大半!