[AWS] 표본 아키텍처를 운영할 때 주의점 - MFA 설정

2025. 7. 25. 20:38·Cloud

AWS 표본 아키텍처를 운영할 때 가장 먼저 고려해야 할 부분은 보안이다. 특히 루트 사용자 계정과 IAM 사용자 계정을 어떻게 구분하고 운영하느냐에 따라 보안 수준은 크게 달라진다. 이번 글에서는 AWS 계정을 안전하게 운영하기 위해 꼭 알고 있어야 할 MFA 설정을 활용하여 IAM 사용자 관리와 암호 정책 설정 방법까지 정리해보았다.

루트 사용자 MFA 설정

루트 사용자는 계정의 모든 권한을 갖고 있기 때문에, 탈취된다면 보안에 매우 큰 문제가 발생하게 된다. 따라서 기본적으로 MFA를 활성화해준다. 물론, 운영 환경에서 루트 사용자 뿐만 아니라 모든 사용자들의 MFA가 활성화 되어 있는 것이 기본이다.

먼저, 아래 과정을 따라 루트 사용자의 MFA를 활성화 해보자.

 

먼저, 루트 사용자로 로그인 후, 화면 우측 상단 계정을 클릭하고 [보안 자격 증명]을 클릭해준다.

 

[MFA 디바이스 할당]을 클릭해준다.

 

다음으로 MFA 디바이스를 선택하는데 보통 Google OTP를 활용한 [인증 관리자 앱]을 많이 사용하고, [패스키 또는 보안 키] 옵션도 자주 사용된다. 우리는 [인증 관리자 앱]으로 MFA 디바이스를 등록해보자.

 

플레이스토어에서 Google OTP를 다운로드 받, 아래 [QR 코드 표시]를 눌러 해당 QR 코드를 앱의 카메라로 인식해서 등록해주면 된다. 

앱에서 발생되는 첫번째 코드와 두번째 코드를 3번 항목에 적어주고, 우측 하단에 MFA 추가 버튼을 눌러주면 등록이 완료된다.

 

등록 후, 다시 [보안 자격 증명] 화면으로 돌아오면 아래와 같이 정상적으로 등록된 것을 확인할 수 있다.

 

 

루트 사용자와 관리자용 IAM 사용자 구분하기

보통 루트 사용자는 평소에는 사용하지 않고, Administrator와 같은 AWS 관리 정책을 부여한 관리자용 IAM 사용자를 사용한다. 

하지만 몇몇 작업은 루트 사용자만 할 수 있다. 다음은 루트 사용자만 할 수 있는 주요 작업들이다. 이러한 작업들을 제외하고는, 관리자용 IAM 사용자를 활용하도록 하자.

  • 계정 설정 변경(계정 이름, 이메일 주소, 루트 사용자 암호 등)
  • AWS 계정 관리자가 자기 IAM 사용자의 IAM 정책을 잘못해서 취소했을 떄 IAM 정책 편집과 복원
  • IAM 사용자 및 IAM 역할이 청구 정보와 비용 관리 콘솔에 액세스할 수 있도록 허용
  • AWS 계정 해지
  • AWS Support 플랜 변경과 취소 

 

IAM 사용자 비밀번호 관리

AWS는 기본적으로 IAM 사용자 암호에 대해 다음과 같은 기본 정책을 제공한다. 

  • 암호는 최소 8자, 최대 128자까지 가능
  • 대문자, 소문자, 숫자, 특수문자 중 3가지 이상 포함 필요
  • 이메일 주소와 동일한 암호는 사용할 수 없음

하지만 이 정도는 너무 기본적인 수준이다. 보안 수준을 더 높이고 싶다면 ‘사용자 지정 정책’을 설정해야 한다.

 

AWS IAM 콘솔에서는 암호 정책 설정 화면에서 다음과 같이 암호 길이, 필수 문자 유형, 만료 주기 등 다양한 조건을 설정할 수 있다.

최소 암호 길이 6 ~ 128자
대문자 필수 여부 A~Z 포함 여부 설정
소문자 필수 여부 a~z 포함 여부 설정
숫자 필수 여부 최소 1개 이상의 숫자 포함
특수문자 필수 여부 @#$%^&*()_+=[]{} 등
암호 유효 기간 1 ~ 1,095일 (약 3년)
만료 시 재설정 강제 여부 유효 기간 종료 시 강제 변경 요구
사용자 암호 변경 허용 여부 자기 암호를 바꿀 수 있도록 허용할지
암호 재사용 제한 예전 암호를 다시 사용하지 못하도록 설정 가능
 

특히, 암호 유효 기간을 설정해두면 해당 기간이 지나기 전에 AWS 콘솔에 경고 메시지가 나타나고, 만료되면 로그인 자체가 불가능해진다. 따라서 관리자는 해당 만료 정책을 잘 활용해 정기적으로 암호를 갱신하게끔 유도할 수 있다.

단, 유효 기간 설정은 곧바로 적용되므로 기존 암호 중에서 유효 기간이 지난 것은 만료되어 IAM 사용자를 이용하는 사람이 로그인할 수 없으므로 암호 변경 작업은 AWS 관리자가 해줘야한다는 점을 주의한다.

 

IAM 사용자 지정 암호 정책 생성

AWS IAM 서비스에 들어가 좌측 메뉴의 [계정 설정]을 누르고 아래 사진의 편집 버튼을 클릭해준다.

 

아래와 같이 사용자 지정 암호 정책을 편집할 수 있다.

위에서 설정한 정책은 모든 IAM 사용자들에게 적용된다.

 

IAM 사용자의 MFA 관리

보안을 강화하기 위해 IAM 사용자에게 MFA(Multi-Factor Authentication) 설정은 필수이다. 단순히 설정만 하는 걸 넘어서, MFA가 설정되지 않으면 어떤 작업도 수행할 수 없도록 정책을 강제하는 방식도 사용된다.

MFA를 설정하지 않을 시 어떤 작업도 수행하지 못하게끄 설정하는 방법을 알보도록 하자.

 

MFA 강제 정책 생성

먼저, MFA 로그인을 강제할 정책을 생성해준다. [IAM] -> [정책]에 들어가 [정책 생성] 버튼을 클릭해준다.

 

위에서 다음 화면으로 넘어가기 전에, 아래 정책을 복사해준다. 해당 정책은 MFA를 설정하지 않으면 대부분의 작업을 Deny 하는 정책이다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey",
                "iam:GetAccessKeyLastUsed"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSigningCertificates",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSigningCertificate",
                "iam:ListSigningCertificates",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSSHPublicKeys",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSSHPublicKey",
                "iam:GetSSHPublicKey",
                "iam:ListSSHPublicKeys",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnGitCredentials",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "iam:DeleteServiceSpecificCredential",
                "iam:ListServiceSpecificCredentials",
                "iam:ResetServiceSpecificCredential",
                "iam:UpdateServiceSpecificCredential"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

 

[JSON] 버튼을 클릭하고 직접 정책을 편집해준다. 정책에는 위에서 복사한 정책을 붙여넣기 해준다. [다음]을 클릭해준다.

 

아래와 같이 제목은 Force_MFA, 설명은 "This policy allows users to manage their own passwords and MFA devices but nothing else unless they authenticate with MFA."와 같이 적어준다. 필자는 이미 해당 정책을 만들었기에 아래와 같이 중복된 정책이라고 발생하고 있다.

위처럼 설정 후 맨 하단에 정책 생성 버튼을 눌러 정책을 생성해주면 된다.

 

 

테스트 사용자 그룹에 MFA 강제 정책 연결

미리 만들어놨던 forcing_mfa 그룹에 위에서 만들어준 MFA 강제 정책을 연결해준다.

해당 IAM 그룹에 들어가서 [권한 추가] -> [정책 연결]을 클릭해준다.

 

먼저, 위에서 만들어준 MFA 강제 정책을 추가해준다.

 

다음으로, 해당 그룹에서 MFA를 설정하고 난 이후, 허용할 정책들을 연결해준다. 필자 같은 경우에는 EC2에 대한 권한을 추가해주었다. 이렇게 설정하게 되면, 해당 사용자 그룹의 IAM 사용자들은 MFA를 설정을 하고 나서야 EC2 서비스에 대한 권한들을 사용할 수 있게 되는 것이다. 

 

아래와 같이 성공적으로 정책이 연결된 것을 확인할 수 있다.

 

 

사용자 액세스 테스트

해당 테스트 사용자로 AWS에 로그인해서 EC2 서비스를 살펴보면 다음과 같이 권한이 없는 것을 확인할 수 있다.

 

MFA를 설정하기 위해 우측 상단의 계정을 클릭하고, [보안 자격 증명]을 클릭해준다.

 

 

[MFA 할당]을 클릭해준다.

 

디바이스 이름을 설정해주고, 구글 OTP를 사용하기 위해 [인증 관리자 앱]을 체크하고 [다음]을 클릭해준다.

 

[QR 코드 표시] 버튼을 클릭하여 나타나는 QR 코드를 구글 OTP에 등록하고 MFA 코드 1, 2를 적어준다. 모두 완료되었으면 우측 하단에 [MFA 추가] 버튼을 클릭해준다.

 

그러면 아래와 같이 성공적으로 MFA 디바이스가 할당된 것을 확인할 수 있다.

 

기존 세션에서 로그아웃하고, MFA를 이용하여 해당 계정으로 재로그인을 한다. 그리고 다시 EC2 서비스에 들어가서 확인을 해보면 아까와는 다르게, 다음과 같이 정상적으로 EC2 서비스를 이용할 수 있는 것을 확인할 수 있다.

 

결국, 모든 사용자 그룹에 MFA 강제 정책만 설정해준다면, 해당 그룹의 사용자들에게 MFA 활성화를 강제할 수 있게 된다.

 

Reference

  • https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html#tutorial_mfa_step1
  • 사타케 요이치 외 3명, ⌜IT 엔지니어를 위한 AWS 운영의 기본과 노하우⌟, 길벗, 2024, 504쪽
'Cloud' 카테고리의 다른 글
  • [AWS] Amazon CloudWatch
  • [AWS] AWS 로그 운영
  • [AWS] 점프 계정을 통한 효율적인 AWS 계정 운영
  • [AWS] AWS Well-Architected Framework
SummerToday
SummerToday
summertoday 님의 블로그 입니다.
  • SummerToday
    SummerToday
    SummerToday
  • 전체
    오늘
    어제
  • 인기 글

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리자
    • 분류 전체보기 (62)
      • OS & Network (4)
      • Cloud (11)
      • Container & DevOps (41)
      • Database (4)
      • Develop (0)
      • IaC (2)
  • 태그

    argocd
    Grafana
    AmazonSNS
    점프 계정
    container
    openebs
    계정 관리
    s2s vpn
    Kubernetes
    aws
    gitops
    Eni
    MariaDB
    cloud
    tailscale
    Galera Cluster
    EIP
    CloudWatch
    K8S
    CI/CD
  • hELLO· Designed By정상우.v4.10.3
SummerToday
[AWS] 표본 아키텍처를 운영할 때 주의점 - MFA 설정
상단으로

티스토리툴바