본문 바로가기
AWS/IAM

현업에서 꼭 필요한 AWS IAM MFA 강제 정책

by study4me 2024. 3. 11.
반응형

AWS IAM을 더 안전하게 사용하기 위해서 MFA를 설정하도록 권고한다.
현업에서 IAM 관리자는 사용자들에게 MFA를 설정하라고 가이드하지만 안듣는 사람들이 꼭 있다.
이를 방지하기 위해 MFA 설정을 하지 않을 경우 권한 막아버려 MFA를 등록할 수 밖에 없도록 구성할 수 있다.
이를 MFA 강제 정책이라 부르겠다.

 

 

1. MFA 제한 정책(ver. AWS 공식 문서)

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html
위 공식 문서를 보면 아래와 같은 정책을 사용하여 자신의 Credential을 관리하고 MFA 설정을 강제하도록 한다.
각 Statement에 대한 설명은 공식 문서를 참고하길 바란다.

##AWS공식문서에서제공하는정책예시{
  "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"
        }
      }
    }
  ]
}

 

 

2. MFA 제한 정책(ver. 현업)

공식 문서에서 알려준 예제는 현업에 맞지 않는 부분과 이상한 있어서 수정해주기로 한다.
수정 사항을 요약하면 다음과 같다.

  1. AllowViewAccountInfo에 iam:GetAccountSummary, ListAccountAliases 추가
    AWS IAM 대시보드에 들어갈 때 권한 에러가 뜨는 부분을 해결해주었다. 일반 사용자에게 노출되어도 상관없는 정보라 두 권한을 추가해주었다.

  2. AllowManageOwnVirtualMFADevice에 iam:DeleteVirtualMFADevice 추가 및 resource를 arn:aws:iam::*:mfa/${aws:username}로 변경
    MFA Device를 생성할 때, 자신의 username으로만 생성 가능하도록 구성하였다.

  3. DenyAllExceptListedIfNoMFA에 "iam:ChangePassword", "iam:GetAccountPasswordPolicy" 추가
    MFA 설정을 하지 않더라도 비밀번호를 변경할 수 있도록 Deny All에서 예외처리해주었다.
    최초 IAM User 로그인 시 비밀번호를 변경하도록 설정할 수 있는데, 이때 MFA 등록 전이라 비밀번호를 정상적으로 변경하기 위해서는 Deny All에서 예외처리해줘야한다.

  4. 기타 sid 생성(GetLoginProfile/arn:aws:iam::*:user/${aws:username})
    자신의 Login Profile을 확인할 수 있도록 추가해주었다.

  5. DenyAllExceptListedIfNoMFA에서 "iam:GetMFADevice" 제거
    iam:GetMFADevice가 굳이 Deny All 예외처리에 들어가 있을 필요가 없다고 생각하여 제거해줬다.

  6. 프로젝트 요건에 맞게 Key 사용 여부를 파악하고, AllowManageOwnAccessKeys/AllowManageOwnSigningCertificates/AllowManageOwnSSHPublicKeys/AllowManageOwnGitCredentials 중 필요한 Statement만 추가
    지금까지 들어간 프로젝트에서는 주로 AllowManageOwnAccessKeys가 필요했고, 가끔씩 AllowManageOwnGitCredentials도 필요했다. 다른 Key는 사용한적 없다. 최소 권한 부여 원칙을 만족시키기 위해 각 프로젝트에서 무엇을 필요로하는지 파악하고 필요한 부분만 넣는 것이 좋다.
    우선은 각 Statement를 다 넣어주긴했다.

 

 

## 현업에 맞게 수정
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowViewAccountInfo",
      "Effect": "Allow",
      "Action": [
        "iam:GetAccountPasswordPolicy",
        "iam:ListVirtualMFADevices",
        "iam:GetAccountSummary",
        "iam:ListAccountAliases"
      ],
      "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",
        "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": "etc",
      "Effect": "Allow",
      "Action": [
        "iam:GetLoginProfile"
      ],
      "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",
        "iam:ChangePassword",
        "iam:GetAccountPasswordPolicy"
      ],
      "Resource": "*",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

 

 

 

오늘은 여기까지

반응형

'AWS > IAM' 카테고리의 다른 글

AWS IAM 유효 기간 제한 정책  (0) 2024.10.07
AWS IAM Region 제한 정책  (0) 2024.03.11
현업에서 사용하는 AWS IAM IP 제한 정책  (0) 2024.03.11