보안 정책을 통하여 유저에게 MFA 강제하기

jakemraz's glacier·2020년 8월 24일
1

AWS

목록 보기
2/2

AWS 보안을 더 강력하게 하는 방법에 무엇이 있을까?

여러가지 방법이 있겠지만, AWS Console에 접속하려는 사용자에게 MFA(Multi Factor Authentication) 사용을 강제하는 방법 역시 좋은 Practice중 하나가 되겠다.

MFA 설정을 해놓지 않은 사용자가 AWS Console에서 아무 작업도 할 수 없도록 하려면 어떻게 해야 할까?

방법은 아래의 링크에서 확인 하자

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html

기본적인 원리는 Force_MFA 라는 Policy를 User에게 줌으로써, MFA 설정이 안돼있으면 AWS 상에서 아무것도 못하도록 하는 것이다.

따라서 Force_MFA Policy가 있는 유저는 무조건 MFA 설정을 해야 한다.

이 때 Force_MFA Policy는 아래의 링크에서 찾을 수 있다.

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

위 문서를 참고하여 Force_MFA Policy를 생성 후 유저에게 Attach 하면, 해당 유저는 MFA 등록 없이는 AWS를 사용 할 수 없다.

위 방법을 그대로 사용 하는 경우 문제가 하나 있는데, 신규 사용자 생성 시 첫 로그인 때 비밀번호를 필수적으로 바꾸도록 Require password reset 옵션을 켜놓는 경우 MFA 설정 전에 '비밀번호 변경'에 대한 권한이 없기 때문에 해당 사용자는 비밀번호 변경을 할 수 없으며 따라서 로그인 역시 불가능하게 된다.

이때 발생하는 에러 메세지는 아래와 같다.

Either user is not authorized to perform iam:ChangePassword or entered password does not comply with account password policy set by administrator

이 문제를 해결하기 위해선 MFA 설정 전에 패스워드 변경에 대한 처리를 할 수 있도록 Force_MFA Policy를 아래와 같이 변경해야 한다.

{
    "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:ChangePassword",
                "iam:GetAccountPasswordPolicy",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

문서에 있는 것과 다른 점은 크게 3군데 이다.

  1. AllowChangePassword 정책 추가
  2. AllowGetAccountPasswordPolicy 정책 추가
  3. DenyAllExceptListedIfNoMFA의 NoAction에 "iam:ChangePassword", "iam:GetAccountPasswordPolicy" 추가

위의 3가지를 추가함으로써, MFA 설정 전에도 유저가 패스워드를 변경 할 수 있도록 한다.

profile
SOFTWARE DEVOPS ENGINEER

2개의 댓글

comment-user-thumbnail
2020년 11월 5일

안녕하세요. 해당 MFA 정책 부여 후 초기 패스워드 변경, MFA 등록 강제화는 잘 해결되었는데 이후에 CodeDeploy, CodeCommit과 같은 서비스를 개발툴(이클리스와 같은)을 통해 연결이 안되는 증상이 있습니다. 해당 정책 제거하면 잘 되구요. 이 경우 어떤 부분을 좀 고려해야 할지.... 의견을 좀 구해봅니다..

1개의 답글