如何提醒EC2实例上的X509证书已过期?

时间:2019-11-07 19:36:14

标签: python amazon-web-services amazon-ec2 ssl-certificate monitoring

我想提醒您ec2上的证书将在30天后过期。

我在不同的自动伸缩组上运行了不同的证书。所有Auto Scaling组的大小都不同,范围从3到30个ec2实例。

我至少希望收到一条警报,提示““ {Path}中的{证书}即将过期”

但理想情况下,希望收到一条警报,提示“ {Auto Scaling Group}上{Path}中的{Certificate}将在30天后过期”。但是我不确定如何从ec2实例中获取自动缩放组名称信息。

我不想在同一(证书,路径,Auto Scaling组)元组上收到30条警报,而只收到一条警报。

我开发了一个python脚本,该脚本以JSON输出机器的证书信息。示例:

{
    "HostName": "SomeEC2Instance",
    "MachineCertInfo":[
        {
            "Name": "example.crt",
            "DaysUntilExpiration": 100,
            Path: "/some/path/to/example.crt"
        },
        {
            "Name": "another_example.crt",
            "DaysUntilExpiration": 20,
            "Path": "/some/path/to/another_example.crt"
        }
    ]
}

这是生成上面json的python脚本的简化:

import json
import socket

cert_infos = []

# Recursively seach entire machine for all files ending in .crt
for path in Path('/').rglob('*.crt'):
      # get_cert_info returns the name and days until expiration
      name, expiration = get_cert_info(path)
      res.append(
          {
              "Name": name, 
              "DaysUntilExpiration": expiration,
              "Path": path.as_posix(),
          }
      )

res = {"Hostname": socket.get_hostname(), "MachineCertInfo": cert_infos}

print(json.dump(res))

我省略了get_cert_info源代码,因为它相对复杂并且并不是真正的问题。我已经确认它可以可靠地用于我的用例。

由于此脚本的实现方式,必须在ec2实例上运行它才能获取此信息。我已经在每个ec2实例上安装了此脚本。

我考虑过的一些方法:

解决方案1.创建一个运行python脚本的cronjob,该脚本查找过期后不到30天的证书,并将其信息发布到SNS。

优势:

  1. 易于实现

缺点:

  1. 由于我最大的自动伸缩组有30个具有相同证书的实例,因此我将收到30条相同的警报
  2. 我必须在我的ec2上安装boto3,如果可以的话,我想避免

解决方案2:创建一个每天运行一次python脚本的cronjob,以查找过期后不到30天的证书,然后使用以下指标将其发布到cloudwatch:Certifcate / DaysUntilExpiration {Name,Path}。

优势:

  1. 我将收到每个(名称,路径)元组的警报
  2. 易于实现

缺点:

  1. 我将需要为DaysUntilExpiration指标的每个唯一维度组合创建一个唯一警报。
  2. 如果我移动证书或更改其名称,则需要记住删除与旧名称/路径关联的警报。否则,它将无限期地处于“不足状态”。
  3. 我必须在我的ec2上安装boto3,如果可以的话,我想避免

解决方案3:创建一个python脚本,当计算机上的证书距到期日不足30天时,该脚本将失败。创建一个运行此python脚本的SSM维护窗口,并在SSM维护窗口收到此失败命令时发送SNS通知。

优势:

  1. 不需要在我的ec2上安装boto3
  2. 我只会在证书即将到期时收到一个警报

缺点:

  1. 我对SSM不熟悉,因此存在很多不确定性。我可以在SNS中发送什么信息?仅仅是“此命令失败”还是我可以包括失败的错误消息?
  2. 实施起来可能会更复杂

请让我知道您将如何解决此问题。

0 个答案:

没有答案