快速实现一个企业级域名 SSL 证书有效期监控巡检系统

Why

现在对于企业来说,HTTPS 已经不是可选项,已经成为一个必选项。HTTPS 协议采用 SSL 协议,采用公开密钥的技术,提供了一套 TCP/IP 传输层数据加密的机制。SSL 证书是一种遵守 SSL 协议的服务器数字证书,一般是由权威机构颁发给网站的可信凭证。SSL 证书是有过期时间的限制的,从 2020 年的 9 月以后,权威机构颁发的 SSL 证书的最长有效期被限制在 398 天以内,也就是说,基本上每个网站都需要每年更新或者替换一次 SSL 证书,不然证书过期会导致网站无法访问、数据被暴露等各种风险。

根据互联网公开的信息,2018 年 12 月,日本运营商软银数字证书过期导致 3060 万用户通信故障长达 4 个多小时;2020 年 2 月,微软协同办公软件 Team 因证书过期在全球范围内处于宕机瘫痪状态;2020 年 5 月 13 日,特斯拉因证书过期导致 APP 出现大面积宕机,导致大部分车主被锁在车外。据《企业数字证书管理安全调查》统计报告,74% 的组织都经历过证书过期的停机故障,每个组织的平均损失超过 1100 万美元。

证书有效期的缩短,增加了证书更新的频率,导致使用加密证书的网站所有者和企业的管理周期变得更加复杂,对许多依赖数字证书保护系统的公司来说,带来很大的证书管理成本,对于 SSL 证书的管理者来说,建设一套 SSL 证书有效期的监控巡检系统非常有必要。

How

本文实现的 SSL 证书有效期监控巡检系统原理比较简单,大致流程如下图所示。本质上就是通过 Python 脚本获取域名的 SSL 证书文件,一般来说证书文件内容会包括颁发机构、证书序列号、有效期起始时间、有效期结束时间等信息,获取证书的有效期结束时间后,判断证书是否即将过期,将过期事件推送至观测云(www.guance.com),巡检系统配置对应的告警策略,发生事件告警后推送至钉钉群或企微群。

What

下面将会详细介绍如何利用观测云(www.guance.com)的智能巡检能力帮助企业快速构建一个 SSL 证书有效期监控巡检系统。

前提条件:注册观测云

登录观测云官网(www.guance.com)注册观测云。

步骤一:安装或开通 DataFlux Func

DataFlux Func (func.guance.com)是一个基于 Python 的脚本开发、管理、执行平台,可以非常快速方便的帮助我们执行 Python 脚本。

执行以下命令安装 DataFlux Func 平台。

/bin/bash -c "$(curl -fsSL func.guance.com/portable-download)" -- --for=GSE

或者登录到在观测云控制台「集成」-「扩展」,开通「DataFlux Func 托管版」。

步骤二:获取 API Key

在观测云控制台「管理」 -「API Key 管理」-「新建 Key」,保留生成的 Key ID 和 Key 。

步骤三:运行 SSL 证书有效期巡检脚本

1.进入步骤一搭建的 Func 平台,进入「管理」-「实验室」功能,「开启 PIP 工具模块」。

2.进入「管理」-「PIP 工具」,输入 pyopenssl,点击「安装」。

3.进入「脚本市场」-「官方脚本市场」,搜索并安装「观测云自建巡检 Core 核心包」。

4.进入「开发」-「新建脚本集」,填写 ID 和标题(此处可按需求随意填写),点击「保存」。

5.进入「开发」-「SSL证书有效期监控巡检」-「新建脚本」,填写脚本 ID。

6.复制以下代码到「SSL 证书有效期监控巡检」-「main」脚本中,修改 133 行和 134 行的 API_KEY_ID 和 API_KEY 为步骤二创建的 Key ID 和 Key ,修改 12 行的 domain_list,添加需要巡检的域名,点击右上角「发布」,若需脚本功能,可在编辑状态点击运行。

import arrow
from urllib3.contrib import pyopenssl
from dateutil import parser
from socket import socketfrom guance_monitor__cloud_checker import BaseCloudChecker
import guance_monitor__utils as utils
import guance_monitor__event_detail as event_detail
from guance_monitor__register import self_hosted_monitor
from guance_monitor__runner import Runnerdomain_list = ['www.guance.com','func.guance.com'
]class SSLChecker(BaseCloudChecker):def _get_domain_list(self):'''可对接内部域名管理系统'''return domain_listdef _get_ssl_detail_data(self, domain, port=443):try:connection = pyopenssl.ssl.create_connection((domain, 443))socket = pyopenssl.ssl.SSLContext(pyopenssl.ssl.PROTOCOL_SSLv23).wrap_socket(connection, server_hostname=domain)certificate = pyopenssl.ssl.DER_cert_to_PEM_cert(socket.getpeercert(True))connection.close()cert_obj = pyopenssl.OpenSSL.crypto.load_certificate(pyopenssl.OpenSSL.crypto.FILETYPE_PEM, certificate)cert_issue = cert_obj.get_issuer()return {'version': cert_obj.get_version() + 1,'serial_number': cert_obj.get_serial_number(),'issue': cert_issue.commonName,'start_date': parser.parse(cert_obj.get_notBefore().decode("UTF-8")),'expire_date': parser.parse(cert_obj.get_notAfter().decode("UTF-8"))}except Exception as e:print(f'get certificate failed, domain: {domain}, err: {e}')return Nonedef _build_event_detail(self, ssl_data, advice, title, content):event_details = event_detail.Detail()event_tab = event_detail.Tab(name="事件详情", index=0)# md sectionmd_section = event_detail.Section('事件概览', index=0)md = event_detail.Markdown("")text_list = [f'**检测对象**:{ssl_data["域名"]}',f'**异常描述**:{content}',f'**操作建议**:{advice}']md.set_text(*text_list)md_section.add(md)# 详情sectioninstance_detail_section = event_detail.Section('异常详情', index=1)detail_table = event_detail.Table('该域名 SSL 证书的详细信息如下')detail_table.set_header('属性', '值')for key, value in ssl_data.items():detail_table.add_row(key, value)instance_detail_section.add(detail_table)event_tab.add(md_section, instance_detail_section)event_details.add(event_tab)return event_detailsdef _check_impl(self, dataway, configs):events = []for domain in self._get_domain_list():ssl_data = self._get_ssl_detail_data(domain)if ssl_data is None:continuestart_date = ssl_data['start_date']expire_date = ssl_data['expire_date']# 若需测试脚本功能,可修改以下过期时间# expire_date = '2022-12-06 15:27:00+08:00'expire_day = (arrow.get(expire_date).to('Asia/Shanghai') - arrow.now()).daysprint(expire_day)show_day = arrow.get(expire_date).to('Asia/Shanghai').humanize(arrow.utcnow(), locale='zh')if expire_day > 14:continueelif 7 < expire_day <= 14:lever = 'warning'expired_time = f'预计到期{show_day}'content = f'发现您有一个域名 SSL 证书还有 {show_day} 过期。'elif 0 <= expire_day <= 7:lever = 'critical'expired_time = f'预计到期{show_day}'content = f'发现您有一个域名 SSL 证书还有 {show_day} 过期。'else:lever = 'critical'expired_time = f'过期时间{show_day}'content = f'发现您有一个域名 SSL 证书已经过期。'expire_advice = '请及时对 SSL 证书进行续费,否则证书过期后会导致您的业务受到影响。'complete_title = f'{domain} 的 SSL 证书{"即将过期" if expire_day >= 0 else "已经到期"}'ssl_detail_data = {'域名': domain,'证书版本号': ssl_data['version'],'证书序列号': ssl_data['serial_number'],'颁发机构': ssl_data['issue'],'起始时间': arrow.get(start_date).to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss'),'截止时间': arrow.get(expire_date).to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')}event_details = self._build_event_detail(ssl_detail_data, expire_advice, domain, content)events.append({'title': complete_title,'message': f'''{content}该域名 SSL 证书的详细信息如下:&emsp;&emsp;域名:{ssl_detail_data['域名']}&emsp;&emsp;证书版本号:{ssl_detail_data['证书版本号']}&emsp;&emsp;证书序列号: {ssl_detail_data['证书序列号']}&emsp;&emsp;颁发机构:{ssl_detail_data['颁发机构']}&emsp;&emsp;起始时间:{ssl_detail_data['起始时间']}&emsp;&emsp;截止时间:{ssl_detail_data['截止时间']}建议:&emsp;&emsp;{expire_advice}''','status': lever,'event_detail': event_details.to_json()})return eventsAPI_KEY_ID = 'wsak_69ea3***cee'
API_KEY = 'jaZu***I0'@self_hosted_monitor(API_KEY_ID, API_KEY)
@DFF.API('SSL证书过期时间巡检')
def checker(name=''):checkers = [# 配置检测项(目前已支持的检测项见下文)SSLChecker(),]Runner(checkers, debug=False).run()

Tips:

  • 若需测试脚本过期时间提示功能,可打开 80 行注释,可自定义证书过期时间,点击「执行」可测试脚本查看结果
  • 若需对接内部域名管理系统,可修改 _get_domain_list 函数

7.进入「管理」-「自动触发配置」-「新建」,选择「执行函数」,按照实际要求来设置脚本执行频率,以下设置为每天 08:00 定时触发脚本

步骤四:配置智能巡检告警策略

1.进入观测云控制台(console.guance.com),选择「监控」-「通知对象管理」-「新建通知对象」,按照实际要求添加通知对象,具体步骤可参考添加页面「更多帮助」。

2.进入「监控」-「告警策略管理」-「新建告警策略」,输入「名称」,告警通知对象选择第一步创建的通知对象。

3.进入「监控」-「智能巡检」,点击修改「SSL 证书过期时间巡检」,「告警策略」选择第二步创建的告警策略。

Tips:步骤三的脚本至少要运行一次才会有 SSL 证书过期时间巡检这个选项

效果展示

  • 通过观测云「事件」,可以对 SSL 证书过期事件进行管理

  • 告警推送效果

总结

这篇文章重点介绍如何利用现有平台的能力快速帮助构建企业级的 SSL 证书有效期监控巡检系统。除此之外,观测云本身也可以支持接入指标、链路和日志等可观测性数据,并且可以对这些数据进行统一的标签处理,控制台可实现可观测性数据的互相关联打通,方便运维、研发和测试团队从一个平面理解系统运行情况,可大大提升软件开发交付的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

antv/x6 自定义html节点并且支持动态更新节点内容

antv/x6 自定义html节点 效果图定义一个连接桩公共方法注册图形节点创建html节点动态更新节点内容 效果图 定义一个连接桩公共方法 const ports {groups: {top: {position: top,attrs: {circle: {r: 4,magnet: true,stroke: #cf1322,strokeWidth: 1,fill: #fff,style: {visib…

2023下半年软考系统集成项目管理工程师上午真题及答案解析

1.( C )不属于风险识别的信息收集技术。 A.头脑风暴 B.德尔菲技术 C.排除法 D.根本原因分析 解析&#xff1a; 2.( C )不是SaaS(软件即服务)的特点。 A.由供应商管理软件更新和安全 B.无需购买软件 C.需要自行安装和维护软件 D.按需付费 解析&#xff1a; 3.…

LiveMeida视频接入网关

一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点&#xff0c;面向不同用户&#xff0c;主要用于对接不同厂家、不同型号的摄像机设备&#xff0c;获取摄像机视频后&#xff0c;以统一标准的视频格式和传输协议&#xff0c;将视频推送至上层联网/应用平台。可广…

自动化测试:在Linux下搭建接口自动化测试平台详解

我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧&#xff01; 需要在Linux上提前准备的环境&#xff08;下面是本人搭建时的环境&#xff09;&#xff1a; 1&#xff0c;Python 3.6.8 2&#xff0c;MySQL 5.7 在这我也准备了一份软件测试视…

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…

三级分层查询省市区数据

1、数据库数据 * 2、实现的效果 3、controller层 Api(tags "地址库") RestController RequestMapping("/basic/city") public class DataTChinaCityController extends BaseController {Resourceprivate IProductSaleDeliveryService productSaleDelive…

基于SpringBoot+Vue的旅游系统、前后端分离

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;低价有偿&#xff01; 基于SpringBootVue的旅游系统、前后端分离 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI 工具&#xff1a;IDEA/Eci…

船舶IMO识别码是什么?

船舶编码和编码体系比较多&#xff0c;主要有船舶登记号、船检登记号、船舶呼号、IMO号、船舶MMSI、船体号等。 船舶的IMO Number&#xff08;国际海事组织识别码&#xff0c;下称IMO识别码&#xff09;是独一无二的&#xff0c;相当于船舶的身份证号码&#xff0c;并且此号码…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候&#xff0c;需要对两张表进行…

spring技术体系的演进史

spring 最开始使用 spring 的时候&#xff0c;发现这个特别好用&#xff0c;最主要是把那些对象创建之前通过关键字 new 创建的方式把那些交给 spring ioc 容器来处理&#xff0c;其中 spring 还是使用了工厂模式来创建对应的对象。 然而这个时候需要自己写一堆配置&#xff…

SpringBoot内容协商(简单使用、源码解读、默认Converters、自定义Converters)

目录 1. 内容协商1.1 简单使用1.2 源码解读1.3 WebMvcAutoConfiguration提供几种默认HttpMessageConverters1.4 自定义HttpMessageConverter支持yaml格式输出 1. 内容协商 1.1 简单使用 一套系统适配多端数据返回 基于请求头内容协商&#xff1a;&#xff08;默认开启&#x…

C语言--分段函数

要求&#xff1a;写一个程序&#xff0c;输入x的值&#xff0c;输出y的值 思路&#xff1a;定义两个变量&#xff0c;一个y&#xff0c;一个x&#xff0c;当x<1时&#xff0c;yx&#xff0c;当x>1&&x<10&#xff0c;y2x-1&#xff0c;当x>10,y3x-11.用一个…

Linux 服务器监控

服务器几乎与任何 IT 基础设施密不可分&#xff0c;Linux 是服务器兼容性最强的开源操作系统&#xff0c;因为它具有灵活性、一致性和安全性。大多数 Linux 服务器都设置了以下 Linux 操作系统的任何变体&#xff1a;Red Hat Enterprise Linux &#xff08;RHEL&#xff09;、D…

Linux Shell和权限

目录 Shell命令及运行原理 权限 1.文件基本属性 2.文件权限值的表示方法 3.文件访问权限的相关设置方法 3.(1)chmod 组名修改 3.(2)chmod 二进制修改 3.(3)chown 3.(4)chgrp 3.(5)umask 4.目录权限 Shell命令及运行原理 Linux的操作系统&#xff0c;狭义上是…

看看顶级外贸业务员是如何跟进客户的?

许多外贸业务员&#xff0c;都碰到过客户跟进上的困难。那到底外贸业务员如何跟进客户&#xff0c;才能越跟越近&#xff0c;最终成交呢&#xff1f;本篇文章设定了几个客户回复的场景&#xff0c;看看顶尖销售都是怎么应对的吧&#xff1f; 一 客户说暂时没有需求 1.问清楚客…

案例研究|腾讯音乐娱乐集团与JumpServer共探安全运维审计解决方案

近年来&#xff0c;得益于人民消费水平的提升以及版权意识的加强&#xff0c;用户付费意愿和在线用户数量持续增长&#xff0c;中国在线音乐市场呈现出稳定增长的发展态势。随着腾讯音乐于2018年12月上市&#xff0c;进一步推动了中国在线音乐市场的发展。 腾讯音乐娱乐集团&a…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

WebGL:基础练习 / 简单学习 / demo / canvas3D

一、前置内容 canvas&#xff1a;理解canvas / 基础使用 / 实用demo-CSDN博客 WebGL&#xff1a;开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客 二、在线运行HTML 用来运行WebGL代码&#xff0c;粘贴--运行&#xff…

LangChain+LLM实战---Midjourney(v5.1) Prompt深度剖析

原文&#xff1a;Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples 作者&#xff1a;Michael King 你是否曾经发现自己盯着Midjourney的空白画布&#xff0c;手指悬停在键盘上&#xff0c;让我问自己&#xff1a;“我应该…

前端面试题之CSS篇

1、css选择器及其优先级 标签选择器: 1类选择器、属性选择器、伪类选择器&#xff1a;10id选择器&#xff1a;100内联选择器&#xff08;style“”&#xff09;&#xff1a;1000!important&#xff1a;10000 2、display的属性值及其作用 属性值作用none元素不显示&#xff0c…