MFA로 AWS 보안 강화하기

Young Woo Jung
Saltware
Published in
8 min readDec 26, 2019

MFA, 길게 풀어서 말하면 Multi-Factor Authentication, 한글로는 다중 인증 또는 다단계(?) 인증이라고 할수 있겠네요. 그럼 무슨뜻이냐 하면 “한개 이상의 수단, 방법 또는 절차를 통해서 특정한 행동을 할수 있는 권한을 부여"하는 거라고 저는 정의하고 있습니다. 간단한 예를 들자면 비밀번호를 이용해서 핸드폰 잠금해제를 하고 사진도 찍고 문자도 보낼수 있지만 인터넷 뱅킹을 한다던지 앱스토어에서 구매를 한다거나 할때는 생체정보 (얼굴 인식, 지문 인식) 또는 암호 (PIN — Personal Identification Number, 패턴 인식) 등 다른 인증방식을 거쳐야만 실행이 가능하도록 보안절차가 더 강화되고 있습니다.

자 그럼 MFA를 이용해서 IAM 유저들로 부터의 AWS 접근의 대한 보안을 강화하는 방법을 소개해 볼까 합니다.

  1. AWS Management Console 에서 좌측 상단에 있는 [Services] 를 선택하고 검색창에서 IAM를 검색하거나 [Security, Identity, & Compliance] 바로 밑에 있는 [IAM] 를 선택
  2. PoliciesCreate policyJSON → 아래의 JSON 블록 붙여넣기 → Review policy
  3. Name = mfa-user-manage-own-credential, Description = Allows MFA-Authenticated IAM Users to Manage Their Own Credentials on the My Security Credentials Page → Create policy
{
"Version": "2012-10-17",
"Statement": [
{
"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",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}

위의 IAM Policy를 간략히 정리한다면

  1. IAM User에게 자신의 계정정보는 볼수 있고, 비밀번호, Access Key, X.509 certificates, SSH public key, Git Credentials, MFA들을 설정할수 있는 권한을 부여한다
  2. 하지만 MFA인증이 되지 않았을 경우에는 MFA 설정을 할수 있는 권한만 부여한다

자 그럼 이제 해당 IAM 정책을 IAM 유저에게 부여하고 AWS Management Console 화면을 Refresh를 하고 IAM, EC2, RDS 기타 등등의 Dashboard 페이지로 이동하면 Permission Error가 뜨면서 아무것도 보이지 않을 것입니다. 왜냐하면 현재 MFA 인증이 되어 있지 않기때문에 기존에 부여 받았던 권한들도 모두 적용되지 않고 단지 자신의 계정에 대한 MFA 설정을 할수 있는 권한만 적용되어있기 때문입니다.

이제 IAM Dashboard에서 Users로 이동해 보겠습니다.

분명히 자신의 계정에 대한 MFA 설정이 가능해야 할텐데 아무것도 보이지 않습니다. 왜일까요? 해당 탭에서는 ListUsers 에 대한 권한을 요구하기 때문입니다. 음.. 그럼 어떻게 하죠?? URL 마지막 “/users” 뒤에 “/” + 현재 로그인한 username를 추가해줍니다

Security CredentialsAssinged MFA deviceManage로 이동후 MFA 설정을 참고해서 MFA을 설정해줍니다.

설정 완료후에 Logout 하고 다시 Login 하면 MFA Code를 프로세스가 추가되고, MFA를 입력후 로그인하면 기존에 부여됬던 모든 권한을 다시 정상적으로 작동하는 것을 볼수있습니다.

--

--