AWS 기술 블로그

카카오(Kakao Corp.)의 AWS Control Tower 환경에서 권한 최소화 및 계정 연동 자동화 구현하기

개요 및 배경

카카오는 메신저인 카카오톡을 비롯하여 콘텐츠, 커머스, 모빌리티, 금융 등 다양한 분야에서 서비스를 운영하는 디지털 플랫폼 기업입니다. 특히 최근 AI 기술의 급속한 발전과 함께 대화형 AI, 추천 시스템, 자동화 솔루션 등 AI 기반 서비스 개발이 활발해지면서, 빠른 실험 배포, 비용 최적화뿐만 아니라 AI 워크로드를 위한 확장 가능한 인프라에 대한 요구가 증가하고 있습니다. 카카오는 이에 대응하기 위해 AWS 도입을 확대하고 있으며, 각 조직에서 독립적인 AWS 계정을 활용해 다양한 서비스를 개발 및 운영을 시작하고 있습니다. 이러한 대규모 다중 계정 환경의 각 계정별로 서로 다른 보안 설정과 권한 체계가 적용되는 과정에서, 전사 차원의 통합된 보안 거버넌스 확립이 시급한 과제로 대두되었습니다. 특히 AI도입과 같이 빠르게 변화하는 비즈니스 요구사항에 대응하면서도 일관된 보안 기준을 유지해야 하는 딜레마가 카카오의 클라우드 운영 전략에서 핵심적인 해결 과제가 되었습니다.

주요 과제

다중 계정 운영 방식은 조직별 자율성과 보안을 강화할 수 있지만, 계정 수가 증가함에 따라 중앙 집중식 관리의 필요성이 대두되었고, 각 계정 간의 일관성 있는 보안 정책 적용과 효율적인 권한 관리가 점점 더 어려워지는 상황에 직면했습니다. 이로 인해 다음과 같은 주요 과제들이 발생했습니다:

  1. 과도한 권한 부여 및 권한 관리 복잡성: 다중 계정 환경이 확장될수록 사용자별로 부여되는 권한이 과도하게 넓어지거나 일관되지 않게 운영될 가능성이 높아집니다. AWS Control Tower 환경에서는 기본적으로 AWS IAM Identity Center를 통해 사용자 인증 및 권한 부여를 관리하며, 카카오 또한 초기에는 AWS Managed Permission Set들을 그대로 활용해 왔습니다. 하지만 이러한 Managed Permission Set은 카카오가 필요한 권한 외에도 추가적인 권한이 포함되어 있었고, 이는 최소 권한 원칙에 위배되는 상황으로 이어졌습니다. 이런 상황이 지속되면 보안 리스크는 물론, 운영 혼란과 감사를 위한 가시성 확보에도 어려움이 생깁니다.
  2. 신규 계정 연동의 비효율성: AWS Control Tower를 통해 다중 계정 환경을 관리하는 조직에서는 새로운 계정이 생성될 때마다 IAM Identity Center에 적절한 권한을 할당하는 작업이 필요합니다. 카카오는 AWS 교육 및 실습 시에도 AWS Control Tower의 Account Factory 기능을 사용하여 AWS 계정을 프로비저닝하여 사용하고 종료하는 형태로 활용하기에 빈번하게 생성되는 계정들에 유저/그룹을 할당하는데 불편함이 있었습니다. 이 과정을 수동으로 진행하면 시간이 많이 소요되고 휴먼 에러가 발생할 가능성이 높으며, 계정 생성과 권한 할당 사이에 시간 지연이 발생하여 사용자가 새 계정에 즉시 접근할 수 없는 문제가 있었습니다.
  3. 규정 준수 및 보안 정책 관리의 어려움: 클라우드 환경에서 다중 계정 구조를 관리하는 기업들에게 일관된 보안 정책과 규정 준수는 가장 중요한 과제 중 하나입니다. 카카오는 AWS 클라우드를 사용하며 온프레미스와 AWS Direct Connect로 전용선 연결이 필요한 워크로드와 Standalone으로 독립적으로 사용하는 워크로드로 구분하여 운영하였고, 각각의 조직 유닛(Organization Unit, OU)에 맞는 보안 정책과 규정 준수가 필요했습니다. 또한 AWS Control Tower를 적용하기 이전에 파편화된 계정관리로 인해 각 계정마다 다른 보안 설정이 적용되어 전체적인 보안 상태를 파악하기 어려웠고, 계정 수가 증가함에 따라 각 계정에 수동으로 정책을 적용하는 것이 불가능해졌으며, 여러 계정에 걸쳐 규정 준수 상태를 실시간으로 모니터링하기 어려운 상황이었습니다.

해결 방향

이러한 문제를 해결하기 위해 카카오는 ‘조직의 보안 기준을 유지하면서도, 민첩하게 AWS 계정을 생성하고 운영할 수 있는 환경’을 만드는 것을 중요한 목표로 삼았습니다. AWS Control Tower를 클라우드 거버넌스의 출발점으로 선택한 이유는 다중 계정 운영에 필요한 표준을 중앙 집중 관리할 수 있기 때문이며, 이를 기반으로 다음 목표를 설정했습니다:

  1. 최소 권한 원칙(Least Privilege)을 모든 AWS 계정에 일관되게 적용
  2. 계정 생성부터 권한 연동까지의 프로세스 완전 자동화
  3. 조직 전체에 일관된 보안 정책 적용 및 규정 준수 강화

<그림1. AWS Control Tower 아키텍처>

솔루션 아키텍처 개요

카카오는 앞서 식별한 과제들을 체계적으로 해결하기 위해 AWS Control Tower 환경에서 보안 강화와 운영 효율성 향상을 동시에 달성할 수 있도록 구성된 다음 3가지 핵심 솔루션을 직접 구현했습니다:

  1. 최소 권한 원칙 구현: AWS IAM Access Analyzer를 활용한 실사용 권한 기반의 Custom Permission Set 생성
  2. 계정 생성 자동화: Amazon EventBridge + AWS Lambda를 통한 신규 계정 자동 권한 할당
  3. 규정 준수 자동화: AWS Control Tower Controls를 활용한 일관된 보안 정책 적용

구현 방안

1. 최소 권한 원칙 구현

AWS Managed Permission Set에서 카카오에는 불필요한 권한을 제거하고, 실제 사용된 권한만을 포함한 Custom Permission Set을 생성하여 최소 권한 원칙을 구현합니다. 하지만 AWS Control Tower 환경에서는 SCP(Service Control Policy)로 보호되는 AWS CloudTrail를 저장하는 Amazon S3 버킷에 대한 접근 제한과 AWS Managed Permission Set의 읽기 전용 특성으로 인한 직접 수정 불가능 등의 제약사항이 존재하여, 이를 해결하기 위해 별도의 접근 방식이 필요했습니다.

구현 단계

단계 1: Logging 계정의 S3 버킷 정책 변경

<그림2. AWS CloudTrail 로그가 저장되는 S3 버킷 정책 변경>

Management Account에서 Logging Account의 AWSControlTowerExecution 역할을 수임하여 CloudTrail 로그 S3 버킷에 다음 정책을 추가합니다: (정책 내용 중, amzn-s3-demo-bucket, optional-prefix, organization-id는 조직 환경에 맞게 수정하셔야 합니다.)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PolicyGenerationBucketPolicy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket",
        "arn:aws:s3:::amzn-s3-demo-bucket/optional-prefix/AWSLogs/organization-id/${aws:PrincipalAccount}/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "organization-id"
        },
        "StringLike": {
          "aws:PrincipalArn": "arn:aws:iam::${aws:PrincipalAccount}:role/service-role/AccessAnalyzerMonitorServiceRole*"
        }
      }
    }
  ]
}

단계 2: CloudTrail 이벤트 기반 정책 생성

IAM Access Analyzer에서 최소 권한을 적용할 역할을 선택하고 ‘CloudTrail 이벤트를 기반으로 정책 생성’을 실행합니다:

단계 3: Permission Set 연동

생성된 최적화 정책을 IAM Identity Center의 Permission Set에 연결:

  1. Customer managed policies의 Attach policies로 새 정책을 연결합니다.
  2. 기존 AWS managed policy Detach합니다.
  3. 최소 권한만 포함된 정책으로 교체합니다.
  4. 기존 AWS managed policy를 제거합니다.
  5. 최종적으로 최소 권한만 포함된 정책이 연결된 것을 확인할 수 있습니다:

2. 신규 계정 연동 자동화

AWS Control Tower의 라이프사이클 이벤트를 활용하여 신규 계정 생성 시 자동으로 IAM Identity Center에 권한을 할당하는 워크플로우를 구축합니다. 이를 통해 기존에 수동으로 계정을 연동하던 프로세스를 완전히 자동화하여 운영 효율성을 크게 향상시키고, 계정 생성 후 즉시 적절한 권한이 할당되도록 하여 개발자들이 지연 없이 작업을 시작할 수 있는 환경을 제공합니다.

<그림3. 신규 계정 연동 자동화>

구현 단계

단계 1: EventBridge 규칙 생성

CreateManagedAccount 이벤트를 감지하는 EventBridge 규칙을 생성합니다:

{
  "source": ["aws.controltower"],
  "detail-type": ["AWS Service Event via CloudTrail"],
  "detail": {
    "eventName": ["CreateManagedAccount"]
  }
}

단계 2: Lambda 함수 구현

새 계정에 자동으로 권한을 할당하는 Lambda 함수를 작성합니다. Lambda 함수는 Python으로 작성되었으며, boto3 SDK의 create_account_assignment를 사용하여 IAM Identity Center API와 통신합니다:

import boto3
import json
import time

def lambda_handler(event, context):
    # EventBridge 이벤트에서 새 계정 ID 추출
    try:
        event_detail = event['detail']
        new_account_id = event_detail['serviceEventDetails']['createManagedAccountStatus']['account']['accountId']
        state = event_detail['serviceEventDetails']['createManagedAccountStatus']['state']

        if state != 'SUCCEEDED':
            return {
                'statusCode': 400,
                'body': json.dumps('Account creation failed')
            }

        # SSO-admin 클라이언트 생성
        sso_admin = boto3.client('sso-admin', region_name='<region>') #region 예시 : ap-northeast-2

        instance_arn = 'arn:aws:sso:::instance/<instanceArn>'
        # 예시: instance_arn = 'arn:aws:sso:::instance/ssoins-7223f7eef79824e1'
            
        # 계정 할당 생성
        response = sso_admin.create_account_assignment(
            InstanceArn=instance_arn,
            TargetId=new_account_id,
            TargetType='AWS_ACCOUNT',
            PermissionSetArn='arn:aws:sso:::permissionSet/<instanceArn>/<PermissionSetArn>',
            # 예시: PermissionSetArn='arn:aws:sso:::permissionSet/ssoins-7223f7eef79824e1/ps-ef450dbf3b354e78',
            PrincipalType='GROUP', #'USER' 혹은 'GROUP'
            PrincipalId='<PrincipalId>'
            # 예시: PrincipalId='c458c478-2031-706a-58c1-9909eee45b50'
        )

        # 프로비저닝 상태 확인
        request_id = response['AccountAssignmentCreationStatus']['RequestId']

        while True:
            status_response = sso_admin.describe_account_assignment_creation_status(
                InstanceArn=instance_arn,
                AccountAssignmentCreationRequestId=request_id
            )
            status = status_response['AccountAssignmentCreationStatus']['Status']

            if status == 'SUCCEEDED':
                print(f"Account assignment created successfully for account {new_account_id}")
                break
            elif status == 'FAILED':
                raise Exception(f"Account assignment failed: {status_response}")
            elif status == 'IN_PROGRESS':
                time.sleep(2)
            else:
                raise Exception(f"Unknown assignment status: {status_response}")

        return {
            'statusCode': 200,
            'body': json.dumps(f'Successfully assigned permissions to account {new_account_id}')
        }

    except Exception as e:
        print(f"Error: {str(e)}")
        return {
            'statusCode': 500,
            'body': json.dumps(f'Error creating account assignment: {str(e)}')
        }

단계 3: IAM 권한 설정

Lambda 함수에 필요한 IAM 정책을 추가합니다:

{
  "Effect": "Allow",
  "Action": [
    "sso:CreateAccountAssignment",
    "sso:DescribeAccountAssignmentCreationStatus",
    "sso:ListInstances",
    "sso:ListPermissionSets",
    "sso:DescribePermissionSet",
    "sso:GetPermissionSet",
    "sso:ProvisionPermissionSet"
  ],
  "Resource": "*"
}

3. Control을 활용한 규정 준수

AWS Control Tower의 Controls를 활용하여 조직 전체에 일관된 보안 정책을 적용하고 규정 준수를 자동화합니다. Control은 예방(Preventive), 탐지(Detective), 사전(Proactive) 제어의 3가지 유형으로 동작하며 지침은 3가지 범주(필수, 적극 권장, 선택적)로 나누어집니다. 카카오는 여기서 예방 제어에 집중을 하였는데 예방 제어는 문제가 발생하기 전에 미리 차단하는 방식으로 필수적이고 강력한 보안 요구사항에 대해 적용할 수 있습니다. 이에 따라 SCP(Serivce Control Policies), RCP(Resource Control Policies), 그리고 선언적 정책(Declarative Policy)을 조합하여 모든 계정에 동일한 보안 기준을 강제 적용하며, 실시간 모니터링을 통해 정책 위반 사항을 즉시 감지하고 대응할 수 있게 체계를 구축하였습니다. 또한 카카오는 기본적인 보안 태세 강화를 위해 적극 권장의 Controls는 대부분 적용을 하였으며 카카오의 규정 준수 목표에 따라 아래 선택적 Controls를 추가로 적용하였습니다.

적용된 주요 Controls

1. 루트 사용자 보호:

  • [AWS-GR_RESTRICT_ROOT_USER_ACCESS_KEYS]: 루트 사용자 액세스 키 생성 금지, 루트 계정의 프로그래밍 방식 액세스를 차단하여 가장 높은 권한의 무단 사용을 방지합니다.
  • [AWS-GR_RESTRICT_ROOT_USER]: 루트 사용자 작업 제한, 루트 사용자의 일상적인 관리 작업을 제한하여 계정 탈취 시 피해를 최소화합니다.

2. 데이터 보안 강화:

  • [AWS-GR_AUDIT_BUCKET_LOGGING_ENABLED]: S3 버킷 로깅 구성 변경 금지, 감사 추적을 위한 로그 설정이 임의로 변경되는 것을 방지하여 규정 준수를 보장합니다.
  • [CT.S3.PV.5]: S3 리소스 호출 시 전송 중 데이터 암호화 요구, 모든 S3 통신에서 HTTPS를 강제하여 데이터 전송 중 보안을 보장합니다.

3. 리소스 공유 제한:

  • [CT.EC2.PV.7]: EBS 스냅샷 공개 공유 금지, 민감한 데이터가 포함된 스냅샷의 의도치 않은 공개를 방지합니다.
  • [CT.EC2.PV.11]: AMI 공개 공유 금지, 조직의 커스텀 이미지가 외부에 노출되어 보안 취약점이 드러나는 것을 방지합니다.

4. 네트워크 보안 강화: (인터넷 연결이 필요 없는 워크로드에만 선택적으로 적용)

  • [AWS-GR_DISALLOW_VPC_INTERNET_ACCESS]: VPC 인스턴스의 직접 인터넷 액세스 금지, 인스턴스가 인터넷에 직접 노출되는 것을 방지하여 외부 공격 표면을 줄입니다.
  • [CT.EC2.PV.8]: 인터넷 게이트웨이를 통한 VPC 연결 금지, 승인되지 않은 인터넷 연결을 차단하여 데이터 유출 위험을 방지합니다.

결과 및 마무리

카카오는 AWS Control Tower 기반 보안 거버넌스 구축을 통해 다중 계정 환경에서 발생하는 권한 관리 복잡성과 운영 비효율성 문제를 체계적으로 해결했습니다. 이 프로젝트를 통해 IAM Access Analyzer를 활용한 최소 권한 원칙 구현, Amazon EventBridge와 AWS Lambda를 통한 신규 계정 자동 권한 할당, 그리고 AWS Control Tower의 Controls를 활용한 일관된 보안 정책 적용이라는 세 가지 핵심 솔루션을 구현했습니다.

구현 결과 보안 강화 측면에서는 과도한 권한 부여 문제를 해결하고 전체 보안 환경을 크게 강화활 수 있었으며, 운영 효율성 향상 면에서는 계정 생성부터 권한 할당까지의 프로세스를 완전 자동화하여 운영 오버헤드를 대폭 감소시키고 휴먼 에러를 방지하는 효과를 거두었습니다. 또한 실시간 규정 준수 모니터링 및 보고 체계를 확립하고 자동화된 정책 적용으로 일관성을 보장하게 되었습니다.

카카오는 이러한 자동화를 통해 개발자 생산성과 보안 요구사항 간의 균형을 유지하며 지속적인 개선을 통해 더욱 강화된 보안 체계를 구축해 나가고 있습니다. 지금까지 소개해드린 카카오의 AWS Control Tower와 IAM Identity Center를 활용한 통합 자동화 사례는 대규모 AWS 환경을 관리하는 조직에게 큰 도움이 될것이며, AWS 환경에서 보안과 효율성을 동시에 확보하는 실용적인 접근 방식을 제시하는 유용한 참고 사례가 될 것입니다.

오서호

오서호

오서호님은 KAKAO의 보안인프라를 담당하는 Architect로 재직 중입니다. 조직 System 전반에 균일한 정보보호 경험을 제공하기 위해Endpoint, Network, Cloud, Application 분야의 통제활동을 수행하고 있습니다. 접근통제 관점에서 Workload 환경을 분석하고 로그 집중화를 통해 모니터링의 민첩성을 강화하는데 기여하고 있습니다.

김수환

김수환

김수환님은 KAKAO에서 정보보안 업무를 담당하며, Network 및 host firewall 기반의 접근제어 정책과 보안인프라를 운영하고 있습니다. Cloud 및 On-Premise 환경의 보안 아키텍처를 관리하고 있으며, IDC 전환 과정의 보안 이관, 보안 로그 분석 및 운영 자동화를 통해 안정적이고 효율적인 보안 체계 구축에 힘쓰고 있습니다.

Myeongsu Jeon

Myeongsu Jeon

전명수 솔루션즈 아키텍트는 금융, IT서비스, 제조 등 다양한 IT 산업군에서 쌓은 경험 및 전문지식을 바탕으로, 현재는 AWS에서 고객분들의 Digital Transformation 및 IT Modernization을 위한 컨설팅 및 기술적인 도움을 드리고 있습니다.

Munkyu Seong

Munkyu Seong

성문규 솔루션즈 아키텍트는 금융 및 디지털 네이티브 고객이 AWS 클라우드를 잘 활용하여 비즈니스 결과를 얻을 수 있도록, 최적의 아키텍처를 구성하기 위한 설계 가이드와 기술을 지원하고 있습니다.