안녕하세요 오늘은 BESPIN GLOBAL SRE실 정민아님이 작성해주신 ‘AWS Console Login 시 Lambda를 이용하여 Slack 으로 알람 발생 구성’ 대해 소개해드리도록 하겠습니다.
목차
- 설명
- 구성
- 정상 동작 확인
1. 설명
1) AWS Console Login 시 Slack을 통하여 알람을 받는 방법에 대해서 작성하였습니다.
2) 필수 조건
- CloudTrail 로깅 활성화가 되어 있어야만, 사용자가 콘솔 로그인 시 해당 로그를 확인하여 Slack으로 알람이 발생되도록 할 수 있습니다.
- 콘솔을 로그인하는 리전에 따라서 CloudTrail 이벤트에 기록되므로 이벤트 기록이 있는 리전별로 람다 함수를 생성하여야 합니다.
※ 구성된 리전 외 다른 리전으로 로그인할 경우 슬랙으로 알람이 발생되지 않습니다
3) 로직
- User: Login -> CloudTrail logging -> CloudWatch EventBridge -> Lambda -> Slack
2. 구성
1) CloudTrail Logging 활성화
- AWS CloudTrail > Trail > Create Trail
- Trail log bucket and folder: CloudTrail 로깅이 적재될 S3 Bucket을 선택합니다
2) Lambda Function 생성
- Region: us-east-1 (앞서 확인한 부분과 동일하게 구성된 리전 외 다른 리전으로 로그인 할 경우 슬랙으로 알람이 발생되지 않습니다.)
- Runtime: Python 3.8
- 환경 변수 설정 (슬랙 채널 생성 및 Web Hook URL 이 생성된 전제 조건하에 진행)
- Key: HOOK_URL / Value: Slack 채널의 웹 훅 URL
- Key: slackChannel / Value: Slack 채널명
- 코드 업데이트
import boto3
import json
import logging
import os
import time
from datetime import datetime
from datetime import timedelta
from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
HOOK_URL = os.environ['HOOK_URL']
SLACK_CHANNEL = os.environ['slackChannel']
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Event: " + str(event))
data = event['detail']
accountType = data['userIdentity']['type']
# Root 인지 IAMUser 인지 구분
if accountType == "Root":
accountUserName = "Root"
elif accountType == "IAMUser":
accountUserName = data['userIdentity']['userName']
else:
accountUserName = " "
# KST 시간 변환
state_login_time = data['eventTime'][:19]
kst_login_time = datetime.strptime(state_login_time, '%Y-%m-%dT%H:%M:%S') - timedelta(hours=-9) #KST 시
간 변환
# Slack Message Title
title = "[%s]%s AWS Console Login" %(accountType, accountUserName)
# sourceIPAddress
sourceIPAddress = data['sourceIPAddress']
# MFA 사용 유무
usedMFA = data['additionalEventData']['MFAUsed']
# 접속 성공 유무
loginStatusCheck = data['responseElements']['ConsoleLogin']
# 성공 실패 색지정
if loginStatusCheck == "Success" :
sendColor = "#36A64F"
elif loginStatusCheck == "Fail" :
sendColor = "#FF0000"
elif loginStatusCheck == "Failure" :
sendColor = "#FF0000"
else :
sendColor = "#A4AAA7"
sendMessage = "*접속시간*\n%s\n*접속 IPAddress*\n%s\n*Console Login 결과*\n%s\n*MFA 사용유무
*\n%s" % ( kst_login_time, sourceIPAddress, loginStatusCheck, usedMFA)
slack_message = {
'channel': SLACK_CHANNEL,
'attachments': [
{
"color": sendColor,
"title": title,
"text": sendMessage # "*접속시간*\n%s\n*접속 IPAddress*\n%s\n*Console Login 결과*\n%s\n*MFA
사용유무*\n%s" % ( kst_login_time, sourceIPAddress, loginStatusCheck, usedMFA)
}
]
}
req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
try:
response = urlopen(req)
response.read()
logger.info("Message posted")
except HTTPError as e:
logger.error("Request failed: %d %s", e.code, e.reason)
except URLError as e:
logger.error("Server connection failed: %s", e.reason)
관련하여 해당 로그는 CloudWatch LogGroup 내 출력되는 로그를 확인할 수 있으며 커스텀하여 원하는 내용만을 Slack으로 알람 받을 수 있도록 업데이트 하시면 됩니다.
3) CloudWatch EventBridge 생성
- AWS CloudWatch > Event > Rule 생성
- Event Pattern
{
"source": [
"aws.signin"
],
"detail-type": [
"AWS Console Sign In via CloudTrail"
]
}
- Target: 생성한 Lambda Function
3. 정상 동작 확인
- AWS Console 로그인 시 아래와 같은 형태로 알람 발생이 됩니다.

여기까지 ‘AWS Console Login 시 Lambda를 이용하여 Slack 으로 알람 발생 구성’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다.
Written by 정 민아 / SRE실
BESPIN GLOBAL