[AWS] MFA 미설정 IAM User(ConsoleAccess)에 서비스 접근 차단 방안

AWS는 계정 정보를 안전하게 유지하고 불법 접근으로부터 보호하기 위한 다양한 도구와 기능을 제공합니다.

AWS 자체는 매우 안전한 플랫폼입니다! 

그러나 불행히도, 많은 보안 문제는 사용자의 실수 또는 불완전한 보안 설정으로 인해 발생하곤 합니다. 

예를 들어, 강력한 비밀번호를 사용하지 않거나, 다중 요소 인증(MFA)을 설정하지 않는 경우, 해킹에 더 쉽게 노출될 수 있고 탈취될 수 있습니다.

강력한 비밀번호를 설정을 해도 최근 이슈화되고 있는 Web Browser 해킹 등의 이슈로 MFA 기능이 있는 플랫폼이라면 반드시 설정해야 합니다.

해킹된 MFA미설정 IAM User 계정이 특정 AWS 서비스 또는 전체 AdministratorAccess 권한이 매핑되었다고 하면 생각만해도 아찔합니다.

그렇다면, 기존 IAM User 사용자에 대해서 MFA 미설정 시 서비스의 권한 자체를 비활성화 시키는 다소 현실적인 방안을 고려해볼 수 있습니다.


MFA 설정 강제화를 위한 사용자 가이드

IAM User 계정을 소유한 기존/신규 사용자에게 사전에 MFA 설정 가이드를 전달해주면 좋을 것 같습니다.

(MFA 설정을 하지 않은 사용자는 권한이 있다하더라도 서비스를 사용할 수 없음을 함께 공지해주는 것입니다.)

Identity and Access Management (IAM)

IAM > Policies > Create Policy

: 위 카테고리로 접근한 후 새로운 인라인 정책을 생성하여줍니다.

Name: policy-iam-user-duty

Specify permissions:

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

– MFA가 존재하지 않을 경우에는 각각의 서비스의 Full access 를 사용할 수 없게 됩니다.

– 불필요하겠지만, Add tags까지 작성해주고 Create policy를 클릭한 후 정책생성을 완료합니다.

IAM > Users > Permissions > add permissions

위와 같이 특정 IAM User 사용자 계정에 대해서, Permissions에 위에서 생성한 In-line Policy를 추가해줍니다.

테스트를 위해서 아래와 같은 절차로 테스트를 진행합니다.

  1. IAM User 사용자에 대한 MFA 제거
  2. IAM Policy 추가(policy-iam-user-duty)
  3. IAM User Console 새로고침

검증 결과

위 테스트 시 아래와 같이 API오류가 발생된 것을 확인하였습니다. 정책 반영 후 거의 즉시 서비스 권한을 비활성화시켰던 것을 확인하였습니다.

AWS 관리자 및 사용자 적용 순서

관리자

  1. IAM User 사용자 생성
  2. IAM User 사용자에 Console Access 권한 부여
    – 임의 패스워드 설정
    – 다음에 패스워드 변경 옵션 제거
  3. IAM User 사용자에 대한 IAM Policy 할당
  4. IAM 사용자에 대한 MFA 셋팅 관련 가이드 문서 전달(신규/기존 사용자 가이드)

사용자(신규)

  1. IAM User 콘솔 접속
  2. 대시보드 우측 상단 > 보안자격증명 > 콘솔 암호 업데이트
  3. 대시보드 우측 상단 > 보안자격증명 > 멀티 팩터 인증(MFA) > MFA 디바이스 할당 적용
  4. 모두 완료 후 로그아웃
  5. IAM User Console 접속 시 MFA 인증 후 IAM User에 할당된 정책에 따른 서비스 사용 가능

사용자(기존)

  1. IAM User 콘솔 접속
  2. 대시보드 우측 상단 > 보안자격증명 > 멀티 팩터 인증(MFA) > MFA 디바이스 할당 적용
  3. 모두 완료 후 로그아웃
  4. IAM User Console 접속 시 MFA 인증 후 IAM User에 할당된 정책에 따른 서비스 사용 가능
보안사고는 누구에게 어떻게 다가올 지 모르는 사이버 재난입니다. 우리의 비즈니스와 직결되는 중대한 이슈이죠.
AWS SSO를 통해 보안설정을 일원화하여 중앙집권화하는 것이 가장 바람직합니다. 
하지만, 그렇지 못한 조직에서는 위와 같이 모든 IAM User 콘솔 사용자들에게 인라인 정책을 적용하여 강제 MFA를 설정할 수 있도록 독려합시다!

5 1 vote
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x