brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 26. 2020

364. CloudWatch이벤트로 보안그룹 모니터링법

실습 완료 불가, 순서 확인,  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



감사합니다.





브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari