一、从一个简单的比喻开始:为什么需要“通用准则”?
想象一下,你要为公司采购一批保险柜。市面上有几十种品牌,每个销售都说自己的产品“最安全”。你该如何选择?你可能会看锁芯等级、钢板厚度、防钻防撬测试报告。最终,你选择了一个通过了权威机构严格认证,并明确标注了“C级锁芯,15mm钢板”的保险柜。这个选择过程,就类似于我们为高安全要求的软件(比如网上银行系统、电子政务平台、工业控制核心)寻找一个可信赖的“安全证明”。
ISO/IEC 15408,俗称“通用准则”(Common Criteria, CC),就是软件安全领域的那个“权威认证标准”。它不是一个具体的安全技术,而是一套国际公认的“评估方法学”。它告诉我们,要评估一个软件(在CC里叫“评估对象”,TOE)有多安全,不能光听开发商怎么说,而是要系统地检查三样东西:你的安全目标是什么(想防什么)、你设计了哪些安全功能来达成目标(怎么防)、以及你有没有一套可靠的开发流程来保证这些功能不是纸上谈兵(如何保证质量)。
通过CC认证,就像给软件贴上了一张清晰的安全等级标签(EAL 1-7级),让采购方、监管机构和用户能够在一个统一的尺度上,理解和比较不同产品的安全保障能力。这对于金融、国防、关键基础设施等领域的软件选型至关重要。
二、核心概念拆解:安全目标、功能与保证
在深入评估流程前,我们必须理解CC的三个核心支柱,它们构成了评估的骨架。
1. 保护轮廓(PP) - “行业安全需求清单” 你可以把它理解为一个“行业标准安全需求模板”。比如,“用于移动支付的软件保护轮廓”会规定,凡是在这个领域的软件,都必须满足诸如“用户口令需加密存储”、“交易数据需防篡改”、“支持双因素认证”等一组基线安全要求。PP的存在,让同一类产品的评估有了可比性。评估时,可以基于一个现成的PP,也可以自定义。
2. 安全目标(ST) - “本产品的安全承诺书” 这是开发商针对自己的具体产品,在PP的基础上(或独立地)撰写的文件。它需要明确声明:“本软件(TOE)计划实现以下安全目标(例如,防止未授权访问管理员后台),并且将通过以下安全功能(例如,基于角色的访问控制RBAC和强密码策略)来实现这些目标。” ST是评估的起点和契约。
3. 安全功能要求(SFR)与安全保证要求(SAR) - “做什么”和“如何证明做到了” 这是CC标准文档里已经定义好的一系列详细要求条目。
- SFR:描述“产品必须有什么功能”,比如“用户身份鉴别”、“安全审计”、“数据加密”。它回答“做什么”的问题。
- SAR:描述“开发者必须提供什么证据来让评估者相信,你不仅设计了这些功能,而且是用一种可靠的方式设计、实现和测试的”。它回答“如何证明”的问题。SAR是决定评估保证等级(EAL) 的关键。
EAL等级(1-7级) 就是一系列预打包的SAR组合。EAL1是最基础的,只需要简单的功能测试;等级越高,要求的开发过程就越严格、需要提供的证据(如设计文档、代码审查记录、渗透测试报告等)就越详实。EAL4是市场上最常见的、平衡了成本与严格性的等级,要求有结构化的设计、明确的接口定义和系统的测试。EAL5-7则用于极高安全要求的场景,如军事系统,可能要求形式化的安全模型和半形式化/形式化的设计与验证。
三、评估认证实战流程:一步步走向认证
整个评估认证过程,可以看作一场由开发商(送测方)、评估实验室和认证机构共同参与的“开卷考试”。以下是关键步骤:
步骤1:定义与准备 开发商首先需要确定产品的安全边界(什么在评估范围内,什么不在),然后编写《安全目标(ST)》文档。同时,需要根据目标EAL等级的要求,准备相应的“保证证据”,也就是开发过程的所有产出物。
步骤2:评估 由独立的、经国家认可的CC评估实验室执行。评估员会像最严格的审计师和黑客的结合体一样工作:
- 审查文档:逐字逐句检查ST是否合理、完整,SFR是否定义准确。
- 检查证据:根据SAR,审核开发过程文档(需求、架构设计、详细设计)、测试文档、配置管理记录、脆弱性分析报告等。
- 独立测试:在实验室环境中搭建测试平台,对TOE进行功能性测试,验证其SFR是否如ST所述正常工作。同时,会进行独立的穿透性测试,尝试找出文档中未声明的脆弱性。
步骤3:认证与维护 实验室完成评估后,出具评估报告,提交给国家的认证机构(如中国的CCRC)。认证机构审核报告,确认无误后,颁发CC证书。证书不是永久有效的,通常有有效期。在有效期内,产品的任何重大变更都可能需要重新评估或进行维护性评估。
为了让这个过程更直观,我们来看一个高度简化的示例。假设我们正在评估一个用Java开发的、具有简单用户登录和角色管理功能的Web应用后台服务,目标是达到EAL2+(在EAL2基础上增加一些安全要求)。
技术栈声明:本示例统一使用 Java + Spring Boot 技术栈。
// 示例:一个简化的用户登录服务类,用于展示如何映射到CC的SFR
// 对应的SFR:FIA_UAU.1 (用户身份鉴别) 和 FIA_UID.1 (用户身份标识)
package com.example.security.service;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 用户认证服务
* 安全功能要求(SFR)映射说明:
* 1. FIA_UID.1 - 在用户执行任何操作前,必须先标识自己(提供用户名)。
* 2. FIA_UAU.1 - 在用户标识自己后,必须鉴别该身份(验证密码)。
* 本类是实现这些安全功能的组件之一。
*/
@Service
public class UserAuthService {
// 模拟一个用户存储(实际应为数据库)。用户名作为唯一标识。
private Map<String, String> userStore = new HashMap<>();
public UserAuthService() {
// 初始化测试用户
userStore.put("admin", "hashed_password_123"); // 密码应为哈希值,此处简化
userStore.put("user1", "hashed_password_456");
}
/**
* 用户登录方法
* @param username 用户标识(对应FIA_UID.1)
* @param password 用户提供的密码(对应FIA_UAU.1)
* @return 登录是否成功
* 评估时,实验室会测试:输入错误密码是否拒绝?不存在的用户名是否拒绝?
* 这属于“安全功能测试”部分。
*/
public boolean login(String username, String password) {
// 步骤1:用户标识 (FIA_UID.1) - 通过username参数实现
if (username == null || username.trim().isEmpty()) {
return false; // 未提供标识,拒绝
}
// 步骤2:用户鉴别 (FIA_UAU.1) - 验证密码
String storedPasswordHash = userStore.get(username);
if (storedPasswordHash == null) {
return false; // 标识不存在,拒绝
}
// 注意:实际应用中必须使用安全的密码哈希比较(如BCrypt),此处为示例简化。
// 评估保证要求(SAR)会检查开发文档中是否明确了必须使用抗碰撞的哈希算法。
return storedPasswordHash.equals(hashedInputPassword(password));
}
private String hashedInputPassword(String plain) {
// 模拟哈希过程,实际必须使用Secure Hash。
return "hashed_" + plain;
}
}
注释说明:这个代码示例本身很简单,但CC评估的关注点远不止于此。评估员会要求查看:
- 设计文档:是否清晰地说明了
UserAuthService类是为了满足FIA_UAU.1和FIA_UID.1而设计的? - 测试文档:是否有完整的测试用例,覆盖登录成功、用户名错误、密码错误、空输入等场景?测试结果是否通过?
- 脆弱性分析:开发者是否自查了代码,例如,指出示例中
hashedInputPassword函数是不安全的,并承诺在实际产品中使用BCrypt? - 配置管理:这份代码文件是否在Git等版本控制系统中,其变更历史是否可追溯?
四、关联技术:配置管理与安全开发生命周期(SDL)
CC的保证要求(特别是EAL3及以上)强烈依赖于良好的开发实践。其中,配置管理(CM) 和 安全开发生命周期(SDL) 是两个至关重要的关联技术。
配置管理:CC要求对TOE的所有相关项(需求、设计、代码、测试用例、工具等)进行唯一标识、受控的变更和版本管理。这不仅是组织需要,更是安全证据链完整性的基础。评估员会检查你的Git提交记录、分支策略和发布版本标签。
SDL实践:CC评估可以看作是对你SDL成果的一次外部审计。SDL中要求的安全培训、威胁建模、安全编码、渗透测试等活动,其产出物(如威胁模型报告、代码审计记录、渗透测试报告)正是CC评估所需要的“保证证据”。例如,在编写上述UserAuthService类之前,如果进行了威胁建模,可能会识别出“密码传输可能被窃听”的威胁,从而在设计中加入使用HTTPS的要求,并在ST文档中声明对应的安全功能(如FPT_ITT.1 内部数据传输保护)。
五、应用场景、优缺点与注意事项
应用场景:
- 政府采购与关键行业:许多国家的政府、军队、金融监管机构强制要求核心信息系统通过特定等级的CC认证。
- 高价值产品市场化:安全芯片、智能卡、网络防火墙、数据库管理系统等产品,通过CC认证是其进入国际高端市场的“敲门砖”。
- 建立供应链信任:大型企业采购核心软件组件时,可要求供应商提供CC证书,作为供应链风险管理的一部分。
优点:
- 标准化与可比性:提供了一个全球公认的安全评估框架,消除了“自说自话”的混乱。
- 提升产品安全质量:为了通过评估,开发商必须系统化地考虑和文档化安全,这本身就能显著提升产品的内在安全性。
- 建立市场信心:一张CC证书是强有力的第三方背书,能极大增强客户和利益相关者的信心。
缺点与挑战:
- 成本高、周期长:完整的评估通常需要数月甚至数年,花费数十万到数百万美元,对中小型企业是沉重负担。
- 过程繁琐:文档工作量巨大,有时会被诟病为“纸面安全”,如果团队不能将CC要求内化到实际开发中,容易流于形式。
- 静态性:证书反映的是评估时那个版本产品的状态。在快速迭代的敏捷开发时代,持续维护认证状态是一大挑战。
重要注意事项:
- “通过认证”不等于“绝对安全”:CC认证证明产品在声明的安全目标下,达到了某个保证等级。它不保证产品没有漏洞,而是保证漏洞被系统化管理的可能性更高。EAL7的产品也可能存在未发现的漏洞。
- 尽早引入:最好在项目规划初期就确定CC认证目标,并据此规划开发流程和资源。中途“补票”代价巨大。
- 选择合适的实验室:与有经验、沟通顺畅的评估实验室合作,他们能在早期提供宝贵的指导,避免走弯路。
- 关注持续保障:建立与CC要求兼容的内部流程(如CM、SDL),使其成为日常开发的一部分,而不仅仅是为了应付评估。
六、总结
ISO/IEC 15408通用准则,就像为高安全软件打造的一把精密尺子和一套严格的体检流程。它通过“保护轮廓”和“安全目标”来定义要量什么,通过“安全功能要求”来检查软件的身体机能,再通过“安全保证要求”和“评估保证等级”来深度检验其身体素质和健康管理过程是否可靠。
虽然这个过程充满挑战,耗时耗力,但对于那些运行在数字化世界核心地带、承载着巨额资产或重大责任的软件系统而言,这种程度的审视和证明是必要且值得的。它最终构建的不仅仅是一张证书,更是一种可重复、可验证的安全工程文化。对于开发者而言,理解CC的逻辑,即便不参与正式评估,也能极大地提升自身构建可信系统时的思维严密性和实践规范性。
评论