본문 바로가기

AWS/IAM

[AWS] MFA 강제적용 정책

안녕하세요.

이번에는 MFA(Multi Factor Authentication)가 Enable된 사용자만 부여된 권한을 사용할 수 있도록

설정을 해보겠습니다.

 

지난번 글(AWS CLI에서 MFA임시세션토큰 자동화)에서 언급 했던대로 아이디와 패스워드만으로 인증을

하는 것이 아닌 2차인증을 거치게하여 각종 침해사고 및 보안성 향상에 굉장히 도움이 되는

MFA를 강제적으로 적용하도록!!(이 좋은걸 왜 안써?!!) Policy를 만들어서 그룹이나 IAM 사용자에게

해당 Policy를 부착(Attach)하도록 하겠습니다.

 

사실.. 구글링 해보면(AWS Document에도 있음..!) MFA 생성을 강제하도록 하는 정책은 굉장히 많이 나와있습니다.

그럼에도 제가 또 글을 쓰는 이유는 무엇이냐면..!!

 

  1. AWS Document에서 제공하는 Policy는 사용자가 패스워드를 변경할 수 없다!!
  2. 구글링해서 나오는 대부분의 자료는 DeleteVirtualMFADevice 한줄이 빠져있어 MFA를 등록하다가
    세션을 이동하였을 때, 백앤드에서 생성된 임시 MFA를 삭제하지 못하여 오류가 생긴다!!

라는 이유로 글을 쓰게 되었습니다.. -0-..

 

먼저 1번 항목은 무슨말 이냐면.. IAM User을 생성해줄 때 아래와 같이 "사용자가 로그인시 패스워드를 변경하도록 함"

이라는 옵션이 존재합니다. AWS Document에서 제공하는 Json으로 Policy를 생성하면.. 사용자가 패스워드를 변경하지 못합니다.. -.-(로그인 못함.. 관리자한테 전화해야함.. 관리자 화남..)

 

IAM User가 최초 로그인 시 패스워드를 변경하도록 하는 옵션(Require password reset)

 

2번은.. AWS에서 MFA 생성을 요청하면 AWS 백앤드에서는 사용자에게 MFA Device ID를 할당해주기 위해
임시 MFA Device ID를 생성하게 됩니다.

그러나, MFA 생성 과정에서 컴퓨터가 폭발하거나, 세션이 종료되거나 만료 되거나 했을때, 백앤드에서 임시로

생성된 MFA Device를 삭제할 수 있는 권한이 없어서 아래와 같은 오류메세지가 나오게됩니다.

 

MFA 생성 진행 중..

 

MFA 생성 과정에서 Cancle 후 다시 생성요청을 했을때 발생하는 오류

 

 

이 오류를 구글에 검색하면 한 AWS Developer Forums에 다음과 같은 댓글이 있습니다.

 

대충 AWS CLI에서 생성된 MFA 정보를 검색하고 삭제하라는 얘기..

 

이처럼, 생성된 MFA를 삭제할 수 있는 권한이 존재해야합니다! 그렇지 않으면 관리자 귀찮아져요..

 

그럼 이제.. 각설하고 바로 Json 코드 드리겠습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowChangePassword",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword"
            ],
            "Resource": [
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowGetAccountPasswordPolicy",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary",
                "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"
            ],
            "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",
                "iam:DeleteVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/${aws:username}"
        },
        {
            "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:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:ChangePassword",
                "iam:GetAccountPasswordPolicy",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

코드에서 확인하실 수 있듯이 NotAction 섹션에 "iam:DeleteVirtualMFADevice" 이 구문이 들어가줘야 합니다!!

 

해당 Json을 복사하여 Policy를 생성하고, 생성된 Policy를 상황에 맞춰 그룹이나 IAM User에 Attach하시면 됩니다.

 

마지막으로 MFA 인증여부를 기반으로 Resource에 대한 접근허용 및 거부가 이루어지기 때문에,

MFA 등록을 한 사용자라도 로그아웃 후 재 로그인을 하여 MFA 인증을 거쳐야 정상적으로 부여된 권한을

사용할 수 있습니다!!

 

사실 가장 아쉬운 것은.. 아래 사진처럼 권한이 없다는 에러만 뱉어내면서 Resource 접근이 거부되기 때문에

사용자는 '뭐지?? 뭐가 잘못된거지?? 관리자 전화 해야지 -0-' 라고 생각하게 됩니다..

욕심 같아서는 AWS에서 관리형 정책으로 MFA Policy를 제공해주면서 'MFA 등록해야 쓰게해줄거야!'

라는 팝업을 띄워줬으면 좋겠네요..

 

불친절한 AWS Error..

 

그럼.. AWS 계정 털려서 6000$의 요금 폭탄을 맞는 불상사가 없길 기도하면서 글 마치겠습니다.

감사합니다.