- 应用开发生命周期安全管理:
- 原理:
- 结合应用开发的需求、设计、开发、测试、上线、运维和废弃等生命周期的各阶段,定义安全目标和控制措施,结合评审、测试、培训等手段,保证开发系统的安全性
- 原因:
- 攻击内容发生了变化
- 病毒蠕虫
- 攻击OS、DB
- APT攻击社会工程学
- 攻击应用系统
- 攻击对象发生了变化
- 缺乏安全开发技能
- 运维阶段无法解决开发问题
- 应用程序代码问题(SQL注入、XSS)
- 应用系统安全设计失效(验证码绕过)
- 应用系统安全需求考虑不充分(密码保护)
- 基础环境漏洞(Apache struts2 ssl)
- 应用服务配置不当(IIS、nginx、Jboss)
- 攻击内容发生了变化
- 安全开发管理带来的收益:
- 减少漏洞数量、提高系统安全性
- 降低上线压力,保证项目进度
- 降低安全和运维人员压力
- 规范应用开发各个环节,提高开发人员技能
- 理顺业务、开发、安全部门之间关系
- 业界标准:
- 微软(SDL)| 最广泛:
- 培训、需求、设计、实施、测试、发布、响应
- 思科(CSDL):
- 安全设计
- 安全需求
- 威胁建模
- 安全开发
- 安全开发流程
- 安全开发工具
- 渗透测试
- 设计验证
- 安全设计
- NLST:
- 开始——>获取和开发——>执行——>操作和维护——>发布阶段部署
- OWASP:
-
- 微软(SDL)| 最广泛:
- 详细流程:
- 图示:
-
-
文章来源:https://uudwc.com/A/AAkZr
- 过程:
- 需求分析(安全需求工程)——>设计:设计安全——>实现:安全编码(输入过滤、输入编码、输出过滤、输出编码)——>测试:软件黑盒测试,渗透性测试,代码安全审计(XSS测试,可手工也可以结合自动工具)——>发布:补丁管理配置加固(IDS/IPS、web应用防火墙、客户端浏览器安全加固)
-
- 需求分析 | 如果数据在传输过程中没有加密,就有可能被截获、篡改:
- 注意:
- 识别关键安全目标
- 安全目标路线图
- 分析:
- 分析业务系统非功能性安全需求
- 自查规范、分析依据、安全需求分析报告
- 分析业务场景、描述安全需求、记录安全需求的具体要求
- 安全需求:
- 身份验证:启用身份认证功能、口令策略、账号锁定、验证码等功能
- 会话管理:严格会话管理,确保会话的安全性、唯一性、完整性
- 访问控制:程序设计时,需要限制对连接数、内存、文件等资源的访问
- 权限管理:应用程序需具备账号管理功能,不同账号、不同角色具备不同权限
- 数据保护:敏感信息、配置文件等重要信息的保存、通信
- 安全审计:应用程序访问需支持记录程序启动、关闭事件、应用程序访问事件、程序出错事件等
- 输入验证:对客户端提交的输入,后台程序进行严格的检查
- 输出处理:应用程序需要限制输出的内容,特别是敏感信息、错误信息、用户输入的内容等
- 白盒测试、黑盒测试:需要检查应用程序开发过程中,特意留下可绕过系统安全控制的功能或超级弱口令
- 内存管理:程序需具有内存管理和控制的功能,限制恶意的使用
- 异常处理:程序在出现异常时,应具有避免信息泄露的措施
- 注意:
- 设计阶段 | 采用HTTPS对通信数据进行加密,以保障数据的保密性:
- 注意:
- 定义安全架构
- 确定受攻击面
- 识别威胁
- 定义安全交付标准
- 分析:
- 确保设计方案覆盖所有安全需求、定义系统安全架构、识别威胁
- 安全设计指南、系统(安全)架构设计说明书、安全设计评审报告
- 描述系统安全架构、接口、数据规范等 | 威胁建模、识别威胁和消减措施
- 设计安全:
- 身份认证的设计:
- 用户身份认证的强度设计
- 对高价值和进入保护区域的用户需要进行重新认证
- 认证失败后的处理方式设计
- 使用强口令策略
- 使用图片验证码
- 敏感信息加密处理
- 访问控制设计:
- 限制普通用户对资源的访问
- 应用软件启动权限最小化
- 敏感功能IP地址控制
- 尽量采用统一的访问控制机制
- 资源请求数量限制
- 在服务端实现访问控制
- 会话管理设计:
- 限制会话寿命
- 确保会话的安全创建
- 确保会话数据的存储安全
- 确保会话的安全终止
- web页面应避免跨站请求伪造
- web系统确保会话凭证的安全
- 数据存储与传输的设计
- 尽量避免明文储机密信息
- 避免在代码中存储机密信息
- web系统,不要永久性cookie中存储敏感信息
- web系统,不要使用HTTP-GET协议传递敏感数据
- 避免在配置文件中明文存储数据库连接、口令或密钥
- 确保通信通道的安全
- 禁止自创加密算法
- 日志设计:
- 审核日志应包含时间、内容、来源等关键要素
- 审核日志应禁止包含用户口令等隐私信息
- 限制对日志数据的访问:应将有权操作日志数据的个人数量减到最下,只为高度信任的账号(如管理员)授予访问权限
- 定期备份和日志数据的分析
- 确保日志数据的安全:
- 日志文件禁止存放在web网页目录下,防止客户端能够访问到日志
- 根据业务平台的重要性,设定日志存储保留的时间
- 防止业务日志欺骗
- 身份认证的设计:
- 注意:
- 实施开发 | 避免采用特定危险API如strcpy、sprintf避免缓冲区溢出漏洞:
- 注意:
- 应用编码规范
- 使用安全测试工具
- 使用代码分析工具
- 代码安全人工审核
- 开发安全:
- 输入验证:
- 对所有的输入进行安全验证:
- 要对所有来源不在可信任范围内的输入进行验证,包括来自用户、服务、共享文件、用户和数据库的输入
- 对web系统,需要验证HTTP请求消息的全部字段,例如:GET数据和POST数据,Cookie和Header数据等
- 验证除数据内容外,需限定数据的大小或长度
- 验证所有输出到客户端的内容,输出数据HTML编码
- 尽量采用集中验证的方法:
- 如条件允许,将输入验证策略作为应用程序设计的核心元素,并采用集中性验证方法,例如:可通过使用共享库中的公共验证模块。这可确保验证规则的一致性。此外还能减少开发的工作量,有助于后期的维护工作
- 对于web应用,需要编写统一的对于客户端提交数据的验证接口,集中处理输入数据
- 应采取严格的输入验证方法:
- 验证数据类型,例如预期输入类型为证书,则需要禁止输入英文字符串
- 验证数据类型长度是否在预期长度范围内
- 验证数值类型是否在预期大小边界内
- 对于web应用,检查数据是否包含特殊字符,如:<、>、"、'、%、(、)、&、+、\、\'、\"等
- 尽量使用白名单进行输入检查。
- 需在服务端进行验证
- 客户端脚本可以篡改,如果为了顾全体检,部分数据一定要用服务器验证
- 注意规范化问题
- 确保没有绕过检查
- 对所有的输入进行安全验证:
- 访问数据库:
- 最小化数据库权限
- 应用软件使用的数据库账号必须是普通权限账号,且只能访问允许的数据库
- 严格控制对数据库查询等操作:
- 应使用支持严格数据类型验证的参数化查询方式(如prepareStatment),使查询和数据分离。或者,对数据库sql语句中来自不可信任范围内的输入参数进行验证
- 验证数据库返回的数据:
- 要求对来自数据库的数据进行验证,确保其格式正确且能够安全的使用,不能盲目的信赖数据库
- 确保释放数据库资源
- 最小化数据库权限
- 文件操作:
- 限制文件上传
- 尽量不向普通用户开放文件上传权限。如确实需要上传,应限制上传文件的大小、类型、路径,防止攻击者将恶意攻击程序上传到服务器中
- 对B/S结构的web程序,使用文件上传功能,需限制上传目录的脚本执行权限
- 限制文件下载:
- 禁止下载应用系统本身的配置和数据
- 避免泄露路径信息:
- 禁止向客户端返回服务器端文件和目录的绝对路径信息
- 防范路径遍历:
- 在根据客户端输入访问服务器端的文件时,应防止通过真实的文件名来访问文件,应使用索引值来映射实际的文件路径。如确实需要在参数中出现文件名时,则应对文件名进行白名单检查。禁止在参数中出现../、..\等特殊字串及变形
- web应用程序中防范动态文件包含
- 禁止在脚本的动态包含功能中直接使用用户提交的数据和文件。
- 限制文件上传
- 异常处理:
- web系统,对所有的异常构造统一的错误页面,包括HTTP错误和未经处理的异常。能够防止攻击者从应用程序的默认出错页面中得到系统信息
- 发生错误异常时,应记录详细的日志信息,同时确保没有记录口令或其他敏感数据
- 捕捉异常,这样做可以避免将应用程序置于不协调的状态,它有助于保护应用程序免受拒绝服务攻击
- 程序发生异常时,应终止当前业务办理,并对当前交易进行回滚操作,保证业务的完整性和有效性;必要时可以注销当前用户会话。
- 其他问题:
- 变量应在使用前进行初始化,确定是全局、局部变量。
- 留意字节大小差异、精度、符号数/非符号数的区别、舍位阶段问题、不同类型数据的转化、非数值运算、极值处理等问题,避免意外的变量使用和运算导致流程的改变
- 函数、类调用时应检查返回值,避免异常发生。
- 在使用随机数时,要选择合适的随机算法和设置合适的随机数,避免被猜解。
- 对于和业务开发无关的第三方代码库或者库文件应严格限制使用,使用第三方代码或库文件时,需要进行安全性检查,避免由此导致的安全隐患
- web应用,需尽量避免使用HTTP-GET方式请求数据
- 输入验证:
- 注意:
- 测试验证 | 通过动态构建SQL语句以证明对用户输入进行了严格过滤,避免了SQL注入攻击:
- 注意:
- 代码安全审核
- 集中式安全测试
- fuzzing测试
- 基线检查
- 渗透测试
- 测试阶段:
- 保证系统符合安全规范和要求,在上线前消除安全隐患
- 测试用例、渗透测试、代码审计等安全测试报告
- 应用系统安全测试、集成环境安全测试、修复后复测
- 安全培训:
- 开发测试类:
- web应用安全之安全测试
- web安全开发培训
- 安全测试工具介绍
- 安全意识类:
- 信息安全形式和案例分析
- 社会工程学和钓鱼攻击防范
- 攻击防御类:
- web应用安全之常见威胁
- 流行攻击与防御手段
- 攻击路径分析
- 开发测试类:
- 注意:
- 发布阶段 | 入侵者通过JSP程序提交上传了页面文件,清除木马程序并提供整改建议:
- 集成环境测试
- 最终安全评审
- 维护阶段:
- 定期安全评估
- 应急响应
- 发布漏洞解决方案
- 图示:
- 原理:
文章来源地址https://uudwc.com/A/AAkZr