3、安全架构设计原则:纵深防御、最小权限、默认安全、安全隔离
好,咱们进入第三个核心话题。安全架构设计原则。
说实话,很多刚入行的朋友喜欢问我:「老师,有没有一种银弹?用了就绝对安全?」
我的回答很直接:没有。绝对没有。
安全不是靠一个防火墙、一个加密算法就能搞定的。它是一套组合拳。这套组合拳,就是咱们今天要聊的四个原则:纵深防御、最小权限、默认安全、安全隔离。
我个人习惯把这四个原则称为「安全四件套」。你在设计任何汽车电子架构时,脑子里都要过一遍这四件事。
3.1 纵深防御:别把鸡蛋放在一个篮子里
纵深防御,英文叫 Defense in Depth。说白了,就是多层防护。
你想想看,一个城堡如果只有一道城门,攻破就完了。但如果它有护城河、有城墙、有内城、有陷阱,那攻破的难度就大多了。
在汽车上也是一样。我们不能指望一个网关就能挡住所有攻击。万一网关被攻破了呢?万一某个 ECU 被远程控制了怎么办?
核心思想:任何单一防护措施都可能失效。我们要做的是,让攻击者在突破一层后,还有下一层等着他。
我在项目中遇到过这样一个案例:某款车型的 T-Box 被黑客远程攻破了。按理说,黑客拿到 T-Box 权限后,应该能控制整车。但实际并没有。为什么?
因为我们在 T-Box 和网关之间做了严格的访问控制。T-Box 只能发送特定类型的 CAN 报文,比如远程解锁、空调控制。它不能发送制动、转向这类关键报文。
这就是纵深防御的典型应用。即使 T-Box 失守,网关这道防线还在。
具体怎么落地?我建议从这几个层面考虑:
- 网络层:防火墙、入侵检测系统(IDS)、网络分段
- 主机层:操作系统安全加固、应用沙箱、权限控制
- 应用层:代码签名、安全启动、运行时完整性校验
- 数据层:加密存储、安全通信、密钥管理
我的经验:不要试图一次性把所有防护都做完美。先做最关键的几层,然后逐步完善。比如,先搞定安全启动和网关访问控制,再考虑 IDS 和日志审计。
3.2 最小权限:给得越少,越安全
最小权限原则,英文 Principle of Least Privilege。这个原则听起来简单,做起来其实挺难的。
它的核心是:每个组件、每个进程、每个用户,只拥有完成其任务所必需的最小权限。多一点都不给。
为什么会这样?因为权限越大,风险越大。一个拥有 root 权限的进程如果被攻破,整个系统就完了。但如果它只有普通用户权限,那攻击者能做的事情就有限多了。
我曾经在项目中踩过一个坑。当时我们给某个诊断服务分配了过高的权限,结果测试时发现,一个简单的诊断请求就能让整个系统重启。嗯,从那以后,我对权限分配就格外小心了。
在汽车电子中,最小权限原则可以这样应用:
- ECU 之间:每个 ECU 只能访问它需要的 CAN/LIN 信号。比如,车窗控制器不需要知道发动机转速。
- 进程之间:每个进程只能访问它需要的文件、内存、网络端口。比如,导航应用不需要访问制动系统。
- 用户权限:普通用户不能刷写固件,只有经过授权的诊断工具才能执行。
注意:最小权限不是「不给权限」。而是「给得刚刚好」。这需要你对系统有深入的理解,知道每个组件到底需要什么。
我建议你在设计初期就画一张权限矩阵图。把每个组件、每个接口、每个服务都列出来,然后明确它们需要什么权限。这样后面开发时就不会乱。
3.3 默认安全:出厂就是安全的
默认安全,Secure by Default。这个原则的意思是:产品在出厂时,就应该处于最安全的状态。用户不需要做任何额外配置。
你想想看,如果一辆车出厂时,所有端口都是开放的,所有密码都是默认的,那用户得有多大的安全意识才能保证安全?
现实是,大多数用户不会去改默认密码,不会去关不必要的端口。所以,我们必须替用户做好这件事。
我记得有一次做安全评审,发现某个供应商的 ECU 出厂时默认开启了 Telnet 服务。我问他们为什么,他们说「方便调试」。我说:「那用户呢?用户知道怎么关吗?」他们沉默了。
这就是典型的「默认不安全」。后来我们强制要求所有 ECU 出厂时,所有调试接口、非必要服务都必须关闭。只有通过安全认证的诊断工具才能开启。
默认安全的具体做法包括:
- 默认密码:每个设备出厂时必须有唯一的、强密码。不能是 admin/admin 这种。
- 默认服务:所有非必要服务默认关闭。比如 SSH、Telnet、FTP 等。
- 默认端口:所有网络端口默认关闭。只有业务需要的端口才开放。
- 默认配置:安全功能默认开启。比如安全启动、加密通信等。
一句话总结:用户拿到手,什么都不用做,就是安全的。这才是好的设计。
3.4 安全隔离:把危险关在笼子里
安全隔离,Security Isolation。这个原则的核心是:把不同安全等级的系统隔离开来。
为什么要隔离?因为一旦某个子系统被攻破,我们希望把损害控制在最小范围内。就像船上隔舱一样,一个舱进水了,其他舱还能正常工作。
在汽车上,隔离的方式有很多种:
- 物理隔离:关键系统(如制动、转向)使用独立的硬件和网络。不与非关键系统(如娱乐系统)共享资源。
- 逻辑隔离:在同一硬件上,通过虚拟化、容器等技术,把不同安全等级的应用隔离开来。
- 时间隔离:通过时间片调度,确保关键任务不会被非关键任务干扰。
我个人比较推荐物理隔离 + 逻辑隔离的组合。物理隔离保证关键系统的绝对安全,逻辑隔离提高资源利用率。
举个例子。在某个项目中,我们把制动系统和娱乐系统放在不同的域控制器上。制动系统使用独立的 CAN 网络,娱乐系统使用以太网。两个域之间通过一个安全网关通信。这样,即使娱乐系统被攻破,黑客也无法直接控制制动系统。
避坑指南:我曾经见过一个设计,把安全关键功能和非安全功能放在同一个 MCU 上,只靠软件隔离。结果一个内存越界就导致整个系统崩溃。所以,对于安全关键功能,我建议优先考虑物理隔离。
隔离的粒度也很重要。不是越细越好,也不是越粗越好。你需要根据安全等级和成本来权衡。一般来说,安全等级相差两级以上的系统,就应该考虑隔离。
3.5 四个原则的关系
这四个原则不是孤立的。它们相互配合,形成一个完整的安全体系。
纵深防御是「多层防护」;最小权限是「权限控制」;默认安全是「初始状态」;安全隔离是「边界控制」。
你想想看,如果没有最小权限,纵深防御的每一层都可能被轻易突破。如果没有安全隔离,一个漏洞就可能波及整个系统。如果没有默认安全,用户可能从一开始就暴露在风险中。
所以,我建议你在设计架构时,把这四个原则当作一个整体来考虑。不要只关注其中一个,而忽略了其他。
| 原则 | 核心思想 | 典型应用 |
|---|---|---|
| 纵深防御 | 多层防护,不依赖单一措施 | 防火墙 + IDS + 安全启动 |
| 最小权限 | 只给必需的权限 | ECU 间访问控制、进程权限 |
| 默认安全 | 出厂即安全 | 唯一密码、关闭非必要服务 |
| 安全隔离 | 把危险关在笼子里 | 物理隔离、虚拟化、时间隔离 |
好了,这一章的内容就到这里。这四个原则,你记住了吗?
下一章,咱们聊聊具体的攻击面分析。看看黑客到底能从哪些地方下手。