《架构师训练营》安全架构&高可用架构

极客时间《架构师训练营》第十一周学习笔记

安全架构

XSS 攻击

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

XSS 注入的方法不一而足,简单列举几个常见的方法:

  • 在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入
  • 在内联的 JavaScript 中,拼接的数据突破了原本的限制(字符串,变量,方法名等)
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签
  • 在标签的 href、src 等属性中,包含 javascript: 等可执行代码
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码
  • 在 style 属性和标签中,包含类似 background-image:url("javascript:..."); 的代码(新版本浏览器已经可以防范)
  • 在 style 属性和标签中,包含类似 expression(...) 的 CSS 表达式代码(新版本浏览器已经可以防范)

预防攻击也有一些常用的套路:

  • 输入过滤:在用户提交时,由前端过滤输入,然后提交到后端。
  • 纯前端渲染:纯前端框架会明确的告诉浏览器内容是文本是属性,还是样式,不容易被执行预期外的代码欺骗
  • HTML 转义:采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。doT.js、ejs、FreeMarker 等库对于 HTML 转义通常只有一定的规则,可以帮助我们把诸如 & < > " ' /等等字符彻底转义。
  • 预防 DOM 型 XSS 攻击:如用 Vue/React 技术栈避免不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。

SQL 注入

所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令

SQL 注入攻击的工作方式是提前终止目标 SQL 文本的字符串,然后追加一个新的命令,主要有两种形式:

  • 直接将代码插入到与 SQL 命令串联在一起并使得其以执行的用户输入变量
  • 间接的攻击方法,它将恶意代码注入要在表中存储或者作为原数据存储的字符串。在存储的字符串中会连接到一个动态的 SQL 命令中,以执行一些恶意的 SQL 代码。

防范 SQL 注入攻击的方法:

  1. 普通用户与系统管理员用户的权限要有严格的区分。
  2. 强迫使用预编译参数绑
  3. 加强对用户输入的验证,使用过滤器过滤常见 SQL 注入脚本
  4. 使用专业的漏洞扫描工具来寻找可能被攻击的点

CSRF 攻击

Cross-site request forgery, 跨站请求伪造。是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起跨站请求。

CSRF 攻击攻击原理及过程如下:

  1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A
  2. 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A
  3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 tab 页访问网站 B
  4. 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A

防御 CSRF 手段:

  1. 验证 HTTP Referer 字段
  2. 在请求地址中添加 token 并验证
  3. 在 HTTP 头中自定义属性并验证

其他攻击和漏洞

  • Error Code: Web 服务器输出的错误信息,能帮助黑客寻找系统漏洞
  • HTML 注释:显示在客户端 HTML 中的注释给黑客攻击造成便利
  • 文件上传:上传可执行文件可能危及后台程序
  • 路劲遍历:URL 中显示的相对路径,能帮助黑客程序遍历未开放的目录和文件

信息加密

单向散列

单项散列加密的特性是:

  • 根据任意长度的信息计算固定长度的散列值
  • 能快速计算散列值
  • 消息不同散列值不同
  • 通过散列值不能反算出消息

实际应用:

  • 重要信息密文存储(密码+盐后再进行散列计算,存储后可以防止字典攻击)
  • 检测软件是否篡改
  • 基于口令的加密
  • 消息认证码
  • 数字签名
  • 伪随机生成器
  • 一次性口令

对称加密

对称加密就是最传统的加密计算:加密和解密使用同一个密钥。加密解密过程:

  1. 明文->密钥加密->密文
  2. 密文->密钥解密->明文

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高,通常在消息发送方需要加密大量数据时使用。由于加解密使用的是同一个密钥,因此如何把密钥安全地传递到解密者手上就成了必须要解决的问题。

非对称加密

对称加密算法又称现代加密算法。非对称加密算法需要一对密钥:公开密钥和私有密。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。如果用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。算法强度复杂,安全性依赖于算法与密钥,但是加密解密速度慢。常用的场景有:登陆认证、数字签名、数字证书等等。

高可用系统的度量

可用性指标

业界通常用多少个 9 来衡量网站的可用性,如是 4 个 9,即服务 99.99% 可用,只有 0.01% 的时间不可用,也就是一年中只有大约 53 分钟不可用。

  • 网站年度可用性指标 = ( 1 - 网站不可用时间/年度总时间) * 100%

  • 网站不可用时间(故障时间)= 故障修复时间点 - 故障发现(报告)时间点

故障分类管理

故障分类管理通常与考评挂钩,通过故障等级确定严重性,并对当事人按一定权重扣分,扣分多了就直接滚蛋

分类 描述 权重
事故及故障 严重故障,网站整体不可用 100
A 类故障 网站访问不顺畅,或核心功能不可用 20
B 类故障 非核心功能不可用,或核心功能少数用户不可用 5
C 类故障 以上故障以外的其他故障 1

高可用架构

见本周作业 1

运维

发布

网站需要保证 7*24 高可用运行,同时网站又需要不断的发布新功能。
不管发布内容大小都需要在服务器上关闭原有的应用,然后重新部署启动新的应用,整个过程还要求不影响用户的使用。一般的发布流程:

发布
  • 发布管理:整个发布过程,代码都要通过日常、预发测试才能最终上线,这个过程是需要占用对应服务器并保持稳定

  • 流程控制:为了保证最终上线的代码是正确运行的,整个过程需要测试和 Code Review,必须通过测试、审核才能进入下一个环节

  • 发布反馈:发布脚本需要执行上面提到一系列的过程,这需要一个等待的过程,我们需要实时给发布人员提供发布反馈,并将相关信息保存到日志。

自动化测试

在软件测试中,测试自动化(英语:Test automation)是一种测试方法,使用特定的软件,去控制测试流程,并比较实际的结果与预期结果之间的差异。通过将测试自动化,可以让正式的测试过程中的必要测试,可以反复进行;通过这种方法,也可以将难以手动进行的测试,交由软件来做。

自动化测试主要指四个方向:

  • 单元测试:可以理解为对一个函数、一个组件的测试
  • 接口测试即 API 测试,主要关注提供的接口是否可靠
  • 功能测试可以理解为应用的 UI、功能是否符合预期
  • 基准测试可以帮我们测试代码的性能。

适合适合自动化测试的场景:

  • 需求变动不频繁
  • 项目周期足够长
  • 自动化测试脚本可重复使用
  • 代码规范可测试

常见的自动化测试工具有:

  • 前端测试框架:mocha
  • 断言库:chai
  • 测试覆盖率:Istanbul
  • 测试浏览器:chrome
  • 浏览器驱动:selenium-webdriver/chrome
  • 接口测试 http 请求断言:supertest
  • 基准测试:benchmark

自动化部署

自动化部署就是部署过程中所有的操作全部自动化,无需人工干预,常见的工具有 Gitlab、Jenkins、TeamCity 等等。下面以 Jenkins 为例,简单介绍一介绍一下常见的步骤:

  1. 开发人员于 Git 等源码管理工具上提到 MR
  2. Git 通过 Webhook 或是其他插件触发 Jenkins 拉取源码至其工作空间
  3. Jenkins 构建源码,失败则通知开发人员
  4. 构建成功,则执行单元测试或是其他测试
  5. 测试不过则通知开发人
  6. 测试通过则生成发布包
  7. 再将发布包发布到各个 Web 服务器上
自动化部署

持续部署三步走:

  1. 持续集成:允许工程师随时向公共分支提交代码,并立即进行自动化测试。

  2. 持续交付:除了跑单元测试及软件打包,持续交付机制会将软件部署到各种测试环境中

  3. 持续部署:代码在没有人工干预的情况下被测试、构建、部署并推送到生产环境

其他

  • 灰度发布:大型网站会使用灰度发布模式,将集群服务器分成若干部分,每天只发布一部分服务器,观察运行稳定没有故障,若出现问题则及时回滚

  • 服务器性能监控:收集服务器性能指标,如系统 Load,内存占用,磁盘 IO,网络 IO 等对尽早做出故障预警, 及时判断应用状况,防患于未然,将故障扼杀在萌芽时期非常重要

  • 监控管理:控数据采集后,除了用作系统性能评估、集群规模伸缩性预测等,还可以根据实时监控数据进行风险预警,并对服务器进行失效转移,自动负载调整,最大化利用集群所有机器的资源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353