HashiCorp Vault

HashiCorp Vault是一款企业级私密信息管理工具。说起Vault,不得不提它的创造者HashiCorp公司。HashiCorp是一家专注于DevOps工具链的公司,其旗下明星级产品包括Vagrant、Packer、Terraform、Consul、Nomad等,再加上Vault,这些工具贯穿了持续交付的整个流程。


HashiCorp Vault在2016年四月进入了ThoughtWorks技术雷达,位于Tools分类,处于ACESS级别。在2017年3月份期技术雷达中,HashiCorp Vault已经处于TRIAL级别。

为什么要使用HashiCorp Vault?

在企业级应用开发过程中,团队每时每刻都需要管理各种各样的私密信息,从个人的登陆密码、到生产环境的SSH Key以及数据库登录信息、API认证信息等。通常的做法是将这些秘密信息保存在某个文件中,并且放置到git之类的源代码管理工具中。个人和应用可以通过拉取仓库来访问这些信息。但这种方式弊端很多,比如跨团队分享存在安全隐患、文件格式难以维护、私密信息难以回收等。

尤其是在微服务如此风靡的今天,如何让开发者添加私密信息、应用程序能轻松的获取私密信息、采用不同策略更新私密信息、适时回收私密信息等变得越来越关键。所以企业需要一套统一的接口来处理私密信息的方方面面,而HashiCorp Vault就是这样的一款工具。

HashiCorp Vault的特性

HashiCorp Vault作为集中化的私密信息管理工具,具有以下特点:

  • 存储私密信息。 不仅可以存放现有的私密信息,还可以动态生成用于管理第三方资源的私密信息。所有存放的数据都是加密的,任何动态生成的私密信息都有租期,并且到期会自动回收。
  • 滚动更新秘钥。用户可以随时更新存放的私密信息。Vault提供了加密即服务(encryption-as-a-service)的功能,可以随时将密钥滚动到新的密钥版本,同时保留对使用过去密钥版本加密的值进行解密的能力。 对于动态生成的秘密,可配置的最大租赁寿命确保密钥滚动易于实施。
  • 审计日志。 保管库存储所有经过身份验证的客户端交互的详细审核日志:身份验证,令牌创建,私密信息访问,私密信息撤销等。 可以将审核日志发送到多个后端以确保冗余副本。

另外,HaishiCorp Vault提供了多种方式来管理私密信息。用户可以通过命令行、HTTP API等集成到应用中来获取私密信息。HashiCorp Vault也能与Ansible、Chef、Consul等DevOps工具链无缝结合使用。

HashiCorp 架构

HashiCorp对私密信息的管理进行了合理的抽象,通过优良的架构实现了很好的扩展性和高可用。

  • Storage backend: 存储后端,可以为内存、磁盘、AWS等地方。
  • Barrier:隔离受信区域和非授信区域,保证内部数据的安全性。
  • HTTP API:通过HTTP API向外暴露服务,Vault也提供了CLI,其是基于HTTP API实现的。

Vault提供了各种Backend来实现对各种私密信息的集成和管理。比如Authentication Backend提供鉴权,Secret Backend用于存储和生成私密信息等。

总结

HashiCorp Vault作为私密信息管理工具,比传统的1password等方式功能更强大,更适合企业级的应用场景。在安全问题越来越严峻的今天,值得尝试HashiCorp Vault。


更多精彩洞见,请关注微信公众号:思特沃克

Share

Keycloak单点登录平台

Keycloak首次在ThoughtWorks技术雷达VOL’16中以“评估”的状态出现。

技术雷达15期正式提出“安全是每一个人的问题”,同时也对Docker和微服务进行了强调。

在微服务盛行的时代,现代Web服务的拆分对鉴权和授权也提出了新的挑战,而这正是Keycloak解决的问题。

用一句Keycloak官方语言来解释,“为现代应用系统和服务提供开源的鉴权和授权访问控制管理”。

Keycloak实现了OpenID,Auth2.0,SAML单点登录协议,同时提供LDAP和Active Directory,以及OpenID Connect, SAML2.0 IdPs,Github,Google等第三方登录适配功能,能够做到非常简单的开箱即用。但是在实际上,如果想稍微顺利的添加配置,还是需要简单的了解SSO,若想要配置更加复杂的场景,则需要了解对应的协议。

原理概念普及

(图片来自:SAML2.0 wiki

上图是使用SAML协议时,用户首次登录的一种最常用的工作流(SP Redirect Request; IdP POST Response),也是Keycloak的默认方式(当选择SAML协议时),如果忽视传输内容(SAML基于xml传输,OpenID普通文本)的不同,这种工作流程与OpenID的流程非常相似,可以用它来大致了解登录流程。

用户请求Service Provider(简称SP),通过SessionID判断是否存在已鉴权的Context,否则返回302,重定向至Identity Provider(简称IdP),并携带参数,IdP检测是否已经存在鉴权Context,否则要求用户提供凭证(例如普通的用户名密码输入框),成功后返回302,并将数据返回给SP。

在此流程中,单点登录能够做到的非常关键的一点就是Web中的鉴权Context,这种方式的实现原理也就是利用了Cookie(Web Session的实现),多个SP对应一个IdP,任一台SP登录成功,IdP即有了鉴权Content,随后其他SP即可直接登录,这个过程可简单的观察浏览器地址栏变更或查看浏览器网络请求过程。

另一种方式是针对提供RESTFull Api的服务,这种情况下必须使用OpenID Connect协议,这种协议建立在Auth2.0之上,所以,可以将access_token通过Http头的方式来获取权限信息。

(图片来自:WSO2 Blog

洞见上有两篇文章,《登录工程:现代Web应用中的身份验证技术》《登录工程:传统 Web 应用中的身份验证技术》,它们很详细的描述了传统Web和现代Web鉴权授权方式的功能需求。

现代Web服务化的普及,迫切需要将账号服务、鉴权服务、授权服务单独拆分,以独立的方式为其他Service提供服务,而这些服务需要提供双阶段认证机制(two-factor-authentication)、基于时间的一次性密码算法、复杂的密码策略、第三方登录系统接入(Github,Google,SAML IdP,OpenID Connect OP),将这些功能全部实现,那么它也就成了Keycloak。

优缺点

Keycloak的优点和缺点都非常明显。

优点包括:

  • 集群配置
  • 应用轻量级
  • 文档简洁全面
  • 样式可完全自定义
  • 丰富的第三方适配
  • 样例丰富
  • 配置版本化管理等。

并且,所有操作提供RESTFull接口,可简单的通过Api接口进行配置。

缺点包括:

  • 很多范例使用JSP、Servlet,对使用Springboot的用户不太友好;
  • 导入导出配置仅可以在启动时设置,这个在使用Docker容器时,极其不友好;
  • 授权访问配置导出尚存在Bug;
  • 授权Filter存在Bug,Issue已存在,但未修复;第五,相比Okta,Auth0配置说明及范例较少。

雷达路线及对比

翻阅雷达发现,SSO的应用很早便开始,OpenAM首次在2015年5月的雷达上出现在“评估”位置,对于OpanAM的态度,雷达是这样的:

“由于OpenAM 历史悠久,因此它的代码库很庞大,并且文档也很难理解。希望在不久后,会有一个更轻量级的,对自动化部署和配置提供更好支持的替代方案出现。”

在评估两期后,即不再出现。与Keycloa同期存在的还有更稳当的Auth0,它是一款商业的SSO平台,处在“试验”的位置,也就是说,Keycloak真正接替了OpenAM,同时它也满足了雷达提出的愿景–轻量级,支持自动化部署,配置友好。

总结

还是很看好Keycloak发展的,它是Jboss/redhat下的一个项目,所以有较为坚实的技术支撑,而且,Jboss/redhat也使用了Keycloak作为它的SSO系统。但是,它的普及率不是很高,所以出现问题所能查到的资料有限。因此,如果能够得到更多的推广和支持,Keycloak在现代Web环境下,可能会有更好的发展。


参考资源

Share

系统级集成测试的断舍离

食之无味,弃之可惜

在企业级应用的“季度或月度发布”被认为是领域最佳实践的时候,在应用部署到生产环境之前维护一个完整的环境来进行集成测试是非常必要的。但是,集成测试环境和集成测试本身有着如下的问题:

  • 环境本身脆弱,而且通常存在手动配置部分,环境维护成本很高;
  • 环境因素导致集成测试不稳定、不可靠、反馈慢,测试失败不易定位问题,同时还会重复测试隔离组件已经测过的功能。

集成测试成为了持续交付的瓶颈,犹如鸡肋。因此,最新一期(2017年第16期)ThoughtWorks技术雷达建议企业暂缓搭建企业级集成测试环境,而是采用增量的方式发布关键组件到生产环境。增量发布涉及到一些重要的技术包括契约测试、将发布与部署解耦、专注于平均恢复时间和生产环境下的QA 。

断舍离之技术可行性

下面分别介绍技术雷达建议的这四项技术,以及在没有集成测试的情况下如何保证应用的质量、如何帮助企业做到独立增量发布。

消费端驱动的契约测试

消费端驱动的契约测试是微服务测试的重要组成部分,主要用来覆盖两两服务之间的契约关系,下面举个例子来说明什么是契约测试以及契约测试与API测试的区别。

家里有个插座,买电器的时候需要考虑插头跟插座是能配对的,也就是说插座和插头之间需要有契约。

这里的契约测试就是插座跟插头的配套性测试,包括

  • 三相/三头还是两相/两头的;
  • 电压是220V还是110V;
  • 插孔的形状:英式 or 中式?
  • 等等

API测试:对于插座本身功能的测试,需要覆盖

  • 插座能够正常通电;
  • 电压是预期的220v;
  • 接地的插孔真的能够接地
  • 等等

也就是说API测试需要测试API本身功能的各个方面,而契约测试重点在覆盖API调用的格式、参数数量、参数类型等,不一定需要涉及API本身的功能和具体的数据。

更多关于消费端驱动的契约测试,请参看文章《Consumer-Driven Contracts: A Service Evolution Patter》

发布与部署解耦

部署,就是把组件或者基础设施部署到生产环境,不对用户可见,不会影响业务和用户的使用。发布,则是将部署的组件让用户可见,对业务会产生影响。可以通过采用Feature toggle的方式实现部署与发布的解耦,做到持续部署和可控制的发布,减少组件改变带来的风险。这样,产品经理可以根据业务需求灵活控制发布给最终用户的功能组件,帮助企业业务价值最大化。

关注平均恢复时间

先看这样两种情况,思考哪种更好:

  • 系统宕机次数很少,可能每年也就一到两次,但是恢复能力很弱,一旦宕机,得花至少24个小时恢复正常;
  • 系统宕机频率较高,不过每次宕机都能快速恢复,用户甚至感觉不到。

对于第一种,平均失败间隔很长,但是一旦失败对用户的影响不言而喻;第二种虽然会频繁的失败,但是平均恢复时间很短,用户体验不受影响,当然是第二种更好。

传统的Ops团队比较关注失败发生的频率,随着持续交付和监控技术的发展,“快速恢复”成为可能。不用担心错误、失败的发生,而是利用对这些错误和失败的监控和分析,让系统做到快速恢复,可以省掉一些复杂的集成测试,也可以减少无处不在的安全攻击的影响。

生产环境下的QA

生产环境是真实用户使用的环境,通常都不能跟测试环境一样可以在上面直接测试产品的功能,不能简单的把测试环境所用的QA技术直接后延到生产环境,而其中一项在生产环境使用的技术就是监控。采用监控技术来获取生产环境的信息,对其进行分析,然后优化开发、测试过程,同时优化企业业务。更多关于生产环境下QA的内容,请参看文章《产品环境下的QA》

对上面四种技术的解释,我们可以看到:契约测试是对持续独立部署有帮助的,监控技术则是缩短平均恢复时间和做好生产环境下的QA共同的关键技术之一。接下来主要分享项目在围绕契约测试和日志监控这两块所做的实践,一起来看系统级集成测试的断舍离该如何实现。

断舍离之项目实践

项目是一个开发了七八年的老项目,团队对集成测试也是进行了多次的调整,经历了“七年之痒”后依然觉得是鸡肋:

  • Pipeline上执行非常不稳定,总是“随机挂”,不能真实反映问题;
  • 系统复杂,集成测试自然也不简单,每次顺利执行的时间都需要半个小时以上,何况还有很不稳定的情况,最严重的时候导致QA超过一周拿不到包部署;
  • 通过集成测试发现的应用程序的缺陷半年也难得出现一个;
  • 随着系统逐渐变得复杂,集成测试维护的成本也不断增加。

可以看出,集成测试已经严重阻碍了项目持续交付的进行,不得不对其断舍离了。

(一)测试策略调整

断舍离的第一个部分是从集成测试本身入手,调整测试策略。步骤如下:

  • 不再添加新的功能层面的自动化测试,原有的集成测试部分能用底层的UT、API测试覆盖的尽量下移;
  • UT和API测试不能cover的服务间的契约关系通过增加契约测试来保证;
  • 从CI上摘掉原来的集成测试,加速pipeline出包,然后添加Smoke测试到QA环境执行;
  • 不管是在测试环境还是生产环境发现缺陷,都添加对应的测试。

整体策略调整思路是根据测试金字塔的结构进行调整,把测试尽量往下层移,但并没有全部去掉集成测试,只是缩减到非常关键的路径覆盖,最终测试结构调整如下图所示:

(二)日志监控、分析和优化

没有了Pipeline上的集成测试,直接上到QA或者prod环境,那么加强日志监控变得尤其重要。因此,断舍离的第二个部分是日志的监控、分析和优化。

日志数据采集

项目使用的日志分析工具是Splunk,使用该工具从下面几个方面来着手采集日志数据:

  • 在Splunk上设置日志监控的Dashboard,主要用来监控API的请求失败、错误的日志,还有API执行时间等性能相关内容。如下图所示:
  • 设置预警邮件提醒:对于一些存在严重性能问题的API请求,通过邮件的方式进行预警提醒,如下图:
  • 主动查找错误日志:对于一些生产环境中用户反馈回来的问题,通过主动查找错误日志的方式去定位。
  • 前面的几个机制同样应用于QA和Staging等测试环境,以通过日志分析尽量提前发现问题。

日志数据利用

利用前面几种方式采集到的日志数据,从下面几个方面进行分析和优化:

  • 发现和定位系统功能问题,分析系统用户的行为习惯,优化业务;
  • 发现和定位安全、性能等非功能问题,进行修复和优化;
  • 发现和分析日志记录本身的不足,规范日志记录,从而进一步增强日志给问题诊断带来的帮助,形成良性循环。规范日志记录主要涉及这些点:统一日志输出路径、统一日志记录格式、清晰定义日志级别,并且把添加必要日志作为story开发流程的一部分,QA会参与日志评审。下图是Splunk里看到的项目最新优化的日志记录格式:

项目对集成测试断舍离才刚刚开始,正在不断摸索着前进,目前能看到的最直接的影响是pipeline出包明显加快,由以前的好几天出不来一个包变成一天能出好几个包。最振奋人心的是本周刚刚发生的事情:前一天下班前报的bug,第二天上午就已经修复出包可以测试了。

写在最后

系统级集成测试虽然有各种问题,不一定会因为集成测试挂掉而发现很多问题,前面也讨论了断舍离的可行性,分析了项目断舍离的实践,但集成测试并不是用来发现问题的,而是一道对质量把关的屏障,关键路径的必要测试是不可替代的。因此,我们提倡减少集成测试的数量,合理调整各层测试的比例。

系统级集成测试的断舍离需要团队有持续、递进、稳定的交付能力,需要保证用户不会受此影响,企业业务能够正常运转。系统级集成测试的断舍离过程不是一蹴而就的,凝结在集成测试上的心血也不是那么容易放弃的,需要很多的平衡和取舍,并在整个过程中要不断的关注系统的质量和风险,及时作出相应的调整。


更多精彩洞见,请关注微信公众号:思特沃克

Share

无障碍性测试工具 Pa11y

2017.3 技术雷达 Trial

A11y(Accessibility)指的是用来帮助身心障碍者(残疾人)更加便利的使用先进技术的能力。目前世界上主要由各种人权组织和政府通过一些民间规则和政府规则来保障这方面权益。以Web Content为例,比较常见的规则有W3C组织在2008年出台的WCAG2.0,和美国国家标准的Section508等等。

这些规则数量比较多,涉及的检查范围从规定网页元素的颜色对比度,到元素的属性是否缺失等,内容十分丰富。对一个网站的内容进行完整的A11y检查,通常需要针对网站的每一个页面的每一个元素走查,这样的检查几乎是手工无法办到的。

Pa11y是基于HTML codeSinffer以及PhantomJS制作而成的网站内容A11y自动化检查工具。它利用PhantomJS的headless模式运行需要被测试的网站,然后把网页源文件和指定的规则(比如WCAG2AAA)做对比,自动检查出网页内容是否符合规范,同时会把检查结果输出成指定格式的报告。

ThoughtWorks技术雷达VOL.16将其放在试验阶段,鼓励大家对它进行尝试和使用。

Pa11y本身运行在node环境下,通过npm install安装。安装成功后,可以使用命令行来执行对目标网页的检查。同时它也支持从JavaScript直接调用。Pa11y工具支持选择WCAG2.0 A/AA/AAA标准和Section508标准,也支持忽略这些标准中某些特定的项。通过设置参数,还可以改变输出报告的格式,比如输出CSV或者HTML格式的报告。

对比之前需要在手动进入到网站的每个页面、点开每个隐藏元素,再把当前网页源代码拷进自动化工具的检查方式。Pa11y提供了Actions方式来自动化操作页面元素,使得网站操作和规则对比可以完全自动化进行。

另外和其他A11y测试工具相比,除了免费和开源之外,Pa11y还衍生出了许多不同目的的、基于核心工具Pa11y的Pa11y-X工具。比如支持并发多线测试和测试/生产环境隔离,而且可以存储每次执行结果的Pa11y-Webservice;又比如支持非技术用户使用、操作配置简单易懂、集成了Pa11y-Webserivce的前后端一体工具Pa11y-Dashboard(如下图)。

Pa11y-Dashboard还提供可视化图表,协助分析质量趋势。

另外,基于Pa11y这个核心工具还衍生出了专为CI准备和优化过的命令行工具Pa11y-CI等工具。 随着需求的增加,这个平台里面的工具也在Pa11y team的维护下逐渐增多,逐渐形成了一个A11y测试工具全家桶。

然而在目前的版本中,仍然有一些可以继续关注的地方,比如:

  1. 目前所支持的标准仅有WCAG2.0和Section508,将来是否会扩展新的规则支持方案。
  2. 2017年的WCAG2.1标准已经发布β版本,Pa11y应该如何做相应更新值得期待。
  3. 如何提升对不同浏览器的检查支持。
  4. 当前版本依赖的PhantomJS本身还有一些问题,例如对ES6的支持性不完等,如何使Pa11y在ES6开发的网站上完美运行善。

另外值得注意的是,由于Chrome59宣布开始支持Headless,PhantomJS2.x的主要开发者之一Vitaly Slobodin已经宣布不再继续开发新的功能。那么依赖PhantomJS的Pa11y是否也会迎来一次大的改版换“芯”成Chrome呢?


更多技术雷达信息,请点击这里

Share

AWS DEVICE FARM|技术雷达

AWS DEVICE FARM

海量的移动设备使得很多公司几乎不可能在所有设备上测试他们的移动应用程序。AWS DEVICE FARM是一种移动应用测试服务,可以让您的Android,iOS和Web应用同时运行在各种物理设备上,并与应用程序进行交互,它会在每次应用运行期间生成相似的日志,性能图标和屏幕截图,以及提供常规和特定设备的反馈。该服务为用户提供了很大的灵活性,允许改变每个设备的状态和配置,以便重现一些非常特定的测试场景。

ThoughtWorks技术雷达VOL.16将其放在试验阶段,接下来了解其在使用时具体的测试方式。

目前该平台主要支持两种测试方式,分别是自动化测试和远程访问测试。

自动化测试需要上传被测应用包和测试文件包,随后云测试平台会自动运行测试,完成后得出详细测试报告,报告中包含哪些机型未通过测试,也可以查看测试历史会话和日志。

远程访问测试需指定待测设备,随后上传应用程序包,等待平台自动分配相应机型后远程连接设备进行交互测试,也可以查看测试历史会话和日志。

目前,市场上的云测试平台有很多,那么AWS作为基础设施云服务提供商的先驱者也同样加入这场云测试平台混战中。然而Xamarin Test Cloud、Testin云测、Sauce Labs等等都已经凭借自己独特的优势拥有了足够的使用群体。

数据采集于2017年6月

与其他的云测试平台相比,AWS Device Farm起步稍晚,目前支持的设备上稍少,但是在脚本测试中支持的语言和框架上发展迅速,当然该平台也是唯一支持测试FireOS设备的云测试平台。运行方式同时支持cli、console、sdk。

收费方式:

  • 按需付费: 0.17 USD/设备分钟
  • 无限制的测试与访问: 最低 250 USD/设备插槽每月
  • 私有设备最低 200 USD/月
  • 1000分钟免费

目前情况看来,AWS Device Farm 凭借与其他AWS服务(如AWS CloudTrail)的良好集成和服务使用方式,在云测试平台的市场份额正在稳步提升。有需要对海量移动设备进行兼容性测试的企业可以在风险可控的项目中尝试使用此服务平台。

Share