希赛海滨.202105.软考中级信息安全工程师 | 完结

2 阅读6分钟

访问控制是信息安全工程师考试(软考中级)的核心考点之一。无论是上午的选择题,还是下午的案例分析,“谁能访问什么资源”(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

五、 备考总结

  1. 模型规则要记牢

    • BLP(保密) :不向上读,不向下写。
    • Biba(完整) :不向下读,不向上写。
    • 记忆口诀:BLP = BaoMi(保密)。
  2. 理解优于死记
    像上面提供的代码一样,自己在脑子里过一遍"谁读谁写"的流程,比单纯背文字印象深刻得多。

  3. 关注下午题
    下午案例分析题常给出一个网络拓扑或系统架构,让你设计访问控制方案。这时候不仅要选模型(如RBAC),还要说明为什么(如便于运维管理、降低出错率)。

访问控制是安全体系的"守门员",拿下这一块,你的备考之路就走稳了一大半!