1. 访问控制基础:概念、目标与安全原则归纳总结

咱们直接进入正题。访问控制到底是个啥?
说白了,它就是系统里的一把锁——谁,能对什么资源,做什么操作。

1.1 三个核心概念

我在做第一个安全项目时,带我的老专家说了句让我记到现在的话:

“访问控制就是回答三个问题:你是谁?你想碰什么?你允许怎么碰?”

三要素拆解

要素 术语 现实例子
谁? 主体(Subject) 用户、进程、API客户端
碰什么? 客体(Object) 文件、数据库表、内存区域
怎么碰? 操作(Operation) 读、写、执行、删除

我在项目中见过最典型的翻车案例:开发把 当作客体来保护,却忘了控制调用方进程这个主体。结果密钥本身没泄露,但恶意进程直接冒充合法主体,一样能把数据拖走。

一个习惯:每当我设计访问控制时,会先在白板上画出「主体 → 操作 → 客体」三条线。这办法看着简单,但能筛掉 80% 的模型漏洞。

1.2 访问控制的目标

你想想看,如果只说“控制谁可以访问”,那太笼统了。咱们得把目标拆成四个维度:

  • 机密性(Confidentiality) —— 不该看的人看不到。我上次审计一家金融系统,发现他们日志文件居然对全服可读……嗯,那家后来紧急改了 ACL。
  • 完整性(Integrity) —— 数据不能被未授权的人改掉。比如你的银行余额,就只允许核心系统写。
  • 可用性(Availability) —— 授权用户不能被挡在门外。记得有一次我把防火墙规则配死了,自己都进不去服务器……(脸红)
  • 问责性(Accountability) —— 谁干了什么,必须留下痕迹。没有审计的访问控制,就像没有摄像头的金库。

我曾经踩过坑:在给云平台设计 RBAC 时,只关注了前两个目标,忽略了问责性。结果出了安全事件,根本查不出是哪个角色越权操作的。后来我在所有授权点都加上了审计日志,才把屁股擦干净。

1.3 安全原则归纳(六条铁律)

下面这六条原则,是我在几十个安全评审中反复验证过的。每条背后都有血泪教训。

原则 核心思想 常见反例
最小权限(Least Privilege) 只给完成任务所需的最小权限 所有员工都配 root
职责分离(Separation of Duties) 关键操作必须多人协作 同一个人能审批且能打款
默认拒绝(Default Deny) 未明确授权的一律禁止 ACL 用了黑名单模式
开放设计(Open Design) 安全机制不依赖保密 用硬编码密钥做权限校验
安全域隔离(Domain Isolation) 不同安全级别的资源物理/逻辑隔离 内网和外网共用同一数据库
纵深防御(Defense in Depth) 多层控制,一层失效还有下一层 只依赖一个防火墙

我个人习惯把这些原则贴在工位上方的白板上。每次设计访问控制策略时,挨个过一遍——能避开大多数低级漏洞。

1.4 一张图理解核心逻辑

下面这张 SVG 把上述概念串起来了。你可以把它当作本章的“记忆锚点”:

访问控制核心知识体系图 访问控制核心知识体系 主体 (Subject) 操作 (Operation) 客体 (Object) 机密性 完整性 可用性 问责性 最小权限 & 默认拒绝 职责分离 & 开放设计 域隔离 & 纵深防御 灵魂拷问:主体通过什么操作访问客体?遵守哪些原则、达到什么目标?

1.5 代码示例:Django 中的最小权限 ACL

光说不练假把式。给你看一段我在实际项目中写过的 ACL 配置——就一句「默认拒绝」加上「白名单放行」:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

# 默认拒绝:不给任何权限
user.user_permissions.clear()

# 只给「读取订单」权限
read_perm = Permission.objects.get(
    codename='view_order',
    content_type=ContentType.objects.get(app_label='orders', model='Order')
)
user.user_permissions.add(read_perm)

# 验证
if user.has_perm('orders.view_order'):
    print('可以读')
else:
    print('禁止访问')

我在评审代码时,最头疼的就是看到这样的写法:

反例: if user.is_authenticated: # 放行所有操作
你想想看,只要用户登录了就什么都能干——那跟没控制有啥区别?

1.6 避坑指南(来自真实事故)

  • 千万别把权限设计留到开发后期。 我见过一个团队快上线了才想起加访问控制,结果不得不重构整个用户体系,延期一个月。
  • 组权限不要搞成橡皮泥。 有个项目把“管理员组”给了几乎所有人,因为“方便调试”。上线后被审计出超范围授权,直接返工。
  • 审计日志别等出事了再补。 嗯,这条我交过学费,就不展开说了……

一句话总结本章:
访问控制不是一堆技术开关,而是一套从“人-操作-资源”出发,用原则对抗风险、用目标定义成功的安全思维方式。