[AWS][CloudFormation] CFN 스택 자원 보호하기

컴퓨터공학/IaC

2022. 09. 23.

의도치 않은 자원 삭제 방지

AWS 관리 콘솔을 잘못 조작해서, 혹은 API를 호출할 때 실수해서 CloudFormation 스택을 지워버린다면 대참사가 벌어진다. 보안 측면에서 의도치 않은 스택 및 자원의 변경을 미연에 방지하기 위해 AWS CloudFormation에서 다음 네 가지 방식을 고려해 볼 수 있다.

 

  • IAM 정책 (IAM Permissions)
  • 자원별 삭제 정책 (Deletion Policy)
  • 스택 종료 방지 (Termination Protection)
  • 스택 정책 (Stack Policy)

언급된 방식을 철처히 활용하여서 불의의 사고를 방지하고 CFN 스택을 지키도록 하자.

 

IAM 정책

가장 기초적인 방법은 IAM 유저에게

 

1) 스택 삭제(delete-stack) 권한과

2) 스택 정책 수정(set-stack-policy) 권한

3) 종료 방지 정책 수정(update-termination-policy) 권한

 

이러한 권능을 주지 않음으로써 위해 행위를 차단하는 것이다.

자원 별 삭제 정책

앱과 데이터의 생명주기는 같지 않은 경우가 많다. 보통, 앱의 수명이 다 하더라도 데이터베이스에 쌓인 데이터는 지우지 않고 보존하게 된다. 이런 맥락에서 S3 버킷이나 RDS 인스턴스 등에는 Deletion Policy를 명세할 수 있다.

 

DeletionPolicy 속성 - AWS CloudFormation

CloudFormation 외부에서 리소스를 수정하려는 경우 보관 정책을 사용한 다음 스택을 삭제합니다. 그렇지 않으면 리소스가 CloudFormation 템플릿과 동기화되지 않아서 스택 오류가 발생할 수 있습니다.

docs.aws.amazon.com

 

CFN 템플릿에서 자원을 명세할 때 이쪽 설정을 Retain으로 주면, 설령 스택이 삭제되더라도 해당 자원은 유지된다. DeletionPolicy 속성을 적용할 수 있는 자원의 목록은 첨부한 링크에서 확인할 수 있다.

MyBucket:
  Type: AWS::S3::Bucket
  DeletionPolicy: Retain

Termination Protection 옵션

CFN 스택의 Termination Protection을 활성하면 이 스택은 삭제되지 않는다. 해당 옵션을 다시 끄지 않는 한 말이다.

종료 방지가 켜진 스택을 삭제하려고 하면, 종료 방지를 끄라고 안내된다.

Stack Policy

 

Prevent updates to stack resources - AWS CloudFormation

During a stack update, AWS CloudFormation automatically updates resources that depend on other updated resources. For example, AWS CloudFormation updates a resource that references an updated resource. AWS CloudFormation makes no physical changes, such as

docs.aws.amazon.com

스택 정책은 스택 업데이트 행위가 영향력을 행사할 수 있는 자원의 범위를 제약하는 정책이다. 첨부한 문서를 참고하여 스택 정책의 특별한 신택스를 따라 JSON 문서를 작성하기 바란다.

 

명심해야 할 것은 "스택 업데이트"에 대한 정책이란 점이다. "스택 삭제"에 의한 자원의 삭제와는 관련이 없다. 

 

아래 예시는 EC2Instance라는 논리적 이름의 EC2 자원을 변경하고자 하는 스택 업데이트가 발생한다면 그것을 거부를 하는 정책을 보여준다.

{
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "LogicalResourceId/EC2Instance",
            "Condition": {
                "StringEquals": {
                    "ResourceType": "AWS::EC2::Instance"
                }
            }
        }, {
            "Effect": "Allow",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "*"
        }
    ]
}

템플릿과 스택 간 불일치 해소

Drift Detection

CFN 스택은 변화 탐지 기능을 제공한다. 스택 내부에 배치된 자원의 설정을 CFN을 거치지 않고 사람이 직접 수정하게 되면, CFN 템플릿의 자원 명세와 현실의 자원 간 괴리가 발생한다. 이를 두고 Drift가 발생했다고 일컫는다.

 

Drift는 일종의 기술 부채인 것이다. 해결을 보지 않고 그대로 두게 되면

 

1) 새 환경에서 추가적인 변경 사항을 재현하기 어렵고

2) 은연중에 발생한 변경점이라 추적하기 어려우며

3) 잠재적으로 휴먼 에러를 인입시키게 된다.

 

따라서 Drift Detection 기능으로 CFN 템플릿과 실제 자원 사이의 괴리를 자주 점검하고 변경점을 CFN 템플릿 쪽으로 반영해 주는 것이 좋다.

Drift Detection 써 보기

CloudFormation 스택> Stack actions> Detect drift 이후, 잠시 시다렸다가 View drift results로 이동한다.

Detect drift 이후 View drift results 로 이동하시오.
View drift results 화면 - 현재 모든 자원은 명세와의 괴리가 없다.

위 이미지는 드리프트가 없는 상태를 보여준다. 모두 IN_SYNC로 상태가 표시되고 있다.

 

드리프트가 있는 자원을 선택> View Drifs results 진입

드리프트가 있을 경우 라인 아이템을 선택해, 어떤 차이가 발생하고 있는지 구체적으로 비교해서 보는 게 가능하다.

 

특이하게 람다 자원의 경우 CPU 아키텍처를 CFN 템플릿에 명세하지 않으면 Drift로 걸고 넘어지는 것 같다.

Expected와 Actual의 차이를 확인할 수 잇다.

'컴퓨터공학 > IaC' 카테고리의 다른 글

[Terraform] Provisioner  (0) 2023.07.23
[Terraform] 설치형 Grafana 인스턴스 1대 띄우기  (0) 2023.07.15