故障案例分享 | 证书过期引发的血案...

基本情况

1月某日早9点15分,某手机端app接到用户报障:app出现异常,具体表象为登录app提示“License不合法,请联系系统管理员!”。后经核查,具体报错时间为7点24分-10点32分,故障影响时长188分钟,影响该时间段内254位用户登录。

时间线回放

  • 0:00 证书失效。
  • 7:24 app出现登录异常。
  • 9:15 用户报障。
  • 9:20 运维人员登录后台管理平台确认License授权已过期,并联系证书提供商相关工作人员申请新的License文件,事发时人在外面。
  • 9:55 证书提供商工作人员开始远程支撑。
  • 10:20 证书提供商提供新License文件。
  • 10:25 app运维人员完成服务器授权更新。
  • 10:26 app恢复使用。

原因分析

  1. 该app未将License到期检查纳入例行运维检查项,在日常检查中均未发现该问题。
  2. 该app业务探测、证书到期等各类告警缺失,导致问题未能及时发现。
  3. 关于license授权到期问题,证书提供商内部有一套License授权文件管理系统,系统会在license授权到期前10天,在公司内部通信软件每日推送告警提醒,直到处理完成。证书提供商人员未重视License到期情况检查,未重视群里告警提醒,没有在第一时间主动发现问题。
  4. 证书提供商支撑力量薄弱,问题响应不及时。

整改举措

  1. 针对本次License授权文件到期问题,安排相关责任人,将License到期检查纳入例行运维检查项中,每周进行例行检查,及时发现问题解决问题
  2. 全面梳理公司内部iOS证书、描述文件、软件授权证书、http证书等所有证书过期风险隐患,结合省ITSM系统维护作业功能统一管理,实现定期提醒执行维护作业。
  3. 手机端部署rpa定时巡检,模拟用户操作等功能,异常情况及时告警。
  4. 增加License证书到期监控告警

故障点评

  1. 证书需要闭环管控
    前有特斯拉证书过期导致车辆无法正常解锁,后有LinkedIn的HTTPS证书两年内接连两次过期导致站点停机,BATJ这类大厂,都不乏证书过期导致的故障。很多人的第一反应,可能会觉得证书过期管理这么个小事情都搞不好,是不是人的问题?但是业界这么多知名厂商都中招,我想不能简单的把问题归因为人不行,这是思维的懒惰啊!我们应该从技术管理、流程机制等角度系统化的解决问题,既治标又治本。

  2. 第三方默认无责
    谁引入了第三方的技术组件,谁就要对其可用性负责。即我们在使用外部技术组件的时候,要仔细评估对方的可用性情况,以及我们的兜底方案等等。在该案例中,证书即可视为第三方组件。定责是对内的,默认第三方无责是为了避免内部定责时把问题甩锅给第三方,久而久之 SRE 会失去应有的责任心。当然,故障是第三方引起的,我们理应去追责、索赔,这没有问题,但在架构设计上、整个稳定性保障上有没有哪些工作是可以完善来规避故障的,这是我们需要思考的内容。

本文由mdnice多平台发布

本文转载于网络 如有侵权请联系删除

相关文章

  • Vennerable做韦恩图

    #InstallthelatestversionofthispackagebyenteringthefollowinginR: install.packages("remotes") remotes::install_github("js229/Vennerable")复制导入测试数据,StemCell数据为4个基因list.library(Vennerable) data(StemCell) str(StemCell)复制3个list取交集:Vstem3<-Vstem[,c("OCT4","SOX2","NANOG")] plot(Vstem3,doWeights=FALSE)复制此外,还可以根据集合的大小改变圈圈的大小:plot(Vstem3,doWeight=TRUE)复制除了常规的圆圈,还可以用三角形取交集:plot(Vstem3,type="triangles")复制4个list取交集Vstem<-Venn(StemCell) plot(Vste

  • Webpack loader 之 url-loader

    简介安装npminstall--save-devurl-loader复制用法url-loader功能类似于file-loader,但是在文件大小(单位byte)低于指定的限制时,可以返回一个DataURL。importimgfrom'./webpack-logo.png'复制webpack.config.jsmodule.exports={ module:{ rules:[ { test:/\.(png|jpg|gif)$/, use:[ { loader:'url-loader', options:{ limit:8192 } } ] } ] } }复制常用配置项limitlimit用于配置需内联的文件字节限制,类型是Number,默认值为undefined。如果文件大于限制(以字节为单位),该文件将交由file-loader处理,并将所有查询参数传递给它。webpack.config.js{ loader:'url-loader', options:{ limit:8192 } }复制mimetypemimetype用于设

  • 序列比对(一)全局比对Needleman-Wunsch算法

    前言 序列比对是生信领域的一个古老课题,在这一波NGS的浪潮中重新引起大家的广泛关注。由于生物序列的特殊性,在比对的时候允许插入缺失,所以往往是一种不精确匹配。从本文开始,我们陆续学习前人开发出的流行算法。全局比对算法所谓全局比对算法,就是根据一个打分矩阵(替换矩阵)计算出两个序列比对最高得分的算法。关于它的介绍网上已经非常多了,我们只需看看其中的关键点及实现代码。关键点打分矩阵: 选用不同的打分矩阵或者罚分分值会导致比对结果不同,常用BLAST打分矩阵。计算比对最高得分的算法: 常用动态规划算法(Needleman-Wunsch算法)。 图片引自https://www.jianshu.com/p/2b99d0d224a2 打印出最高得分相应的序列比对结果: 根据得分矩阵回溯,如果最优比对结果有多个,全部打印出来。理解打分系统背后的概率论模型: 比对分值可以理解为匹配模型和随机模型的对数几率比(log-oddsratio)。实现代码(C代码及示例)网上的教程给出的代码大多不全,所以我决定还是自己造轮子了。 需要说明的是:没有对输入进行检查,如果有非AGCT的字符程序可能会出错。对

  • FHOG传统hog特征提取。FHOG

    fhog在KCF和DSST中都用到了,当时看KCF的时候做了总结,放在这里。传统hog特征提取。关于HOG特征(梯度统计直方图)简单介绍一下,首先是对原图进行灰度化(hog统计的是梯度信息,色彩几乎没有贡献),再进行gamma压缩和归一化(减轻光照影响)。然后进行统计,首先是统计每个cell(代码里用的是4_4)里的梯度(包括大小和方向,大小用来加权方向)统计直方图,再把几个cell合并成一个block,作为这个block的hog的特征,并对这个特征进行归一化处理,可以进一步减轻光照影响。 合并成block的时候有两种方式,一种overlap一种non-overlap的,就是分块之间是否有重叠,各有优缺点,没有重叠速度快,但是可能由于连续的图像没有分到一个block里降低特征的描述能力,有重叠的就可以很好的解决这个问题,但是会带来运算开支加大。 如图,是一个11_9的图像,我们把橙色的3_3当作一个cell,统计其中的梯度方向并用幅值加权,假设我们分为9个方向,这样的话每个cell中可以得到9个特征,蓝色(2_2个cell)作为一个block,则每个block就会得到4_9=36个特征

  • 在Java的反射中,Class.forName和ClassLoader的区别

    前言最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别。当时没有想出来后来自己研究了一下就写下来记录一下。解释在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName()方法实际上也是调用的CLassLoader来实现的。Class.forName(StringclassName);这个方法的源码是@CallerSensitive publicstaticClass<?>forName(StringclassName) throwsClassNotFoundException{ Class<?>caller=Reflection.getCallerClass(); returnforName0(className,true,ClassLoader.getClassLoade

  • 模拟退火算法

    模拟退火首先看一下度娘的定义模拟退火算法(SimulateAnneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解 模拟退火是一种非常好用的随机化算法,它是爬山算法的改进版爬山算法的思想就是一个劲的找最优解,如果接下来的任何状态都比当前状态差,那么就停止但是这样显然是错误的,比如下面这种情况爬山找到A点之后就GG了,但是模拟退火算法会以一定的概率走向F,进而走向B,找到更优的解至于这里为什么叫做“退火”,还要从物理学说起在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(亦即,退火)时,可“找到”最低能量状态:结晶。但是,如果过程过急过快,快速降温(亦称「淬炼」,quenching)时,会导致不是最低能态的非晶形。 这里的最低能量状态,也就是我们题目中的最优解实现因为要模拟退火的过程,因此我们先定义一些变量$T$:当前温度,由高温到低温,代表算法进行到了什么程度,一般为double类型$\DeltaT$:每次温度的变化率,一般取$0.9

  • 大数据GIS技术之分布式计算全解析

    编者按:超图于2017GIS软件技术大会上发布了大数据时代的GIS基础软件——SuperMapGIS9D。为了让大家能更全面的认识SuperMapGIS9D在大数据领域的成果和能力,我们策划了SuperMapGIS9D大数据系列文章,从技术、产品、数据和应用等多个维度进行全面、系统的介绍和阐述。欢迎走进大数据时代GIS技术的饕餮盛宴!如果说分布式存储技术是为了解决大数据GIS中的数据组织与管理,那么分布式计算技术就是服务大数据GIS中的空间数据处理和分析。通过分布式存储技术,我们解决了超大规模空间数据的高效存储、高效检索、按需扩展等问题,进而需要面对超大规模空间数据的处理和分析需求。在相关需求实现过程中,我们同样需要分布式技术作为支撑。Spark是目前大数据技术中使用最为广泛的分布式计算框架,在SuperMapGIS9D产品中,我们将SuperMapGIS基础内核与Spark框架进行了深度融合。基于Spark中的核心RDD编程模型,我们扩展了适用于空间数据表达的FeatureRDD模型。对于多种数据源的对接,其本质就是将多种数据源中的空间数据读取到FeatureRDD当中。在Super

  • Monaco Editor 中的 Keybinding 机制

    一、前言 前段时间碰到了一个Keybinding相关的问题,于是探究了一番,首先大家可能会有两个问题:MonacoEditor是啥?Keybinding又是啥? MonacoEditor: 微软开源的一个代码编辑器,为VSCode的编辑器提供支持,MonacoEditor核心代码与VSCode是共用的(都在VSCodegithub仓库中)。 Keybinding: MonacoEditor中实现快捷键功能的机制(其实准确来说,应该是部分机制),可以使得通过快捷键来执行操作,例如打开命令面板、切换主题以及编辑器中的一些快捷操作等。 本文主要是针对MonacoEditor的Keybinding机制进行介绍,由于源码完整的逻辑比较庞杂,所以本文中的展示的源码以及流程会有一定的简化。 文中使用的代码版本: MonacoEditor:0.30.1 VSCode:1.62.1 二、举个? 这里使用monaco-editor创建了一个简单的例子,后文会基于这个例子来进行介绍。 importReact,{useRef,useEffect,useState}from"react"; import*a

  • 网页飘窗 JavaScript版

    <!--飘窗--> <divid="roll"> <ionclick="funclose()">×</i> <imgsrc="/Contents/images/icons/jjhtz.jpg"> </div> <styletype="text/css"> #roll{ height:225px; width:400px; position:fixed;/*fixed实现绝对定位*/ cursor:pointer; z-index:900; } #rolli{ position:absolute; right:10px; top:1px; font-size:25px; color:#999; cursor:pointer; font-style:normal; } /*#rollimg{ height:225px; width:400px; }*/ </style> <scripttype="text/javascript"> varggRoll={//创建对象直接量 roll

  • 研究生总结

       总体来说,我觉得研究生期间是要好好计划的。研一时候的迷茫,研二时候的努力,研三时候的忙碌。每段时间都有着自己该做的事情。 1、科研    俗话说,一回生,二回熟。科研也是这样,一开始读论文都会觉得好难,像我现在有些文章作者的意思也要多看几遍才能看懂。建议从中文综述入手,一般都是去知网万方上去找相关的博士论文去读,大致了解这个方向主要是研究什么的,大致的套路是什么。做研究,做事情还是很讲究套路的,也就是整理流程。当对这个方向熟悉后,就可以开始寻找自己的方向了。听闻师兄说当你一个方向大概读过50篇论文的时候,就大概会有自己的想法了。一般情况下,我们的创新更多的还是在现有的方法上的改进,凭空去想出来个方法,而且还要比别人的好,还是有困难的。实验室每个年级每个方向都有相应的积累,每个方向都需要很努力的去研究,最好能与时俱进,比如最近的云计算,手机安全等。    实验室对科研有着比其他实验室要高的要求,每个人都要发表至少两篇EI,压力也是动力,论文写好了对后面的找工作和国家奖学金的评定都是有很大的帮助

  • 【原】无脑操作:Centos 7后台运行及终止jar包程序

    1、后台运行jar包程序,输入:nohupjava-jar/路径/程序.jar& 2、后台终止jar包程序,输入:ps-ef|grepjava,查看使用java命令的进程,再输入:killpid即可终止运行 ------------------------------------------------------------------------------------------------------------------------- ps-ef|grep指令介绍:ps命令:将某个进程显示出来,是Linux下最常用也是非常强大的进程查看命令grep命令:查找,全称是GlobalRegularExpressionPrint,表示全局正则表达式版本,它的使用权限是所有用户,        是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来|命令:管道命令,指ps命令与grep同时执行 字段含义如下:UID  PID  PPID&

  • 在 CentOS 7 中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本

    MySQL目前的最新版本是5.7.11,在Linux下提供特定发行版安装包(如.rpm)以及二进制通用版安装包(.tar.gz)。一般情况下,很多项目都倾向于采用二进制通用安装包形式来进行安装配置,自定义非常方便。但在安装过程中发现,其实官方提供的安装说明文件太过简单,而且里面的参数还有问题,依照执行后,mysql服务启动报错,查找了一些资料并反复试验后,自己总结出一套切实可行的安装配置流程,具体如下: 1、下载MySQLforLinuxGeneric二进制版本安装包(.tar.gz),这里以5.7.11版本为例。 2、我一般习惯于将MySQL安装到/opt目录下,所以我将MySQL安装包文件复制到/opt目录下,切换为root账号后执行以下命令: #tar-zxvfmysql-5.7.11-linux-glibc2.5-x86_64.tar.gz #ln-smysql-5.7.11-linux-glibc2.5-x86_64mysql #cdmysql复制 建立一个mysql的软连接,是为了以后方便配置与操作。 3、5.7.11版本的通用二进制安装包经解压后得到的MySQL目录,

  • SVN命令行更新代码

    命令列表 svnhelp查看帮助信息 Availablesubcommands: add auth blame(praise,annotate,ann) cat changelist(cl) checkout(co) cleanup commit(ci) copy(cp) delete(del,remove,rm) diff(di) export help(?,h) import info list(ls) lock log merge mergeinfo mkdir move(mv,rename,ren) patch propdel(pdel,pd) propedit(pedit,pe) propget(pget,pg) proplist(plist,pl) propset(pset,ps) relocate resolve resolved revert status(stat,st) switch(sw) unlock update(up) upgrade 复制 使用alias来更新多个目录 aliasagcs=svnupdate[目录1][目录2] alias组合多个命令 如果

  • .NET Core TODO: ActionFilterAttribute &amp; IOperationFilter &amp; HandlerMiddleware

    .NETCoreTODO:ActionFilterAttribute &IOperationFilter&HandlerMiddleware     ActionFilterAttribute   publicclassMyActionFilter:ActionFilterAttribute { publicoverridevoidOnActionExecuting(HttpActionContextactionContext) { //.... } publicoverridevoidOnActionExecuted(HttpActionExecutedContextactionExecutedContext) { //.... } } //Startup.cs publicvoidConfigureServices(IServiceCollectionservices) { services.AddControllers(o=>{ o.Filters.Add(typeof(MyActionFilte

  • Linux 下MySQL数据库配置远程访问

    1.mysql-uroot-p 第一次直接回车跳过密码   2. usemysql;   3.执行授权命令 GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION; flushprivileges;     MySQL相关问题 10061:MySQL服务未启动 10060:3306端口系统防火墙未开放   启动MySQL服务 /etc/init.d/mysqldstart   断电后启动失败问题解决方案 cd/var/lib/mysql/ rm-rfmysql.sock /etc/init.d/mysqldrestart     修改root用户密码 setpasswordforroot@localhost=password('123456');  修改root用户密码为123456   设置字符集为UTF-8 setcharacter_set_client=utf8;setcharacter

  • 25匹马,5条赛道,一匹马一个赛道,求决胜1,2,3名至少多少场

    25匹马,5条赛道,一匹马一个赛道,求决胜1,2,3名至少多少场。 问题可以分为两种情况 有计时 无计时 有计时 ​ 需要比5场,就能知道所有马匹的速度。 无计时 ​ 前五次同上,只能获取到A1、B1、C1、D1、E1为每组的最快 第六次,比较A1、B1、C1、D1、E1,可以知道(假设)A1是最快的。 第七次,要确定第二和第三快的马 图上红色标示的是马匹可能的排名,对可能是第二名(A2、B1)和第三名(A3、B2、C1)的马匹比赛。 所以要无计时的话,要知道第一名的话,需要比较6次。要知道前两名和前三名的话需要比较7次。

  • CF700E Cool Slogans——SAM+线段树合并

    RemoteJudge 又是一道用线段树合并来维护\(endpos\)的题,还有一道见我的博客CF666E 思路 先把\(SAM\)建出来 如果两个相邻的串\(s_i\)和\(s_{i+1}\)要满足\(s_i\)在\(s_{i+1}\)中至少出现了两次,那么\(s_i\)显然是\(s_{i+1}\)对应的结点在\(parent\tree\)上的祖先,那么我们可以在\(parent\tree\)上树形dp来得出答案 转移自顶向下进行,\(s_i\)在\(s_{i+1}\)中至少出现了两次意味着\(s_i\)在\(s_{i+1}\)的所有\(endpos\)位置都出现了两次,所以我们只需要知道\(s_{i+1}\)的\(endpos\)中任意一个元素并结合线段树来判断能否从\(s_i\)向\(s_{i+1}\)转移。我直接维护了一个\(firstpos\)代表\(endpos\)中的最小值 最后注意不能转移时需要把值继承过来 代码 #include<algorithm> #include<iostream> #include<cstdlib> #inc

  • 双指针的一些总结

    导言 最近又再次开始刷leetcode题目,做了一些关于双指针的题目,这一篇来稍微总结一下,在数组题目中利用双指针的一些想法和题目的坑,日后方便复习 一.关于双指针 1.什么是双指针 双指针,用两个指针去遍历有序数组 2.双指针的类型 常用的有,对撞指针(一个在头,一个在尾),有的是快慢指针等等 3.使用的场景 多数求和这样的题目 几个数字的和为一个特定的值,这种题目一般用两个指针,一个在头,一个在尾,两边向中间遍历,找到合适的数字 数字交换 数组中元素的交换一般都用双指针,不然需要移动大量元素,用双指针找到要交换的数字来交换 Tips: 1.当题目说到数组是有序数组时,就该想到对撞指针 2.题目需要移动数组里元素时,尝试使用用快慢指针 二.LeetCode例题 283.移动零 给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入:[0,1,0,3,12] 输出:[1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 思路:看到题目是移动元素,可以尝试用双指针解法,i指针来遍历数组,

  • UITableView 接口的调用顺序

    ios7启用estimatedHeightForRowAtIndexPath之后的api调用顺序called-[XHYTableViewControllertableView:heightForRowAtIndexPath:]at0.6called-[XHYTableViewControllertableView:makeCellForRowAtIndexPath:]at0.6called-[XHYTableViewControllertableView:heightForRowAtIndexPath:]at0.5called-[XHYTableViewControllertableView:makeCellForRowAtIndexPath:]at0.5called-[XHYTableViewControllertableView:heightForRowAtIndexPath:]at0.4called-[XHYTableViewControllertableView:makeCellForRowAtIndexPath:]at0.4called-[XHYTableViewContro

  • javascript 原型 和 原型链

      最近几天,好些新同事来问原型,原型链啥的。本身作为菜鸟的我好像也没有好好整理过这个,这里写写自己的理解。   原型   大家都知道,JavaScript不包含传统的类继承模型,而是使用prototype原型模型。代码实现大概是这样子的 functionStudent(name){ this.name=name; } varKimy=newStudent("Kimy"); Student.prototype.say=function(){ console.log(this.name+"say"); } Kimy.say();//Kimysay复制   Kimy本身是没有say方法的,当他在自己对象中找不到该方法时就回去他的原型中查找,也就是Student.prototype对象中查找。这里我们用到了一个构造函数Student   构造函数、__proto__以及原型链   除了IE浏览器,其他浏览器都在Object对象的实例上,部署了一个非标准的__proto__属性(前后各两个下划线),指向该对象的原型对象,即构造函数的prototype属性。 盗用一段代码和一张图 /

  • TensorFlow使用object detection训练自己的模型用于物体识别

    使用objectdetection训练并识别自己的模型 1.安装tensorflow(version>=1.4.0) 2.部署tensorflowmodels  -在这里下载  -解压并安装    -解压后重命名为models复制到tensorflow/目录下    -在linux下      -进入tensorflow/models/research/目录,运行protocobject_detection/protos/*.proto--python_out=.      -在~/.bashrcfile.中添加slim和models/research路径      exportPYTHONPATH=$PYTHONPATH:/path/to/slim:/path/to/research    -在windows下      -下载protoc-3.3.0-win32.zip(version==3.3,已知3.5版本会报错)       -解压后将protoc.exe放入C:\Windows下      -在tensorflow/models/research/打开pow

相关推荐

推荐阅读