1. 개요
Multi Account 환경에서 IAM 관련 Action에 대한 감사를 하기 위해서는 Log들을 Security 관련 Account에서 수집해야 한다.
이에 대해 다음의 AWS 서비스들을 활용하였다.
Terraform : 인프라스트럭쳐 프로비저닝
CloudTrail : AWS API 감사해주는 서비스
Event Bus : AWS Event가 흐르는 통로
Event Rule : AWS 특정 Pattern을 지닌 API를 잡아내기 위함
CloudWatch Logs : 각 Account에서 발생하는 Log들을 수집
Subscription Filter : CloudWatch Logs로 적재되는 Log들을 Amazon ES로 보내기 위한 구독 필터 설정
Amazon OpenSearch : Log 중앙 수집 및 Kibana를 통한 시각화
Lambda : Slack으로 Notification을 보내기 위한 Python 코드를 실행시키기 위한 컨테이너 (런타임)
Slack : Notification을 받기 위한 용도
Slack Notification : CloudTrail -> EventBridge -> SNS -> Lambda -> Slack
시각화 및 로그 수집 : CloudTrail -> EventBridge -> CW Logs -> OpenSearch (Kibana 시각화)
2. 아키텍처
Multi Account에 동일한 리소스를 배포하기 위해 Terraform을 활용
(SNS, Lambda, VPC Peering 등 몇몇 리소스는 웹 콘솔에서 수동 생성하였다.)
전체적인 흐름을 설명하자면,
각각의 Account에서는 CloudTrail을 활성화하면 각각의 IAM API 내역들이 Default EventBus를 통해 흐르게 된다.
이 때, Default EventBus는 API 내역을 감시하기 위해서는 Event Rule을 설정할 수 있다.
(Default EventBus 외에 Custom EventBus가 존재한다는 사실을 알고 있어야 한다. 중요 ! )
Event Rule에서는 어떤 API 내역들을 Capture 할 것인지 Event Pattern을 정의할 수 있고 Event Pattern을 충족하는 API를 어떤 Target으로 보낼지 정의할 수 있다.
Target 으로는 EventBus, CloudWatch Logs, Kinesis 등 여러가지가 존재하는데, 여기서는 SNS, EventBus와 CloudWatch Logs 3개를 Target으로 설정하였다.
각 Account에서 Security Account으로 IAM API를 보내게 되면 Security Account에서는 또 한번 더 Target으로 보내게 된다.
Target으로는 SNS와 CloudWatch Logs로 보내도록 할 것이며, SNS는 Slack Notification 용도로 활용하고, CloudWatch Logs는 Subscription Filter를 걸어서 OpenSearch Index로 보낼 것이다.
(각각의 API 내역은 OpenSearch에서 개별 Document로 존재할 것이며, OpenSearch 및 Kibana 활용도에 따라서 감사할 수 있는 범위가 천지 차이가 될 것이다.)
## 고려 사항
1. 각 Account에 대한 인증을 Terraform에서 어떻게 수행할 것인지?
방법은 다양할 것이다.
보안을 위해 각 Account에 대한 접근은 AssumeRole을 통해 발급 받은 액세스키와 시크릿키, 임시 토큰 값을 ~/.aws/credentials 파일에 alias로 설정한 뒤 _provider.tf 파일에서 Profile=${alias}로 접근
2. Multi Account에서 IAM 권한은 어떻게 설정해야 하는지?
단일 Account일 경우 Resource 혹은 Principle 한 곳에서만 API Action이 Allow일 경우 수행할 수 있지만
Cross Account일 경우 A <-> B 각각에 대한 Policy가 충족이 되어야 한다. 혹은 신뢰관계를 설정하여 sts:assumeRole을 통해 임시 Token을 발급받아 접근해야 한다.
3. Default EventBus와 Custom EventBus의 차이점
: 이 부분때문에 시간이 좀 소요되었다.
4. A, B, C, .. 계정의 EventBridge -> Security 계정의 EventBus로 Event를 보낼 때 IAM Policy 적용
아래의 문서 참조
공식 문서 : https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-bus-perms.html
5. OpenSearch를 대상으로 구독 필터를 생성할 경우 내부적으로 Lambda가 생성이 된다.
이 때, Lambda -> OpenSearch로 https에 대한 Inbound가 막혀 있을 경우 구독 필터가 정상적으로 설정이 되었어도 Lambda -> OpenSearch Timeout 발생 이슈가 존재한다.
Timeou이 발생하는지 확인하는 방법은 Lambda의 Monitoring 혹은 CloudWatch Logs를 보면 확인할 수 있으며, SG 기반으로 Allow 해주면 된다.
또한, 이러한 이유로 인해 Terraform으로 구독 필터를 만들 경우 Error가 발생하며, Lambda 소스코드 및 Lambda function을 Terraform으로 직접 생성해주어야 한다. 이러한 이슈로 인해 웹 콘솔에서 수동으로 생성해주었다.
6. OpenSearch에서 Alert 기능이 많은 정보를 전달해주지 못하는 것 같다 (이 부분은 잘 몰라서 정확 X)
=> 이러한 이유로 인해 따로 Lambda를 만들어서 Slack Alert를 보내도록 설정하였다.
{monitor={_id=, _version=1, name=IAM_CreateUser, enabled=true}, results=[{_shards={total=5, failed=0, successful=5, skipped=0}, hits={hits=[], total={value=0, relation=eq}, max_score=null}, took=3, timed_out=false}], periodStart=2022-04-06T07:12:40.849Z, periodEnd=2022-04-06T07:13:40.849Z, error=null, trigger={id=nEi4_X8BKGQCku7dywj0, name=IAM_CreateUser, severity=1, actions=[{name=SecuritySlackChannel}]}, alert=null}
다음 글에서는 Terraform 폴더 구조 및 코드를 어떻게 작성하였는지에 대해 글을 써보겠다.
'AWS' 카테고리의 다른 글
[AWS] Multi Account에서 IAM 내역 감사하기 #3 - 테라폼으로 인프라 프로비저닝 2 (0) | 2022.04.17 |
---|---|
[AWS] Multi Account에서 IAM 내역 감사하기 #2 - 테라폼으로 인프라 프로비저닝 (0) | 2022.04.15 |
[Python] CLB 인스턴스 상태 및 등록, 해제하는 파이썬 스크립트 (0) | 2022.01.06 |
[Lambda] IAM, SG 변경 사항을 Slack으로 알람 받기 (0) | 2022.01.03 |
[Lambda] CW Logs 구독 필터와 Lambda 연결, Slack으로 인스턴스 스케줄러 동작 내역 확인하기 (0) | 2021.12.15 |