Как предупредить об истечении срока действия сертификата X509, расположенного на экземпляре ec2? - PullRequest
0 голосов
/ 07 ноября 2019

Я хотел бы предупредить, когда срок действия сертификата на ec2 истекает через 30 дней.

У меня разные сертификаты, работающие в разных группах автоматического масштабирования. Все группы автоматического масштабирования имеют разные размеры в диапазоне от 3 до 30 экземпляров ec2.

Как минимум, я хотел бы получить предупреждение, в котором говорится, что "{Certificate} в {Path} истекает"

Но в идеале хотелось бы получить предупреждение о том, что срок действия "{Certificate} в {Path} в {Auto Scaling Group} истекает через 30 дней". Однако я не уверен, как получить имя группы автоматического масштабированияинформация из экземпляра ec2.

Я не хочу получать 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"
        }
    ]
}

Ниже приведено упрощение Python-скрипта, создающего json:

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. Создатьcronjob, который запускает скрипт python, который находит сертификаты, срок действия которых истекает <30 дней, и отправляет их информацию в SNS. </p>

Преимущества:

  1. Простота реализации

Недостатки:

  1. Я получу 30 таких же предупреждений, так как у моей самой большой автомасштабной группы есть 30 экземпляров с одинаковыми сертификатами
  2. Мне нужно установить boto3 на мой ec2,которого я хотел бы избежать, если смогу

Решение 2. Создайте cronjob, который запускает скрипт python один раз в день, который находит сертификаты, срок действия которых меньше 30 дней, и отправляет их в cloudwatch с метрикой: Certifcate / DaysUntilExpiration {Имя, Путь}.

Преимущество:

  1. Я получу по одному предупреждению для каждого (Имя, путь) кортежа
  2. Простота реализации

Недостаток:

  1. Мне нужно будет создать уникальный сигнал тревоги для каждой уникальной комбинации измерений метрики DaysUntilExpiration.
  2. Если я переместу сертификат или изменим его имя, мне нужно будет не забыть удалитьоповещение, связанное со старым именем / путем. В противном случае он просто будет неопределенно долго находиться в «недостаточном состоянии».
  3. Мне нужно установить boto3 на мой ec2, чего я бы хотел избежать, если смогу

Решение 3: Создатьскрипт python, который завершается ошибкой, когда срок действия сертификата на компьютере составляет менее 30 дней. Создайте окно обслуживания SSM, которое запускает этот скрипт Python и отправляет уведомление SNS, когда окно обслуживания SSM получает эту неудачную команду.

Преимущество:

  1. Не нужно устанавливать boto3 на моемec2
  2. Я получил бы только одно предупреждение, когда срок действия сертификата близок к истечению

Недостаток:

  1. Я не знаком с SSM, поэтому естьмного неопределенностей. Какую информацию я могу отправить в SNS? Будет ли это просто «эта команда не выполнена» или я могу добавить сообщение об ошибке, с которым она не справилась?
  2. Может быть сложнее реализовать

Пожалуйста, дайте мне знать, как вы решите эту проблему.

...