在考虑信息安全的时候,必须把保障信息的机密性、完整性、可用性作为最重要目标,才能建立完善和有效的保护机制,避免顾此失彼。通过大量的实践,总结出十大最关键且有效的安全原则:
1、纵深防御
在信息系统上实施多层的安全控制(防御)。实施纵深防御的目标是提供冗余的安全控制,也就是在一种控制措施失效或者被突破之后,可以用另外的安全控制来阻挡进一步的危害。换句话说,纵深防御的目标也就是增加攻击者被发现的几率和降低攻击者攻击成功的几率。
为了保护核心数据,我们需要在多个层面进行控制和防御,一般来说包括物理安全防御(如服务器加锁、安保措施等)、网络安全防御(例如,使用防火墙过滤网络包等)、主机安全防御(例如,保障用户安全、软件包管理和文件系统防护等)、应用安全防御(例如,对Web应用防护等),以及对数据本身的保护(例如,对数据加密等)。如果没有纵深防御体系,就难以构建真正的系统安全体系。
2、运用PDCA模型
PDCA(Plan-Do-Check-Act,计划—执行—检查—改进)也被称为戴明环(Deming Cycle),是在管理科学中常用的迭代控制和持续改进的方法论。PDCA迭代循环所强调的持续改进也正是精益生产(Lean Production)的灵魂。
在安全领域实施PDCA的方法和步骤:梳理资产、制定安全策略、制定实施方案、制定验证方案、以检查阶段的输出为指导,完善安全策略,进入下一个升级迭代。
3、最小权限法则
最小权限法则(Principle of Least Privilege,PoLP)是指仅仅给予人员、程序、系统最小化的、恰恰能完成其功能的权限。例如:服务器网络访问权限控制、使用普通用户运行应用程序、数据库访问控制。
4、白名单机制
白名单机制和黑名单机制相对,后者明确定义了什么是不被允许的,而允许所有其他情况。单纯使用黑名单机制的显而易见的缺陷是,在很多情况下,我们无法穷尽所有可能的威胁;另外,单纯使用黑名单机制,也可能会给黑客通过各种变形而绕过的机会。使用白名单机制的好处是,那些未被预期到的新的威胁也是被阻止的。
5、安全地失败
安全地失败(Fail Safely)是指安全地处理错误。安全地处理错误是安全编程的一个重要方面。在程序设计时,要确保安全控制模块在发生异常时遵循了禁止操作的处理逻辑。
6、避免通过隐藏来实现安全
通过隐藏来实现安全(Security by obscurity)是指通过试图对外部隐藏一些信息来实现安全。举个生活中的例子。把贵重物品放在车里,然后给它盖上一个报纸,我们就认为它无比安全了。这就大错特错了。
7、入侵检测
入侵检测系统一般可以分为网络入侵检测系统和主机入侵检测系统。
- 网络入侵检测系统部署在网络边界,分析网络流量,识别出入侵行为。
- 主机入侵检测系统部署在服务器上,通过分析文件完整性、网络连接活动、进程行为、日志字符串匹配、文件特征等,识别出是否正在发生入侵行为,或者判断出是否已经发生入侵行为。
8、不要信任基础设施
虽然主流的信息基础设施在设计和实现时会把安全放在重要的位置,但是如果没有健壮的验证机制和安全控制措施,这些应用反而会成为基础设施中显而易见的攻击点,使得黑客通过应用漏洞完全控制基础设施。
9、不要信任服务
这里的服务是指任何外部或者内部提供的系统、平台、接口、功能,也包括自研客户端和作为客户端功能的软件,例如浏览器、FTP上传下载工具等。
10、交付时保持默认是安全的
在交付应用时,我们要保证默认情况下的设置是安全的。比如,对于有初始密码的应用,我们要设置较强的初始密码,并且启用密码失效机制来强制用户在第一次使用的时候就必须修改默认密码。另一个例子是虚拟机镜像的交付。我们在烧制虚拟机镜像的时候,应该对镜像进行基础的安全设置,包括删除无用的系统默认账号、默认密码设置、防火墙设置、默认启动的应用剪裁等。在虚拟机镜像交付给用户以后,用户可以按照实际需要再进行优化和完善,以满足业务需求。