IAM 사용자에게 MFA 설정을 강제해 보기

IAM 사용자에게 MFA 설정을 강제해 보기

IAM 사용자에게 MFA 설정을 강제해 보는 방법을 정리해 봤습니다.
Clock Icon2024.09.13

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 IAM 사용자에게 MFA 설정을 강제해 보는 방법을 정리해 봤습니다.

하고 싶은 것

jw-iammfaset-1

IAM 사용자에게는 MFA 설정을 위한 IAM 정책을 할당합니다. 그리고 EC2 인스턴스에 대한 접근 권한을 가지고 있는 IAM 그룹에 IAM 사용자를 추가합니다. 여기서 MFA 설정을 하지 않으면 IAM 사용자는 EC2 인스턴스에 접근할 수 없습니다.
※ 이번 블로그에서 EC2 인스턴스 생성은 생략하며, 이미 EC2 인스턴스가 생성되어 있다는 가정하에 테스트를 실시합니다.

IAM 정책 생성

MFA 설정을 강제하기 위해 아래 권한을 포함한 정책을 생성합니다.

{
    "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"
                }
            }
        }
    ]
}

해당 정책에 대한 설명은 AWS 공식 문서에서 확인할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html

IAM 사용자와 그룹 생성

jw-iammfaset-2

이어서 IAM 사용자를 생성하는데, 해당 IAM 사용자에게 조금 전 생성한 IAM 정책을 추가합니다.

jw-iammfaset-3

마지막으로 IAM 그룹을 생성합니다. IAM 그룹의 이름과, 추가할 IAM 사용자를 선택하고 해당 그룹에 할당할 정책을 선택합니다. 이번에는 테스트용이기 때문에 Amazon EC2에 대한 모든 권한을 할당했지만, 구성할 환경에 맞추어 적절하게 권한을 조정하도록 합시다.

IAM 사용자로 로그인

jw-iammfaset-4

You are not authorized to perform this operation. User: arn:aws:iam::x:xxxxxxxuser/test-jaewook is not authorized to perform: ec2:DescribeInstances with an explicit deny in an identity-based policy

접속한 해당 IAM 사용자는 권한이 없다는 메시지가 출력됩니다. 이 메시지로 확인할 수 있는 것은 IAM 그룹에 Amazon EC2에 대한 권한이 설정되어 있다고 하더라도 MFA 설정을 하지 않으면 Amazon EC2 리소스에 대한 접근이 제한될 수 있다는 점입니다.

jw-iammfaset-5

MFA 설정을 위해「보안 자격 증명」을 클릭합니다.

jw-iammfaset-6

「MFA 디바이스 할당」을 클릭합니다.

jw-iammfaset-7

해당 화면에서 MFA 설정을 진행합니다. MFA 설정 방법에 대해서는 아래 블로그를 참고해 주세요.

https://dev.classmethod.jp/articles/jw-create-iam-policy-to-grant-mfa-setup-permission-to-iam-users/#toc-mfa--

MFA 설정 후 접속

MFA 설정이 끝났다면, 한 번 로그아웃을 시도하고 다시 IAM 사용자로 로그인합니다.

jw-iammfaset-8

MFA를 설정했다면 이미지와 같이 MFA 코드를 요구하는 화면이 표시됩니다.

jw-iammfaset-9

마지막으로 EC2 콘솔 화면으로 들어가 보면, 정상적으로 EC2 인스턴스가 표시되는 것을 확인할 수 있습니다.

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.