随着XX领域最近几次重大安全事件发生,各个供应厂商都受到严重的波及,使得我们重新认识安全的重要性,安全建设不得不做好了。
一直以来也想快速做好平台安全,但是都没有实际落地,一个是安全体系建设包含的内容实在太多,另一个是安全建设实际具体落地没有规划,中小企业大部分时间应该都是开发有价值的业务功能, 组织架构里也没有专门的安全部门,不可能给研发团队大块时间来专门搞安全建设。另外,即使客户环境出了重大安全事件,客户也是对这个小领域进行一顿安全整顿,不会关注太长时间,毕竟安全这东西不是日常业务工作内容,这也促使开发商随之放松下来,直至慢慢淡忘。
我们必须清楚这个现状,然后做好一定的安全建设规划,然后从细处着手,一步步在平台建设过程中把平台安全落地, 不要想去一下子做一个高深复杂强大的东西,而是用时间慢慢去堆叠一个个功能,时间长了也是一种技术积累,安全建设也是一样。
下面章节记录了一点粗略的安全建设规划,先形成一个大致目标和思路,细节在实际操作过程中再细化和优化, 其实说落地都谈不上。
1. 安全建设概述
从软件生命周期角度,安全贯穿设计、开发、测试和运维四个阶段,不仅仅是最终的运维阶段。
SDL(SDLC): 是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle。
从平台运营角度,安全体系包括系统安全、数据安全、设备安全、网络安全、通信安全、应用安全、软件安全、硬件安全、制度安全等。
系统安全一般包括软件系统安全、硬件系统安全。
数据安全一般包括数据采集、传输、存储、处理、使用的安全。
设备安全一般包括软件安全和硬件安全,也涉及数据安全。
网络安全一般指网络访问、网络传输的安全性,考虑因素有无线网络、有线网络、路由器、交换机、服务器等。
通信安全一般专指网络通讯上的安全性,比如通讯协议是否有漏洞、通道是否加密、数据包是否混淆和加密。
应用安全一般指应用系统业务流程的安全性,比如业务逻辑上设计是否有安全漏洞、数据泄密等问题。
软件安全一般指软件系统的安全性,在云时代软件系统一般部署在机房,用户通过网络远程访问系统接口,那么系统接口的安全性就很重要。
硬件安全一般硬件设备的安全性,比如防水、防破坏、防盗窃等。
制度安全一般指运营过程中流程制度的安全性问题,防止泄密、不安全操作、破坏性操作等。
软件开发活动里一切安全行为都是最终为平台运营安全性服务的,目标就是平台能够安全地运营。
DevSecOps: 是"开发、安全和运营"的缩写,在软件开发生命周期的每个阶段自动集成安全性, 从最初的设计到集成、测试、部署直至软件交付。
2. 设计阶段安全建设
系统架构设计过程中就要考虑安全性,架构师就要设计出一个具有一定安全性的架构出来,对开发团队、测试团队和运维团队都具有指导作用。
总体上要考虑平台的硬件安全、软件安全、网络安全、通信安全、数据安全、应用安全、设备安全、制度安全等。
根据我们平台实际情况,具体考虑的安全因素如下,但不仅仅限于这些方面:
- 采集设备的硬件安全,部署安全
- 采集设备的软件系统安全:操作系统安全、账号安全、应用系统安全、漏洞修复、通讯加密、网络访问安全
- 4G网的网络安全:路由器、交换机、服务器的网络通讯安全,防火墙规则配置,通道加密
- 视频网的网络安全:路由器、交换机、服务器的网络通讯安全,防火墙规则配置,通道加密
- 内网的网络安全:路由器、交换机、服务器的网络通讯安全,防火墙规则配置,通道加密
- 软件系统API服务接口访问安全:访问者有效性和合法性验证,访问安全审计
- 数据安全:数据传输加密、数据存储加密、数据存储备份、数据存储访问安全
- 应用安全:业务逻辑安全、业务涉密、用户访问权限、用户访问审计
- 流程制度安全:运营过程中的流程制度的安全性
3. 开发阶段安全建设
3.1 安全编码
IDE集成环境使用安全插件
开源SonarLint支持Eclipse、VSCode、JetBrains IDE(IntelliJ IDEA, PyCharm, WebStorm, Android Staudio).
利用集成开发环境的安全插件提示进行代码安全修复。
遵循SDL安全编码规范
编码过程中遵循SDL Checklist规范。
遵循OWASP安全编码规范
编码过程中遵循OWASP安全编码规范参考指南。
账号安全
- 管理员用户名不要取常见的容易猜中的名称,如admin, root等。
- 管理员密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合, 并且在数据库里不能明文存放,必须hash并加盐。
- 用户的密码必须按涉密规范要求,长度8位以上,必须包括数字、字母和特殊字符三种组合, 并且在数据库里不能明文存放,必须hash并加盐。
- 业务系统访问存储系统的密码,长度10位以上,必须包括数字、字母和特殊字符三种组合, 如MySQL、Elasticesearch、Redis、RabbitMQ等等。
- 不永许任何系统没有登录就直接可访问。
- 不永许把用户名或密码写死在代码里、配置文件里。
- 不能把代码和配置发布到github、gitee等任何外部系统。
- 开发人员引入一个开源系统,开源系统自带的管理系统必须要有登录机制, 用户名和登录密码不能使用默认,不能简单设置,必须和上面描述的规则一样。
API接口安全
禁止免密免登录免认证鉴权的访问,swagger也需要进行访问认证,外部访问采用https协议。
- API接口要具有用户身份的验证机制,包括合法性和有效性
- API接口要具有用户鉴权机制,包括模块权限和数据权限
- API接口要具有应用令牌的验证机制,对一个应用系统访问另一个应用系统进行鉴权
web访问安全
web访问需要采用https方式,支持国密。
数据通道安全
数据传输通道需要加密,或者数据包进行加密, 支持国密。
Java开源框架和组件库进行漏洞修复
- JDK
- log4j
- Spring Boot
- 所有使用到的开源库,到国家安全中心等发布漏洞的机构定期查询,有漏洞出现则及时打上补丁。
3.2 静态代码扫描分析
对源代码进行质量和安全等方面的静态分析,采用开源SonarQube系统, 把gitlab系统和SonarQube系统结合起来。
3.3 开源库扫描分析
对系统使用的开源库进行扫描分析,防止可疑代码注入,木马植入等, 如采用开源ossf/package-analysis工具。
4. 测试阶段安全建设
待补充。
5. 运维阶段安全建设
5.1 账号安全
操作系统账号安全
- root账号不能远程登录
- 坚持最小权限原则,不能把一个普通账号设置的权限和root账号一样大
- 登录密码必须足够复杂,长度10位以上,必须包括数字、字母和特殊字符三种组合
- 禁用或删除无用账号, 把系统一些自带的账号注释掉
- 禁用或删除无用用户组
- 用户密码不能包含用户名
- 设置用户密码过期时间, 定期修改密码
- 密码输错三次,锁定用户5分钟
- 禁止普通用户su到root用户,只允许指定的用户su到root用户
- 配置证书密钥登录
应用系统账号安全
- 管理员用户名不要取常见的容易猜中的名称,如admin, root等。
- 管理员密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合。
- 用户的密码必须按涉密规范要求,长度8位以上,必须包括数字、字母和特殊字符三种组合。
存储系统账号安全
- 不永许未登录直接访问
- 登录密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合。
消息队列账号安全
- 不永许未登录直接访问
- 登录密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合。
缓存系统账号安全
- 不永许未登录直接访问
- 登录密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合。
第三方系统账号安全
- 不永许未登录直接访问
- 登录密码必须按涉密规范要求,长度10位以上,必须包括数字、字母和特殊字符三种组合。
5.2 API接口访问安全
- 不永许未登录直接访问
- swagger界面要关闭, 或者提供登录认证机制
5.3 Web系统访问安全
- 不永许未登录直接访问
- 外部用户必须采用https协议进行访问
- 最好采取Ukey+CA证书进行登录认证
5.4 防火墙安全
有一个定时任务在监测防火墙规则的启用, 但要注意以下几点:
- 定时任务的频率,太短影响运维任务执行,太长给黑客入侵给足空间;
- 定时任务内容的更新,新增规则是否及时写入脚本;
- 定时任务发现未上防护措施,应发告警信息并写入日志,管理人员应判别是正常运维的善后处理未完成,还是系统被入侵规则被改变。前者要对多次违规者批评教育,避免技术人员依赖监控脚本,后者是及时发现入侵及时处理。
5.5 服务器漏洞扫描
对开发环境和线上环境的服务器群定期进行漏洞扫描,尽量多组合漏扫工具,有针对性进行扫描,至少对一下目标进行扫描:
- Linux操作系统,以及附带的系统软件,如OpenSSL、SSH等;
- 所有Web系统,以及相关软件,如SpringMVC/Springboot开发的系统、Go开发的API系统、Python开发的API系统等;
- 所有引入的开源系统,如docker、hadoop、kafka、rabbitmq、redis、elasticsearch、minio、seaweedfs、milvus、nginx、traefik、consul等;
- 所有自己开发的业务系统.
在开发环境搭建一个全真的覆盖线上环境配置的环境,实时或定期进行漏扫,发现问题及时全网修复。
5.6 服务器安全审计
- 对Linux系统日志进行审计
- 监控所有Linux系统登录和注销
- 跟踪用户帐户和组的所有更改
- 监控在网络中插入或取出可移动设备的所有实例
- 跟踪所有sudo命令执行
- 识别在每个严重性级别发生的所有事件,包括关键事件
- 跟踪一些其他事件,例如,会话连接、NFS安装等等
5.7 数据安全备份
关键数据进行备份,并进行物理隔离:
- 用专门一台机器作为备份机,进行热备份,或短频率备份。备份机坚持最小软件安装原则,仅仅备份功能,只有它向其它服务器发起连接,不提供其它任何端口让外部链接, 减少被攻击的可能性。
- 定期进行冷备份,从备份机复制到磁盘或光盘进行保存,比如1个月一次。
关键数据包括MySQL里的一些数据表,consul里的配置文件, 系统源代码和文档等,非关键数据就是不断增长的采集日志数据,这种数据量太大且不停增长。
线上平台关键数据和开发环境里关键数据都要做好备份措施。