실습 완료 불가, 순서 확인, Lambda Code는 별도로 작성 필요
목표
CloudWatch 이벤트로 보안 그룹에 대해 모니터링 하자.
보안 그룹이 수정되면 CloudWatch logs에서 확인하고, 수동으로 확인할 수 있도록 하자.
구성
EC2 보안 그룹 -----CloudwatchEvent rule로 모니터링--- Lambda 실행으로 0.0.0.0/0 확인
작업 순서 요약
보안그룹 ID확인 - 보안 그룹 1개에 대해서만 모니터링 한다.
Lambda를 사용하기 위해 Role을 사용한다.
Lambda를 생성해 보안그룹 변경이 있는지 확인하는 코드 작성
클라우드 와치 이벤트 구성
보안그룹 수정하여 동작 확인
CloudWatch Log에서 람다 동작 확인하자
<0> 구성과 동작
<1> 작업 순서 : EC2 > 보안그룹 ID와 내용 확인
<2> 작업 순서 : 람다가 사용할수 있도록 만들었다. IAM > 정책 생성 , 역할 생성
<3> 작업 순서 : Lambda 생성해 보안그룹 변경이 있는지 확인하는 코드작성
<4> CloudWatch event 구성
<5> EC2 보안 그룹 수정하여 동작하는지 확인
<6> Cloudwatch log에서 lambda 수행 작업 확인
<7> 작업 종료 후 리소스들 삭제
<8> 기타
<0> 구성과 동작
1
구성
EC2 보안 그룹 -----CloudwatchEvent rule로 모니터링--- Lambda 실행으로 0.0.0.0/0 확인
1) Cloudwatch log에서 로그 확인 (로그는 실행 될 때마다 생김)
2) 로그로 확인한 하는 기능임 , 조치는 수동으로 해야함
3) 0.0.0.0/0 에 대해 80 , 443 은 기본 룰로 허용한다.
나머지는 logs에 로그가 남도록 확인하자.
2
동작
1. EC2 > 보안그룹 ID와 내용 확인
2. API 호출이 CloudTrail log에 쌓이고
3. Cloudwatch event 가 주기적으로 보안그룹 변경에 대해 모니터링하다. 이벤트 발생
4. Lambda 함수 실행
5. 람다는 기존 코딩된 거와 다르면 CloudWatch log에 알림을 보낸다.
결국 CloudTrail 로그를 CloudWatch Event가 감지하는 것이다.
우리는 Cloudwatch Logs에서 변경된 것을 찾아야 한다.
3
현재는 특정 보안 그룹에 대해서만 감시하므로, 보안 그룹을 수정할 수 있도록만 해야 한다.
보안 그룹의 생성 권한은 제거한다.
<1> 작업 순서 : EC2 > 보안그룹 ID와 내용 확인
SG그룹 ID를 에버노트에 적어 놓는다.
보안 그룹 내용 확인
80 , 443 , 22 허용
seo-sgcheck1-sg
Security group ID
sg-0fe0da0e63eb04a72
<2> 작업 순서 : 람다가 사용할수 있도록 만들었다. IAM > 정책 생성 , 역할 생성
1
seo-sgcheck-policy 생성
ec2 보안 그룹 권한
lgos 권한 추가
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:RevokeSecurityGroupIngress",
"ec2:AuthorizeSecurityGroupIngress",
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:PutLogEvents",
"ec2:DescribeSecurityGroups"
],
"Resource": "*"
}
]
}
람다 함수가 이벤트를 생성해서 logstream에 쓸 수 있도록 하는 권한이 있어야 한다.
1)
EC2에 SG그룹에 대해 리스트업 하고, 쓸 수 있는 권한
2)
CloudWatch log에 LOG를 생성할 수 있는 권한 필요.
2
seo-sgcheck-role1 생성
람다가 사용할수 있도록 만들었다.
<3> 작업 순서 : Lambda 생성해 보안그룹 변경이 있는지 확인
1
서비스 > lambda
name
sg-change-lambda1
python 3.8
기존 역할 사용 > 해당 역할 선택
생성
2
기능 코드 올리기
작업 > 소스 zip파일을 올린다.
80, 443 0.0.0.0/0 인 경우 체크하도록 하는 소스이다.
3
기본 설정
핸들러 수정
awscwevents_lambda_security_group.lambda_handler
시간 수정
1분
저장
<4> CloudWatch event 구성
1
CloudWatch > 이벤트 > 시작하기 > 서비스 이름 >
EC2 선택
이벤트 유형
AWS API Call via Cloudtail
특정 작업 선택
AuthorizeSecurityGroupIngress
새박스
RevokeSecurityGroupIngress
> 편집
// 패턴 입력
패턴에서 GROUP부분을 위에서 확인한 보안그룹 SG-11111로 대체한다.
{
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["AuthorizeSecurityGroupIngress", "RevokeSecurityGroupIngress"],
"requestParameters": {
"groupId": ["GROUP"]
}
}
}
저장
2
대상 > 대상추가 > Lambda함수 > 함수
sg-change-lambda1 선택
> 세부정보 구성 클릭 > 이름
rule-check1
rule-check1
> 규칙 생성
// 보안 그룹이 변경될때마다 람다를 호출하는 Cloud Watch event가 만들어졌다.
<5> EC2 보안 그룹 수정하여 동작하는지 확인
EC2 > 보안그룹 > inbount icmp > 0.0.0.0 /0 허용
SMTPS도 허용 (465 포트)
<6> Cloudwatch logs에서 lambda 수행 작업 확인
1
cloudwatch > logs > log 그룹 > 클릭 > 클릭 > 이벤트 필터 란에
This permission must be
This permission must be revoked
로그에 추가한 포트가 제거되어야 함이 표시되어야 합니다.
80 , 443의 0.0.0.0/0에 대해 실제로 삭제되지는 않고 내용만 확인해준다!!!
ssh 22 와 smtp 25 는 지워야 한다고 로그가 남는다.
예외 처리
REQUIRED_PERMISSIONS = [
{
"IpProtocol" : "tcp",
"FromPort" : 80,
"ToPort" : 80,
"UserIdGroupPairs" : [],
"IpRanges" : [{"CidrIp" : "0.0.0.0/0"}],
"PrefixListIds" : [],
"Ipv6Ranges" : []
},
{
"IpProtocol" : "tcp",
"FromPort" : 443,
"ToPort" : 443,
"UserIdGroupPairs" : [],
"IpRanges" : [{"CidrIp" : "0.0.0.0/0"}],
"PrefixListIds" : [],
"Ipv6Ranges" : []
}]
<7> 작업 종료 후 리소스들 삭제
lambda 삭제
cloudwatch 이벤트 삭제
cloudwatch log 삭제
<8> 기타
1. Cloudwatch log 필터링 결과를 메일로 받거나 하면 좋을 거 같다.
수동으로 보려니 번거롭다.
2. 보안 그룹이 계속 수정되면 람다 실행됨. 비용은?
3. cloudwatch log 파일 저장 기간 설정하자.
4. Cloudwatch event가 발생되는데 비용이 많이 나가지 않을까?
5. 보안 그룹을 수정하기 위해 lambda 함수 수정할 수 가능하다.
authorizesecuritygroupingress() 및 revokesecurityGroupIngress를 호출해야 한다.
https://brunch.co.kr/@topasvga/1581
감사합니다.