본문 바로가기
CSP (Cloud Service Provider)/AWS

[AWS] Expired domain certificate alarm

by BTC_맥썸 2022. 9. 23.

안녕하세요 맥썸입니다.

오늘의 포스팅은 AWS 서비스를 이용하여 만료된 도메인 인증서를 알람을 통해 만료 되기 전, 메일로 확인 할 수 있는 알람 환경을 구성하고자 합니다.

 

🔷 AWS 서비스

 - SNS : 각각의 Protocol을 통해 채널에 알람을 보냅니다.

 - Lambda : Function을 통해 서버를 프로비저닝하거나 관리하지 않고 코드를 실행합니다.

 - Cloudwatch : Rule를 통해 이벤트를 예약된 간격으로 Lambda Function을 트리거하는데 사용합니다.

 

🔷 Step 1. SNS

  • Topic 생성
    • Type: Standard
  • Subscription 생성
    • 해당 Topic에서 진행하면 Topic ARN을 입력하지 않아도 자동 할당 됩니다.
    • Protocol: EMAIL
    • Endpoint: 메일 형식
      >> 구독에 추가된 메일을 승인 하여야 Pending confirmation 상태에서 Confirmed 상태로 변경 됩니다.

 

🔷 Step 2. Lambda

  • Function 생성
    • Function: Author from scratch
    • Runtime: Python 3.7
    • Permissions - Execution role: Create a new role form AWS Policy templates
      1. Role Name
      2. Policy Templates: Amazon SNS publish policy
    • Code
import socket
import ssl, boto3
import re,sys,os,datetime

def ssl_expiry_date(domainname):
    ssl_date_fmt = r'%b %d %H:%M:%S %Y %Z'
    context = ssl.create_default_context()
    conn = context.wrap_socket(
        socket.socket(socket.AF_INET),
        server_hostname=domainname,
    )
    # 3 second timeout because Lambda has runtime limitations
    conn.settimeout(3.0)
    conn.connect((domainname, 443))
    ssl_info = conn.getpeercert()
    return datetime.datetime.strptime(ssl_info['notAfter'], ssl_date_fmt).date()

def ssl_valid_time_remaining(domainname):
    """Number of days left."""
    expires = ssl_expiry_date(domainname)
    return expires - datetime.datetime.utcnow().date()

def sns_Alert(dName, eDays, sslStatus):
    sslStat = dName + ' SSL certificate will be expired in ' + eDays +' days!! '
    snsSub = dName + ' SSL Certificate Expiry ' + sslStatus + ' alert'
    print (sslStat)
    print (snsSub)
    response = client.publish(
    TargetArn="arn:aws:sns:REGION:ACCOUNT_ID:SNS_TOPIC_ARN",
    Message= sslStat,
    Subject= snsSub
    )
    
    
#####Main Section
client = boto3.client('sns')
def lambda_handler(event, context):
    f = ['DOMAIN_NAME']
    for dName in f:
        print(dName)
        expDate = ssl_valid_time_remaining(dName.strip())
        (a, b) = str(expDate).split(',')
        (c, d) = a.split(' ')
    # Critical alerts 
        if int(c) < 15:
            sns_Alert(dName, str(c), 'Critical')
      # Frist critical alert on 20 th day      
        elif int(c) == 10:
            sns_Alert(dName, str(c), 'Critical')
    #second warning alert on 40th day
        elif int(c) == 15:
            sns_Alert(dName, str(c), 'Warning')
    #First warning alert on 50th day      
        elif int(c) == 20:
            sns_Alert(dName, str(c), 'Warning')
        else:
            print('Everything Fine..')

 

 

🔷 Step 3. Cloudwatch

  • Rule 생성
    • 매일 아홉시 알람 발생 할 수 있도록 설정
    • Rule type: Schedule
    • Schedule pattern: A fine-grained schedule that runs at a specific time, such as 8:00a.m. PST on the first Monday of every month.
    • Cron expression: cron (00 1 * * ? *)
    • Target
      1. Type: AWS service
      2. Select a target: Lambda Function
      3. Functio: 이전에 생성한 Lambda Function 선택

 

 

🔷 Step 4. Lambda Function Trigger

  • Trigger Configuration
    • Select a source: EventBridge (CloudWatch Events)
    • Existing rules: 이전에 생성한 Cloudwatch Rule 선택

 

 

🔷 Step 5. Test

 

화이팅 입니다.

'CSP (Cloud Service Provider) > AWS' 카테고리의 다른 글

AWS Instance profile  (0) 2022.10.02
[AWS] Auto Scaling - 실습2  (1) 2022.09.30
[AWS] Auto Scaling - 실습1  (1) 2022.09.23
[AWS] WAF  (0) 2022.09.23
Apache Ignite 소개 및 설치 방법  (0) 2022.09.19

댓글