ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Salt 证书过期监控实战:cert_info Beacon 原理、配置与事件解析

Salt 证书过期监控实战:cert_info Beacon 原理、配置与事件解析 运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读cert_info是 Salt 在 3000 版本Neon引入的一个 Beacon 模块用于在 minion 上持续监控文件系统里的 X.509 证书PEM 格式的到期时间并在证书即将过期或已经过期时向 Salt 事件总线发送事件。本文以 cert_info 模块源码 为主线完整讲解其配置方式、触发阈值、返回数据结构、pyOpenSSL 版本兼容细节并结合 单元测试 与 Beacon 调度框架 salt/beacons/init.py让你能直接在生产环境落地一套「证书到期自动告警 Reactor 自动续期/提醒」的方案。一、cert_info 是什么Salt 的 Beacon 系统允许 minion 挂接各种系统进程并持续监控它们当被监控的活动发生时会在 Salt 事件总线上发出事件进而可被 Reactor 消费。Beacon 是事件产生机制本身不做变更动作——变更动作交给 Reactor 或状态系统去完成。cert_infobeacon 的作用非常聚焦从 minion 本地文件系统读取一个或多个 PEM 证书文件解析证书的notBefore/notAfter时间与签发者、主题、序列号、签名算法、扩展等信息计算证书距离过期还剩多少天当剩余天数小于等于阈值默认 45 天或阈值设为-1总是上报时把证书信息打包成事件发出。它的模块 docstring 中明确标注了维护者信息与依赖:depends: OpenSSL即运行它需要 minion 上安装pyOpenSSL。二、启用与配置 cert_info Beacon2.1 配置放置位置Beacon 的配置采用基于列表list based的 YAML 结构通常放在 minion 配置文件/etc/salt/minion或/etc/salt/minion.d/beacons.conf也可以通过 minion 的 pillar 或 grains 下发详见 Beacons 通用配置文档。2.2 模块 docstring 中的标准示例以下是模块源码 beacon() 函数 docstring 中给出的权威配置示例beacons: cert_info: - files: - /etc/pki/tls/certs/mycert.pem - /etc/pki/tls/certs/yourcert.pem: notify_days: 15 - /etc/pki/tls/certs/ourcert.pem - notify_days: 45 - interval: 86400配置含义逐条拆解配置项说明files必填。要监控的证书文件路径列表。列表项可以是纯字符串路径也可以是「路径 子选项」的字典形式如yourcert.pem单独覆盖notify_days: 15。notify_days全局通知阈值单位是天。默认值为45源码常量DEFAULT_NOTIFY_DAYS 45见 cert_info.py。当某证书剩余天数 notify_days时触发事件。intervalBeacon 轮询间隔秒。Beacon 框架默认每 1 秒运行一次这里设为86400表示每天检查一次证书适合证书这种「变化极慢」的监控对象能显著降低 I/O 开销。2.3 配置校验规则validate()函数cert_info.py#L89-L104会在 Beacon 被加载时由 Salt loader 自动调用校验规则如下配置必须是列表list否则返回False, Configuration for cert_info beacon must be a list.配置中必须包含files选项否则返回False, Configuration for cert_info beacon must contain files option.校验通过返回True, Valid beacon configuration。这两条失败分支在单元测试中都有直接断言见 test_cert_info.py#L49-L65。需要注意的是校验是在 Beacon 调度引擎 Beacon.process() 中执行的——validate函数存在时会被调用若校验失败会记录错误日志Beacon name configuration invalid, not running.并跳过该 beacon不会硬性中断 minion。2.4 依赖与版本兼容检查__virtual__()函数cert_info.py#L76-L86决定模块能否被加载若 minion 未安装 pyOpenSSLHAS_OPENSSL为假模块加载失败并记录日志OpenSSL library is missing.若 pyOpenSSL 版本 25 导致旧的X509.get_extension/X509.get_extension_countAPI 被移除模块同样拒绝加载日志提示pyOpenSSL 25 removed the X509Extension API used by this beacon.。源码通过HAS_X509_EXTENSION_API HAS_OPENSSL and hasattr(crypto.X509(), get_extension)cert_info.py#L27探测该 API 是否可用。这说明要使用该 beaconminion 上必须安装 pyOpenSSL且版本不能是移除旧扩展 API 的 25 版本或需配合新版处理逻辑运行见下文扩展解析部分。单元测试同样用pytestmark对不支持旧 API 的环境做了跳过处理test_cert_info.py#L13-L18。三、触发逻辑与阈值语义3.1 计算流程beacon()函数cert_info.py#L107-L247的核心处理逻辑如下通过salt.utils.beacons.list_to_dict(config)见 salt/utils/beacons.py把列表式配置合并为字典取出全局notify_days默认45遍历files列表若某项是字典则提取该项对应的子配置中的notify_days作为该证书的独立阈值未指定则回退到全局阈值用crypto.load_certificate(crypto.FILETYPE_PEM, ...)读取并解析 PEM 证书读取或解析失败OSError/CryptoError会记录错误日志并continue不会中断整个 beacon用datetime.strptime(cert.get_notAfter().decode(UTF-8), %Y%m%d%H%M%SZ)解析证书的notAfter字段计算(cert_date - datetime.today()).days得到剩余天数触发条件notify_days 0 或 date_diff notify_days时把该证书信息加入返回列表。3.2 关键语义notify_days: -1或任何负数表示「总是上报」即不关心剩余天数每次轮询都把证书信息发出来。单元测试test_cert_information正是用notify_days: -1来验证完整输出结构的test_cert_info.py#L70。阈值为正数时只有剩余天数小于等于阈值才触发已过期证书的date_diff为负数必然满足 notify_days所以过期证书一定会上报。阈值优先级单个证书的notify_days 全局notify_days 默认45。这允许你例如「全局 45 天提醒但某个核心 CA 证书单独 90 天提醒」。事件是「有变化才发」beacon()只在有证书命中阈值时返回非空列表if certificates: ret.append(...)无命中时返回空列表事件引擎自然不发事件。四、返回数据结构事件载荷每当有证书命中阈值beacon()会返回如下结构每个证书一个certificates条目[ { certificates: [ { cert_path: /etc/pki/tls/certs/mycert.pem, issuer: CNsalttest-01.example.local, issuer_dict: {CN: salttest-01.example.local}, notAfter: 2029-05-31 20:59:22Z, notAfter_raw: 20290531205922Z, notBefore: 2019-06-03 20:59:22Z, notBefore_raw: 20190603205922Z, serial_number: 9515119675852487647, signature_algorithm: sha256WithRSAEncryption, subject: CNsalttest-01.example.local, subject_dict: {CN: salttest-01.example.local}, version: 2, extensions: [ {ext_name: basicConstraints, ext_data: CA:FALSE}, {ext_name: subjectAltName, ext_data: DNS:salttest-01.example.local}, ], has_expired: False, } ] } ]以上输出即为单元测试 test_cert_info.py#L76-L106 中_expected_return的完整断言字段含义如下字段含义cert_path被监控证书的绝对路径issuer/issuer_dict签发者Issuer前者是CN...形式的拼接字符串后者是结构化字典subject/subject_dict主题Subject同样提供拼接串与字典两种形态notBefore/notBefore_raw生效时间格式化%Y-%m-%d %H:%M:%SZ与原始 ASN.1 时间%Y%m%d%H%M%SZ两种形式notAfter/notAfter_raw到期时间同上serial_number证书序列号整数signature_algorithm签名算法如sha256WithRSAEncryptionversionX.509 版本号证书体 version 字段PEM 中 v3 证书此处为 2extensions证书扩展列表每项含ext_name短名如basicConstraints、subjectAltName与ext_data可读字符串如CA:FALSE、DNS:host、IP Address:1.2.3.4has_expired布尔值证书当前是否已过期4.1 扩展解析的 pyOpenSSL 版本差异源码中扩展提取存在两条路径cert_info.py#L171-L197pyOpenSSL 25使用旧版cert.get_extension_count()/cert.get_extension(i)APIext_name来自get_short_name()ext_data是str(extension)的旧式可读串pyOpenSSL 26旧 API 已移除改走cert.to_cryptography().extensions并用辅助函数_format_x509_extension_value()cert_info.py#L36-L73把cryptography.x509.Extension重新格式化成与旧版一致的输出如CA:TRUE, pathlen:0、DNS:host、email:...、URI:...保证下游消费者无需针对 pyOpenSSL 版本特判。cryptography依赖在函数内延迟导入保持其为可选的运行时依赖。4.2 事件在事件总线上的形态Beacon 引擎在 Beacon.process() 中把beacon()的返回值转换为事件事件 tag 形如salt/beacon/{minion_id}/cert_info/如果返回的字典中含tag键会被追加到该 tag 之后id键会自动补上 minion id。因此你在 master 上用事件监听例如salt-run state.event prettytrue参见 Beacons 文档中的事件查看章节会看到salt/beacon/minion-id/cert_info/前缀的事件载荷即上节表格中的证书字典。五、实践从「监控」到「自动告警/续期」Beacon 本身只负责产生事件配合 Reactor 才能形成完整闭环通用流程详见 Beacons 文档的 reactor 示例。针对 cert_info 的典型落地步骤Step 1在 minion 上配置 beacon在/etc/salt/minion.d/beacons.conf写入beacons: cert_info: - files: - /etc/pki/tls/certs/mycert.pem - /etc/pki/tls/certs/yourcert.pem: notify_days: 15 - notify_days: 45 - interval: 86400保存后重启 minion 服务systemctl restart salt-minion或对应平台的服务管理命令。如需临时禁用可在 beacon 顶层加- enabled: False或通过salt.modules.beaconssalt/modules/beacons.py提供的管理函数动态开关。Step 2在 master 上验证事件salt-run state.event prettytrue当某个证书剩余天数进入阈值后就能看到salt/beacon/minion-id/cert_info/事件及其完整证书载荷。Step 3写 Reactor 响应事件在/etc/salt/master.d/reactor.conf注意 master 上只能有一个顶层reactor段中映射事件到 reactor SLSreactor: - salt/beacon/*/cert_info/: - /srv/reactor/cert_expiry_alert.slsreactor SLS 示例发送告警或触发证书刷新状态alert-cert-expiry: local.state.apply: - tgt: {{ data[id] }} - arg: - cert_renew_check若 Reactor 的动作会修改被监控的证书文件本身建议在 beacon 配置中加上- disable_during_state_run: True避免「beacon 触发 → state 修改文件 → beacon 再次触发」的事件循环该机制在 Beacons 通用文档 中有详细说明disable_during_state_run由引擎在 Beacon.process() 中检测state.*任务是否在运行来生效。六、故障排查要点beacon 未加载检查 minion 日志中的Unable to load cert_info beacon: ...确认是否缺少pyOpenSSL或 pyOpenSSL 版本是否触发了X509Extension API兼容检查见 2.4 节。beacon 不运行检查配置是否是列表、是否包含filesvalidate校验失败会记录Beacon cert_info configuration invalid, not running.。某证书一直不触发确认路径拼写与文件权限——读取失败仅记日志并跳过确认notify_days阈值与轮询interval是否符合预期需要「每次都上报」时显式设notify_days: -1。想本地快速验证可参考单元测试 test_cert_info.py 的做法用测试证书内嵌的 PEM 内容配合mock_open直接调用cert_info.beacon(config)与cert_info.validate(config)核对返回结构与断言一致性。七、小结cert_info是一个「小而专」的运维利器无需外部监控服务仅靠 minion 本地解析 PEM 证书即可完成到期监控。掌握其files/notify_days/interval三项核心配置、-1强制上报语义、按证书覆盖阈值的写法以及salt/beacon/minion-id/cert_info/事件与结构化载荷就能快速组合出证书巡检、到期告警、自动续期的一体化 Salt 方案。对实现细节感兴趣的同学可继续深入阅读 cert_info 模块源码、单元测试 以及 Beacon 调度引擎。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt 网络接口监控实战深入解析 network_info Beacon 的事件触发与配置Salt 网络接口监控实战深入解析 network_info Beacon 的事件触发与配置 导读 本文以 Salt 开源仓库中的 network_info运维配置管理后端Salt diskusage Beacon 深度解析磁盘使用率监控与告警事件实战指南Salt diskusage Beacon 深度解析磁盘使用率监控与告警事件实战指南 磁盘空间耗尽是最常见的线上故障之一而 Salt 的 diskusage运维配置管理后端Salt memusage Beacon 详解用 Salt 事件总线实时监控 minion 内存使用率Salt memusage Beacon 详解用 Salt 事件总线实时监控 minion 内存使用率 memusage 是 Salt 内置的 beacon运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表